- ベストアンサー
Excel2003 VBAで動作が速くなるようにマクロ記述する方法
- Excel2003でVBAを使用してマクロを記述し、動作を高速化する方法について教えてください。
- 現在、Excel2003でVBAを使用してマクロを作成していますが、動作が遅くなってしまいます。どのようにすれば動作を速くすることができるでしょうか?
- Excel2003のVBAマクロを最適化して高速化する方法について教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
forで回さなければいないのですか。 単に領域のコピペに見えますが。 それでいいなら,下記でどうですか,ずっと速いですよ。 なお,R1C1形式にそろえました。 Sub CommandButton1_Click1() Dim i, i0 Dim n, sh1, sh2 Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("Sheet2") With sh1 .Cells(1, 6).Value = .Cells(1, 6).Value + 1 n = .Cells(1, 6).Value Application.ScreenUpdating = False i0 = 1 i = 300 Range(.Cells(i0, 1), .Cells(i, 1)).Copy sh2.Cells(i0, n).PasteSpecial Paste:=xlValues Application.ScreenUpdating = True End With End Sub
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
Sub CommandButton1_Click1() Dim N As Long N = Worksheets("Sheet1").Range("F1").Value + 1 Worksheets("Sheet1").Range("F1").Value = N Worksheets("Sheet2").Cells(1, N).Resize(300).Value = _ Worksheets("Sheet1").Cells(1, 1).Resize(300).Value End Sub 必要に応じて、これで挟む必要があるかもしれませんが、それは結果をみて決めればよいと思います。 Application.Calculation = xlManual ・ ・ Application.Calculation = xlAutomatic Application.ScreenUpdating = False は、シートの上をループして動かなければ不要ですが、試してみてから決めてください。
お礼
.Valueでコピーする方法もあるのですね。 早いですね! 大変参考になりました。 ありがとうございましたm(__)m
- hananoppo
- ベストアンサー率46% (109/235)
これでいいのでは? Private Sub CommandButton1_Click() Dim n As Integer Application.ScreenUpdating = False n = Worksheets("Sheet1").Range("F1").Value + 1 Worksheets("Sheet1").Range("F1").Value = n Worksheets("Sheet1").Range("A1:A300").Copy Worksheets("Sheet2").Cells(1, n).PasteSpecial Paste:=xlValues Application.CutCopyMode = False Application.ScreenUpdating = True End Sub
お礼
一瞬で結果表示されます!! マクロの記述の仕方で全く処理スピードが変わるもんなんですね。 ビックリしました。 ありがとうございました。
- conanthe
- ベストアンサー率65% (114/175)
こんにちは。ハンドルネームconantheです。 おそらくシートに変更が加えられるたびに再計算が行われるので遅くなっていると思われます。プロシージャの最初と最後に、次のコマンドを入れてみてください。最初のコマンドで再計算をオフにし、最後のコマンドでオンにします。 Sub CommandButton1_Click1() Application.Calculation = xlManual ・ ・ ・ Application.Calculation = xlAutomatic End Sub
お礼
自動再計算の停止&再開というコマンドもあるのですね。 参考になりました。 ありがとうございましたm(__)m
- bin-chan
- ベストアンサー率33% (1403/4213)
#1ですが、申し上げたかったのは以下の2点。 1)For文中のScreenUpdatingの設定をFor文外で行う。 2)代入式の見直し 2)はともかく、1)は変更必須です。
お礼
For文中のScreenUpdatingの設定をFor文外で行うだけで全然処理スピードが違いますね。 これは一つ勉強になりました。 ありがとうございましたm(__)m
- bin-chan
- ベストアンサー率33% (1403/4213)
Application.ScreenUpdating = False For I = 1 To 300 Worksheets("sheet2").Cells(I, N).value = Worksheets("sheet1").Value Next Application.ScreenUpdating = True でどうなります?
お礼
仰るとおりForで回す必要性を考えたところ入りませんでした。 ホントに早いですね。 一瞬で結果表示されます。 拡張性も高そうなマクロなので大変勉強になりました。 ありがとうございました。