
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件)
- 最新から表示
- 回答順に表示
No.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様も挙げておられる)「画面の更新を停止する」、「シートの再計算を停止する」などがありますが、それらの他に時間がかかるのが「セル値の読み書き」であることが知られています。
処理手順を見直したりコードの記述方法によって、シートへのアクセス回数を減らす工夫は可能なはずですので、多くの場合はこの部分の工夫で速度向上を図れる可能性があります。
No.2
- 回答日時:
こんばんは
>とっても遅いです。
「遅い」と言うのがどの程度なのかわかりませんけれど・・
ご提示のコードは、確かに無駄はありますがそれが原因で遅いとも思えません。
内容的にも1列のコピーだけなので、さほど時間がかかるとも思えませんし。
想像するところ、指定したファイルを開くのに時間がかかっているのではないでしょうか?
(指定ファイルそのものが重ければ、開くのにも時間がかかります)
手動で開いた時に比べて、更に時間がかかるということでしょうか?
通常は、ファイルを開くのに要する時間は、VBAでも手動でも変わらないはずです。
もしもここで時間がかかっているとするなら、記述方法を変えたところでいかんともし難いです。
対象方法としては「ファイルを軽くしておく」ことくらいかと思います。
とは言え、多少なりとも速くするなら、「Activate」や「Select」を用いない記述にすることで、ブックやシートの切り替えを行わずに済むようになります。
これの効果は、画面のチラつきが無くなることの方が大きいと思いますけれど・・
細かなところはいろいろあるかも知れませんが、上記以外の部分で記述方法を変えても、ご提示の処理内容であればはほとんど速度に差はないと思われます。
ありがとうございます:)
実はコピペは1列だけでなく、いくつか抜粋して何度かコピペをしたいと思っております。"「Activate」や「Select」を用いない記述”も調べてみます。
ただfujillinさんの仰るようにファイルが開くのに時間がかかるのも困っています。上記のように選択したファイルを開かずコピペはできるのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) エクセル VBAでシートのコピーを作りたい 1 2023/05/18 07:42
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) Excel VBA マクロ シート名を変えずにA列にあるセル名の名前でファイルの分割をしたいです 3 2024/02/05 22:10
- Visual Basic(VBA) 【VBA】カーソルのある行の1行目のセルをコピペし,最後にそのセルに戻る方法 3 2024/01/26 16:48
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
このQ&Aを見た人はこんなQ&Aも見ています
-
WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】
Excel(エクセル)
-
別ブックをダイアログボックスで指定してそこにあるシートをコピーしたい
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
5
VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。
Visual Basic(VBA)
-
6
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
7
参照先のブックを開かずに内容をコピーしたい
Excel(エクセル)
-
8
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
9
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
-
10
VBAで複数のブックを開かずに処理する方法
Visual Basic(VBA)
-
11
保存ブックを開かずコピーペーストするマクロ作成について
Excel(エクセル)
-
12
VBA シートをコピーする際に Copyメソッドは失敗しましたのエラーが出てしまいます
Visual Basic(VBA)
-
13
マクロで最終行を取得してコピーしたい
Visual Basic(VBA)
-
14
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
15
VBA 別ブックから条件に合うものを転記したいです
Visual Basic(VBA)
-
16
EXCELのVBAでシートコピーをしたとき元のマクロを削除するには?
Excel(エクセル)
-
17
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
18
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
19
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
20
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
エクセルVBAが途中で止まります
-
VBA 別ブックからコピペしたい...
-
ワイルドカード「*」を使うとう...
-
VBAで別ブックのシートを指定し...
-
VBA 実行時エラー 2147024893
-
VBA コードを実行すると画面が...
-
VBAで別のブックにシートをコピ...
-
【Excel VBA】書き込み先ブック...
-
vbaでvbaProjectのパスワード解...
-
【ExcelVBA】zip圧縮されたCSV...
-
Excelマクロ 該当する値の行番...
-
【前回の続きです、ご教示くだ...
-
[Excel]ADODBでNull変換されて...
-
フォルダ内の全てのファイルに...
-
ACCESSVBA からExcelの他ブック...
-
【マクロ】アクティブセルにブ...
-
VBAで複数のブックを開かずに処...
-
Excelブックがアクティブになっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
VBA 別ブックからコピペしたい...
-
エクセルVBAが途中で止まります
-
ワイルドカード「*」を使うとう...
-
VBA コードを実行すると画面が...
-
VBAで別のブックにシートをコピ...
-
VBAで別ブックのシートを指定し...
-
【Excel VBA】書き込み先ブック...
-
Excelマクロ 該当する値の行番...
-
【ExcelVBA】zip圧縮されたCSV...
-
[Excel]ADODBでNull変換されて...
-
【ExcelVBA】インデックスが有...
-
Excel2007VBAファイルの表示に...
-
VBAで複数のブックを開かずに処...
-
vbaで他のブックに転記したい。...
-
エクセルマクロで、他ブックか...
-
vbaでvbaProjectのパスワード解...
-
VBA 実行時エラー 2147024893
-
【マクロ】違うフォルダにある...
おすすめ情報