• ベストアンサー

VBA処理速度の向上(配列?)

いつもお世話になっております。 エクセルVBA勉強中の初心者です。 書籍などを参考に、下記コードを作成し、セル内データを計算しています。 セル数が少ない場合には良かったのですが、将来的には、 約30,000行×100列程度になる予定で、処理に時間がかかってしまっています。 (現状で10,000行×50列程度、データは増えていきます。) 過去ログ、HPなどを調べると、配列に入れれば、処理速度が格段に上がると あったのですが、如何せん私には難しく、理解できませんでした・・・ 配列に限らず、処理速度が上がる方法をご教授、添削頂ければ助かります。 よろしくお願いいたします。 Sub test() Dim Gyo As Long, Retu As Long For Gyo = 3 To Range("A65536").End(xlUp).Row For Retu = 1 To Range("D3").End(xlToRight).Column Cells(Gyo, Retu).Value = Cells(Gyo, Retu).Value / 1000000 Next Retu Next Gyo End Sub

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

  • ベストアンサー
回答No.5

配列処理は高速化する上で、避けられないでしょう。 下記のコードを確かめてみてください。 Sub test()  Dim Gyo As Long, Retu As Long  Dim AllCells As Variant  ' ---変数にセル範囲を取り込む  AllCells = Range(Cells(3, 1), _   Cells(Range("A65536").End(xlUp).Row, _      Range("D3").End(xlToRight).Column))  ' ---何らかの処理  For Gyo = 1 To UBound(AllCells, 1)    For Retu = 1 To UBound(AllCells, 2)      AllCells(Gyo, Retu) = AllCells(Gyo, Retu) / 1000000    Next Retu  Next Gyo  ' ---セル範囲に一気に書き戻す  Range(Cells(3, 1), _    Cells(Range("A65536").End(xlUp).Row, _       Range("D3").End(xlToRight).Column)) = AllCells End Sub あと下記のコードも追加するともっと速くなります。   Application.ScreenUpdating = False お試しください。

haru2026
質問者

お礼

taiga_no_1様 こんばんは。知りたかった配列処理のコードを記述していただき、誠にありがとうございました! このように書くのですね。確かに処理も速くいろいろな場面で応用が出来そうです。 内容をじっくり解読し、マスターできるように頑張ります! ありがとうございました!

その他の回答 (4)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.4

コーディング方法以外にも高速化の手段があるのでご紹介いたします。 Excelのプロパティを操作することで実現できます。 共通していえることですが、必ず解除してから終わってください、画面が真っ白のままになったりします。もし解除できずに終わってしまいましたら、あわてず解除専用マクロを組んで解除してください。 1.表示の更新を自動で行わないようにする。 Application.ScreenUpdating = false 処理 Application.ScreenUpdating = true 2.セル内の計算を自動で行わないようにする。 Application.Calculation = xlCalculationManual 処理 Application.Calculation = xlCalculationAutomatic 3.イベント発生の抑止 Application.EnableEvents = False 処理 Application.EnableEvents = true お勧めは1と2を組み合わせて使うと速度が大幅に改善されます。 当初のマクロに組み込んで試してみてください、違いが実感できると思います。 Application.ScreenUpdating = false Application.Calculation = xlCalculationManual 処理 Application.ScreenUpdating = true Application.Calculation = xlCalculationAutomatic

haru2026
質問者

お礼

AKARI0418様 こんばんは。ご回答ありがとうございます! 確かに処理速度が上がりました!いろいろな場面で応用できそうです。 ありがとうございました!

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

配列じゃないですが、きっと早いと思います。 Sub test01() Dim Gyo As Long, Retu As Long Gyo = Range("A65536").End(xlUp).Row Retu = Range("D3").End(xlToRight).Column Cells(1, 1).SpecialCells(xlLastCell).Offset(1).Value = 1000000 Cells(1, 1).SpecialCells(xlLastCell).Copy Range(Cells(3, 1), Cells(Gyo, Retu)).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlDivide Cells(1, 1).SpecialCells(xlLastCell).Clear Application.CutCopyMode = False End Sub

haru2026
質問者

お礼

merlionXX様 こんばんは。ご回答ありがとうございます。 先ほど、試してみました。一瞬ですね!! 全体に対して処理する方法もあるのですね。いろいろと勉強になります! 誠にありがとうございました!

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.2

こんにちは。 セルのデータを 1000000 で割って、元のセルに書き込むのですよね。 それなら、余白のセルに 1000000 を入力してコピーし、 計算対象の範囲に形式を選択して貼り付け(除算)を実行し、 余白のセルの 1000000 をクリアしてみたら如何ですか? 計算対象の範囲の取得方法をどうするかですが、 ワークシート上のデータの内容が判りませんので サンプルでは、A3セルのアクティブセル領域を対象に書いています。 With ActiveSheet.Range("A3").CurrentRegion   With .Resize(1, 1).Offset(, .Columns.Count + 2)     .Value = 1000000     .Copy   End With   .PasteSpecial Paste:=xlValues, Operation:=xlDivide, _     SkipBlanks:=False, Transpose:=False   .Resize(1, 1).Offset(, .Columns.Count + 2).ClearContents   .Range("A1").Select End With

haru2026
質問者

お礼

OtenkiAme様 こんばんは。 コードの提示、ありがとうございました! 試したところ、かなり早く処理できました。 このような方法もあるのですね。。。勉強になります! 参考にして取り入れていきたいと思います!

  • diashun
  • ベストアンサー率38% (94/244)
回答No.1

ご提示のソースは何が目的かわかりませんが、VBAの処理速度を上げるということが目標なら、配列処理で行うことが避けられません。配列処理とは(私の理解するところでは)、変数の(大量の)値(情報)を主メモリーに格納するので、その情報のIn-Outが高速にできます。ぜひ、配列の勉強に挑戦してみてください。決っして思っているほど難しくはありません。 (私の知識が間違っていればスミマセン)

haru2026
質問者

お礼

diashun様 こんばんは。 早速のご回答、ありがとうございました。 『配列処理』頑張って勉強してみたいと思います! ただ、なかなか自分が思っている処理に応用できなくて・・・ 書籍、サイトを参考にしながらステップアップしたいと思います!

関連するQ&A

専門家に質問してみよう