[[20181108165837]] 『マクロの記録で書いたら処理が遅いです』(みやちゃん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロの記録で書いたら処理が遅いです』(みやちゃん)

こんにちわ。よろしくお願いします。

飛び飛びのセルを300か所複数選択+コピーし(規則性あり)
位置情報はそのままに別のセルへ飛び飛びにペーストしたいのですが
飛び飛びの間のセルには計算式が含まれている為に
300行を塊でコピー&ペーストはできない状態です。

そこでマクロの記録をつかって以下のような
コードが吐き出されたのですが
いざ実行すると長くて長くて、、、
処理に時間がかかりすぎているので
なにかいい方法ないでしょうか?

    Range("BC2:BE2").Select
    Selection.Copy
    Range("C2:E2").Select
    ActiveSheet.Paste
    Range("BC12:BE12").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("C12:E12").Select
    ActiveSheet.Paste
    Range("BC22:BE22").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("C22:E22").Select
    ActiveSheet.Paste
    Range("BC32:BE32").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("C32:E32").Select
    ActiveSheet.Paste
    Range("BC42:BE42").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("C42:E42").Select
    ActiveSheet.Paste

実際はこれを300回ほどくりかえしています。

できれば、シートもじゅーるに記載する Private Sub Worksheet_SelectionChange(ByVal Target As Range)ではなく
標準モジュールに記載するような形で
ファイルを開くときにauto_closeの際にcallで呼び出す感じをイメージしています。

< 使用 Excel:Excel2016、使用 OS:Windows8 >


処理前に Application.ScreenUpdating = False にして、念のため最後に True に戻すよう記述追加すれば、速くなるでしょう。

あと、自動記録ではいちいちSelectが記録されますが、これを省くと少し速くなりますよ。

    Range("BC2:BE2").Select
    Selection.Copy
    Range("C2:E2").Select
    ActiveSheet.Paste

    ↓

    Range("BC2:BE2").Copy Range("C2:E2")
(???) 2018/11/08(木) 17:28

なんか、10行毎にBC:BE列の値を、同じ行のC:E列に貼るだけなら、全部まとめてループするように書けそう。
 Sub test()
    Dim i As Long

    Application.ScreenUpdating = False
    For i = 2 To Cells(Rows.Count, "BC").End(xlUp).Row Step 10
        Range(Cells(i, "BC"), Cells(i, "BE")).Copy Cells(i, "C")
    Next i
    Application.ScreenUpdating = True
 End Sub
(???) 2018/11/08(木) 17:43

う〜ん。何とかいっぺんに書き込む方法はないかな〜とおもって考えてみましたけど思いつかないですね。

???さんと同じ発想(For〜Nextステートメントによるループ処理)ですが

    Sub てすと()
        Dim MyRNG As Range, i As Long

        Set MyRNG = Range("BC2:BE2")

        For i = 0 To 300 Step 1
            MyRNG.Offset(i * 10).Copy MyRNG.Offset(i * 10, -52)
        Next

    End Sub

みたいに、一定間隔ならOffsetを使うのもありかな〜と思います。

また、上記の例示も300回セルに書き込みが発生するから、「Application.ScreenUpdating」の効果はあるとおもうんですけど、一応どういうことをしているのかだけは自主補習しておいてください。

以前、”おまじない”と称して意味が分からないまま使っている方がいらっしゃいました。
そういうことを続けていると、もっと複雑な処理を組んだ時に重大なバグを見落とすことにつながることが懸念されるので個人的には、安定動作が確認されるまでは、記述しない(コメントアウトさせておく)ことをおすすめします。

(もこな2) 2018/11/09(金) 01:15


???さん もこなさんありがとうございました。

もこなさんの
MyRNG.Offset(i * 10).Copy MyRNG.Offset(i * 10, -52)
でストップがかかってしまった(T_T)のですが
???さんのだとすんなりいきました^^

おふたかた、ありがとうございました。
もっと勉強します

(みやちゃん) 2018/11/09(金) 15:01


???さんのコードにて、
もこなさんの
For i = 0 To 300 Step 1
を入れるにはどこにどういれればよいのでしょうか??

(みやちゃん) 2018/11/09(金) 16:22


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.