こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ExcelのVBAの配列に関する質問です。

ExcelのVBAの配列に関する質問です。
sheet1のデータをsheet2に表示するVBAを作成しています。。
sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。
sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。


Sub test1()

Dim endrow As Long
endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row

Dim i As Long
Dim j As Long

For i = 7 To endrow
j = i + 19
Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2)
Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28)
Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31)
Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32)


・ ※長いので省略
Next i

End Sub


上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。
高速化できないかと、以下のように変更しました。

Sub test2()

Dim dataRange1 As Variant
Dim dataRange2 As Variant
dataRange1 = Worksheets("sheet1").Range("A1:GI10006")
dataRange2 = Worksheets("sheet2").Range("A1:DZ10018")

Dim endrow As Long
endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row

Dim i As Long
Dim j As Long

For i = 7 To endrow
j = i + 19
dataRange2(j, 1) = dataRange1(i, 2)
dataRange2(j, 8) = dataRange1(i, 28)
dataRange2(j, 9) = dataRange1(i, 31)
dataRange2(j, 10) = dataRange1(i, 32)


・ ※長いので省略
Next i

End Sub


test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。

ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。

Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2)
Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28)
Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31)
Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32)


test2は、どこが間違っているのでしょうか?
ご教示ください。
よろしくお願いいたします。

投稿日時 - 2010-08-04 18:01:19

QNo.6086822

すぐに回答ほしいです

質問者が選んだベストアンサー

>test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。
>test2は、どこが間違っているのでしょうか?

最後に結果配列をSheet2へ戻してやらないといけないのでは?


 Worksheets("Sheet2").Range("A1:DZ10018").Value = dataRange2

 
以上です。
 

 

投稿日時 - 2010-08-04 21:11:32

お礼

ありがとうございました。
肝心なことが抜けていたんですね。
おかげさまで、うまく表示されるようになりました。
1分30秒⇒10秒へ大幅スピードアップできました。
お世話になりました。

投稿日時 - 2010-08-05 09:17:35

ANo.1

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

For i = 7 To endrow ←これは縦でしょう。縦と横はどちらが長いと言ったら、やっぱり縦では? それも、どんなに長くても、間断なく一列しかないはずです。それを一括して写せばよいのではないでしょうか?

だから、「 For i = 7 To endrow」って、意味がないと思うのです。
ループは、飛び飛びでも、行でなく、列方向だと思います。

Test2 は、発想そのものは同じものだから、速くはなっても、対して変わらないような気がしますね。

'//
Sub TestValueCopy()
 Dim Ar As Variant, Ar2 As Variant
 Dim i As Long, m As Long
 Dim Sh1 As Worksheet, Sh2 As Worksheet
 Set Sh1 = Worksheets("Sheet1")
 Set Sh2 = Worksheets("Sheet2")
 
 'ここに列番号を書き加える
 Ar = Array(2, 28, 31, 32)
 Ar2 = Array(1, 8, 9, 10)
 
 m = Sh1.Range("A7", Sh1.Cells(Rows.Count, 1).End(xlUp)).Rows.Count
 Application.ScreenUpdating = False
 For i = 0 To UBound(Ar)
  Sh2.Cells(26, Ar2(i)).Resize(m).Value = Sh1.Cells(7, Ar(i)).Resize(m).Value
 Next i
 Application.ScreenUpdating = True
 Set Sh1 = Nothing
 Set Sh2 = Nothing
End Sub

投稿日時 - 2010-08-05 03:40:28

お礼

ご丁寧にありがとうございました。
両シートとも200列近くデータがあるので、大幅な改修は時間的に難しいようです。
機会があれば、試してみます。
お世話になりました。

投稿日時 - 2010-08-05 09:22:50

あなたにオススメの質問