回答受付が終了しました

Excel VBAで、このようなコードに配列を使ったら速く処理ができるようになるのでしょうか?

Visual Basic | Excel91閲覧

回答(5件)

0

配列が早いのではなく下記の部分のステップ数が多いため繰り返し回数が多いと処理時間に顕著な差が出てきてしまうと思ってください。 基本的に「各配列への要素処理>セルへの一括書き込み」と「各セルへのアクセス>各セルへの書き込み」の繰り返し処理の処理時間比は記述方法によりますが100倍ぐらいの差があると考えてください。 1.セルに対する動作がアドレス確定のためにの内部のステップ数が多い 2.セルへの値挿入の動作の内部のステップ数が多い <セルへのアクセス> If Cells(i1, i2) > 1 Then Sheets(2).Cells(i1, i2) = Cells(i1, i2) End If <配列へのアクセス> If aCells(i1,i2) > 1 Then aSheets2Cells(i1,i2) =aCells(i1,i2) End If Sheets(2).cells(1,1).resize(10000,100) = aCells

<表現の修正です> 配列が早いのではなく下記の部分の<内部処理ステップ数>が多いため繰り返し回数が多いと処理時間に顕著な差が出てきてしまうと思ってください。基本的に「各配列への要素処理>セルへの一括書き込み」と「各セルへのアクセス>各セルへの書き込み」の繰り返し処理の処理時間比は記述方法によりますが100倍ぐらいの差があると考えてください。 1.セルに対する動作がアドレス確定のためにの内部のステップ数が多い 2.セルへの値挿入の動作の内部のステップ数が多い <セルへのアクセス> If Cells(i1, i2) > 1 Then Sheets(2).Cells(i1, i2) = Cells(i1, i2) End If

0

Sub a() '私はこんな感じで作成してみました。ご参考にどうぞ Dim myData As Variant Dim r As Long Dim c As Long Dim i As Long Dim j As Long Application.ScreenUpdating = False With Worksheets(1) myData = Range(.Cells(1, 1), .Cells(10000, 100)) End With r = UBound(myData, 1) '1次元目 c = UBound(myData, 2) '2次元目 For i = 1 To r '行方向 For j = 1 To c '列方向 If myData(i, j) > 1 Then 'スキップ Else myData(i, j) = "" End If Next j Next i With Worksheets(2) .Range(.Cells(1, 1), .Cells(r, c)) = myData End With Application.ScreenUpdating = True End Sub

0

配列を使ったバージョンのコード Sub sample() Dim sh2 As Worksheet, xAry1, xAry2 Dim i1 As Long, i2 As Long Application.ScreenUpdating = False Set sh2 = Worksheets(2) With Range("A1").Resize(10000, 100) xAry1 = .Cells xAry2 = sh2.Range(.Address).Value For i1 = LBound(xAry1, 1) To UBound(xAry1, 1) For i2 = LBound(xAry1, 2) To UBound(xAry1, 2) If xAry1(i1, i2) > 1 Then xAry2(i1, i2) = xAry1(i1, i2) Next i2 Next i1 sh2.Range(.Address).Value = xAry2 End With Application.ScreenUpdating = True End Sub

>配列を使ったら速く処理ができるようになるのでしょうか? 上記のプログラムは、相当速くなるはず。 If Cells(i1, i2) > 1 Thenの条件を満たすデータが多ければ多いほど、速度の差が実感できるはず。 >高速化ができるなら配列を勉強しようかと思っています。 高速化のために配列はあるのではないですけどね。 いろいろ使えることが多いです。 VBAに限らず、プログラミングの基礎テクニックなので、知っておくべき。

0

質問のプログラムを配列仕様にした場合です。 Sub sample() Dim s As Variant Dim s2 As Variant s = Range(Cells(1, 1), Cells(10000, 100)).Value s2 = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(10000, 100)).Value Dim i1 As Long Dim i2 As Long For i1 = 1 To 10000 For i2 = 1 To 100 If s(i1, i2) > 1 Then s2(i1, i2) = s(i1, i2) End If Next i2 Next i1 Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(10000, 100)) = s2 End Sub

0

'セル版 Sub create_random_sheet_cell() Dim startTime As Double Dim endTime As Double Dim processTime As Double '開始時間取得 startTime = Timer Dim target_row As Long Dim target_col As Long For target_row = 1 To ROW For target_col = 1 To COLUMN Cells(target_row, target_col).Value = Rnd Next target_col Next target_row '終了時間取得 endTime = Timer '処理時間表示 processTime = endTime - startTime MsgBox "処理時間:" & processTime End Sub

'配列版 Sub create_random_sheet_array() Dim startTime As Double Dim endTime As Double Dim processTime As Double ActiveSheet.Cells.Clear '開始時間取得 startTime = Timer Dim data(ROW, COLUMN) As Variant Dim target_row As Long Dim target_col As Long