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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
for 文の 繰り返し処理に使えるのかどうかについて
Visual Basic(VBA)
-
VBAのコードを教えてください
Visual Basic(VBA)
-
エクセルVBAの配列について
Visual Basic(VBA)
-
-
4
excelのVBAについて、以下のコードに追加をお願いいたします。
Visual Basic(VBA)
-
5
Cellsのコードが打てません
Visual Basic(VBA)
-
6
VBAコードが作動しません。修正したいのですが何処に原因かあるか教えて下さい。
Visual Basic(VBA)
-
7
近似した文字列を置換するエクセル関数またはVBAについて
Visual Basic(VBA)
-
8
ExcelのVBAコードについて教えてください。
Visual Basic(VBA)
-
9
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
-
10
VBEを開くのにコマンド名が「Visual Basic」な理由はなぜ?
Visual Basic(VBA)
-
11
Excel VBAでの数値の計算についておしえてください
Visual Basic(VBA)
-
12
VBA 二つのブックをうまく扱えないでいます
Visual Basic(VBA)
-
13
Excel VBA ダブルクリックで入力 複数まとめる
Visual Basic(VBA)
-
14
VBA コード
Visual Basic(VBA)
-
15
ExcelのVBAのことで質問です。 以下のコードを入れ、ボタンを押せば作動させると写真のように画面
Visual Basic(VBA)
-
16
ExcelVBAのFindFirstエラーについて
Visual Basic(VBA)
-
17
Excel VBA マクロ あるフォルダー内の複数のファイルを統合したいです
Visual Basic(VBA)
-
18
VBA ファイル名取得
Visual Basic(VBA)
-
19
Excel関数またはVBAでの質問になります
Visual Basic(VBA)
-
20
以下のコードを実行しても、オブジェクト変数または、withブロック変数が設定されていませんとエラーが
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA別ブックのシートをコ...
-
エクセルのマクロについて教え...
-
転記先VBA 一致しているセルが...
-
ExcelのVBAです。フォルダ内の...
-
【ExcelVBA】インデックスが有...
-
ワイルドカード「*」を使うとう...
-
エクセル vba ある検索値を別ブ...
-
VBA シートをコピーする際に Co...
-
VBAで別ブックのシートを指定し...
-
複数のエクセルファイルとシー...
-
VBS Bookを閉じるコード
-
vbaでvbaProjectのパスワード解...
-
VBAで複数のブックを開かずに処...
-
現在開いているbook全てを対象...
-
日付ごとの集計マクロ
-
エクセルVBAで読み取りパスワー...
-
エクセルのマクロについて教え...
-
コードを直していただきたいで...
-
エクセルマクロで任意のファイ...
-
クリップボードに貼付している...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
エクセルVBAが途中で止まります
-
別ブックをダイアログボックス...
-
【ExcelVBA】インデックスが有...
-
ワイルドカード「*」を使うとう...
-
【ExcelVBA】VBA実行でダイアロ...
-
ExcelのVBAです。フォルダ内の...
-
フォルダ内の全てのファイルに...
-
VBA コードを実行すると画面が...
-
VBA 別ブックからコピペしたい...
-
VBAで別ブックのシートを指定し...
-
VBS Bookを閉じるコード
-
vbaでvbaProjectのパスワード解...
-
【VBA】全シートの計算式を全て...
-
VBA シート名が一致した場合の...
-
【ExcelVBA】zip圧縮されたCSV...
-
複数のエクセルブックをひとつ...
-
VBSでExcelのオープン確認
-
VBAで別のブックにシートをコピ...
-
【Excel VBA】書き込み先ブック...
おすすめ情報