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

VBAについて質問です。
コードを実行するとエディタ画面およびコードを書いているブックの両方の画面が真っ白になってしまいます(コードやプロジェクトウィンドウの内容も消え、ブックもデフォルトの薄い枠線が消えて全体がグレーアウトのようになります)。
こちらの解決方法をご教示頂けないでしょうか。

(今回のVBAの目的)
見積書のエクセルブックが1000個ほど入ったフォルダから、データを抽出して一つのシートに一覧作成したいです。

具体的には、
指定したフォルダ内のブック一つ一つを順番に開く→特定のセルの値をコピー→VBAコードを書いているブックにペースト→開いたブックを閉じる
というコードを書きたいです。

(作成状況)
VBA初心者のため、ネット上のコードを参考につなぎ合わせて作成しております。
説明が不足している、またわかりにくい等あるかと思いますが、追記にてわかる範囲で情報提供させて頂ければと思います。

・抽出対象のブックと同じフォルダ内にVBA実行ブックを格納しています
・標準モジュールで作成しています
・実行した際、エラー表示は出ません


↓以下、記載したコードです。

Sub test()

Const cnsTitle = "同じフォルダ内の複数ブックからデータを抽出して一覧作成"
Const cnsDIR = "\*.*"
Dim xlAPP As Application
Dim strPath As String
Dim strFilename As String
Dim GYO As Long

Set xlAPP = Application

Dim dstSheet As Worksheet
Set dstSheet = ThisWorkbook.Worksheets(1)


' フォルダの場所を指定する
strPath = ThisWorkbook.Path
MsgBox strPath

' 先頭のファイル名の取得
strFilename = Dir(strPath & cnsDIR, vbNormal)
MsgBox strPath & "\" & strFilename


' ファイルが見つからなくなるまで繰り返す
Do While strFilename <> ""
GYO = GYO + 1
' 行を加算→ここまでは構文、この下から内容を

Dim srcBook As Workbook
Set srcBook = Workbooks.Open(strPath & "\" & strFilename)
Dim srcSheet As Worksheet
Set srcSheet = srcBook.Worksheets(1)

dstSheet.Cells(GYO, 1).Value = srcSheet.Cells(10, 8)

srcBook.Close False

' 次のファイル名を取得
strFilename = Dir()
Loop

End Sub

質問者からの補足コメント

  • ステップインで探ったところ、
    srcBook.Close False
    を実行した時に画面が消えるようです。

    これは、vbaのブック自体が検索対象フォルダに入っているため、このブックもCloseの対象になっている、ということかと思うのですが


    これを回避するのに良い案があれば
    ぜひコメントいただきたいです!

      補足日時:2020/12/18 09:10

A 回答 (3件)

こんにちは



>vbaのブック自体が検索対象フォルダに入っているため、
>このブックもCloseの対象になっている、ということかと思うのですが
処理対象から、「コードを記載してあるブック」と「転記先のブック」は除くようにしておく必要がありそうです。(ざっと見たところ、両方は同じブックのようですが…)
そうでないと、同じフォルダの中にあるので、自分自身も対象となり、閉じられてしまうからです。

同じフォルダ内のファイルなら、ブック名で判断できるので、ループ内の最初の方で
 If strFilename <> ThisWorkbook.Name Then
などとして、自分自身は処理しないようにしておけば宜しいでしょう。


ついでながら、ご質問とは関係ありませんが、
 >Const cnsDIR = "\*.*"
だと、フォルダ内の全ファイルが対象となるような指定になっています。
想像するところ、現状ではエクセルファイル以外はないのでしょうけれど、仮に、他のファイルがある場合、それも処理の対象となってしまいおかしなことになりかねません。
 "\*.xls" などとしておいた方が安全側ではないかと感じます。


さらに、おせっかいながらですが・・・
 >見積書のエクセルブックが1000個ほど入ったフォルダから
1000個のファイルを開く/閉じるを繰り返すとそれなりの時間がかかってしまうと想像されます。
一方で、ざっと見る限り、1ブックから1セルの値だけを抜き出しているようなのと、対象が定型文書のようなので、参照するシート名は同じだろうと推測します。

ご提示のコードでは、srcBook.Worksheets(1) となっているので、同じ名のシートなのかどうかはっきりしませんが、同じシート名の場合は、Excel4Macroを利用することで開く/閉じるの時間を省略できるので、全体の処理時間を短縮できるものと思います。ご参考までに。
https://excel-ubara.com/excelvba5/EXCELVBA242.html
    • good
    • 0
この回答へのお礼

まさに、おっしゃる通りでした!原因はcloseの対象がvba実行用のファイルになっていたことでしたので、if文を使って解決できました!ありがとうございました。

Excel4macroについても、とても参考になります!ありがとうございました!


また、Excel4

お礼日時:2020/12/18 14:26

' 次のファイル名を取得


strFilename = Dir()


strFilename = Dir("")
ではないか?

エラーでどこかに飛んでいるか永久ループしているか。
    • good
    • 0
この回答へのお礼

ご指摘、ありがとうございました!
参考にさせていただきました(^_^)!

お礼日時:2020/12/18 14:26

DoEvents


を ループの中に入れればOK

http://take3tech.blog.fc2.com/blog-entry-119.html
これが参考になる
    • good
    • 0
この回答へのお礼

ご回答、大変参考になります!!ありがとうございます。

早速ループ内にDoEventsを入れてみました!
しかし、また同じように画面がグレーアウトしてしまいました。

ステップインで探ったところ、
srcBook.Close False
を実行した時に画面が消えるようです。

これは、vbaのブック自体が検索対象フォルダに入っているため、このブックもCloseの対象になっている、ということでしょうか?

お礼日時:2020/12/18 09:09

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

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


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