プロが教える店舗&オフィスのセキュリティ対策術

VBAかなり初心者です。
シンプルなVBAのフォーマットを作成してみましたが、とっても遅いです。
色々調べたものの、自分でやりたいことが軽いコードでできませんでした…。

1.別のブックは毎回ブックネームが異なるため、ファイルから選択する形式を希望
(今回はREPORT.xlsxのFinal Dataシートより)
2.そのブックの列ごとコピーして、このVBAが入っているブック(Book1.xlsm)のDataシートに貼付けをしたい

*************************************************************************
Sub Sample2()
'別ブックを開く
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If OpenFileName <> "False" Then
Workbooks.Open OpenFileName
End If

'データをコピー 上記で選択して開いた別ブック
Windows("REPORT.xlsx").Activate
a = Sheets("FinalData").Select
Columns("A:A").Select
Application.CutCopyMode = False
Selection.Copy

'データをペースト
Windows("Book1.xlsm").Activate
Sheets("Data").Select
Columns("A:A").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Application.CutCopyMode = False
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

End Sub
************************************************************************
いくつか速くできるようなQ&AのWEBページがあったのですが、なかなかうまく回りませんでした…。
コードを教えていただけると大変助かります。
何卒よろしくお願いいたします。

A 回答 (3件)

No2です。



>ファイルが開くのに時間がかかるのも困っています。
>上記のように選択したファイルを開かずコピペはできるのでしょうか。
1セルだけを読むのなら別の速い方法がないことはないですが、複数セルが対象となる場合には、これを繰り返すよりもファイルを開いて読む方が結果的に速くなります。
ですので、多くのセル値を扱う場合には、「ファイルを開く」時間に関してはコードの工夫などでは対応できない部分ということになります。
No2にも書きましたように、せいぜいの工夫として、ファイルを分割するなどで軽くしておくくらいでしょうか。
あるいは、性能の高いPCを利用することで、速度の向上を期待することはできます。


>実はコピペは1列だけでなく、いくつか抜粋して何度か
>コピペをしたいと思っております。
同じ処理を繰り返す場合は、1回の処理を効率的に行うことで、全体としての速度向上が期待できます。
ご提示の1回分の「値をペースト」を例にすれば、(No2にも書きましたが)Activate、Selectをやめて、さらにはクリップボードを介する方法もやめ、値を直接転記するようにすれば若干ながら速くできます。
繰り返しが多い場合には、「若干×回数分」になるので、効果があります。

具体的には(記述方法はいろいろありますが)、
 Windows("Book1.xlsm").Sheets("Data").Columns(1).Value = _
   Windows("REPORT.xlsx").Sheets("FinalData").Columns(1).Value
などとすることで、「値をペースト」と同様の結果を1文で得られます。
セル数が少ない場合は、1列全体ではなく範囲を限った方が速いかも知れません。
(↑については、確認していませんので確実ではありませんけれど・・)


一般的に、処理を速くする方法として挙げられているのは、(No1様も挙げておられる)「画面の更新を停止する」、「シートの再計算を停止する」などがありますが、それらの他に時間がかかるのが「セル値の読み書き」であることが知られています。
処理手順を見直したりコードの記述方法によって、シートへのアクセス回数を減らす工夫は可能なはずですので、多くの場合はこの部分の工夫で速度向上を図れる可能性があります。
    • good
    • 0

こんばんは



>とっても遅いです。
「遅い」と言うのがどの程度なのかわかりませんけれど・・
ご提示のコードは、確かに無駄はありますがそれが原因で遅いとも思えません。
内容的にも1列のコピーだけなので、さほど時間がかかるとも思えませんし。

想像するところ、指定したファイルを開くのに時間がかかっているのではないでしょうか?
(指定ファイルそのものが重ければ、開くのにも時間がかかります)
手動で開いた時に比べて、更に時間がかかるということでしょうか?
通常は、ファイルを開くのに要する時間は、VBAでも手動でも変わらないはずです。
もしもここで時間がかかっているとするなら、記述方法を変えたところでいかんともし難いです。
対象方法としては「ファイルを軽くしておく」ことくらいかと思います。


とは言え、多少なりとも速くするなら、「Activate」や「Select」を用いない記述にすることで、ブックやシートの切り替えを行わずに済むようになります。
これの効果は、画面のチラつきが無くなることの方が大きいと思いますけれど・・
細かなところはいろいろあるかも知れませんが、上記以外の部分で記述方法を変えても、ご提示の処理内容であればはほとんど速度に差はないと思われます。
    • good
    • 1
この回答へのお礼

ありがとうございます:)
実はコピペは1列だけでなく、いくつか抜粋して何度かコピペをしたいと思っております。"「Activate」や「Select」を用いない記述”も調べてみます。
ただfujillinさんの仰るようにファイルが開くのに時間がかかるのも困っています。上記のように選択したファイルを開かずコピペはできるのでしょうか。

お礼日時:2024/02/27 10:21

ApplicationオブジェクトのScreenUpdatingプロパティにFalseを指定しましょう

    • good
    • 0
この回答へのお礼

ありがとうございます。試してみたいと思います!

お礼日時:2024/02/27 10:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A