none
複数のExcelファイルをオープン・クローズしていると実行中に停止してしまう。 RRS feed

  • 質問

  • お世話になります。

    VBAを組み込んだExcelファイル(以降File A)から複数のExcelファイルをオープン・クローズして
    いると途中で処理がExcel画面を表示中に突然停止してしまいます。
    停止中にExcel画面の一部(どこでも可)を左クリックすると再び処理が再開します。

    実際にFile A のVBAで処理している内容は以下の通りです。

     1.他のExcel File (以降 File B)をオープンします。
       ・実際に使用している構文
       ・Set 変数名 = Workbooks.Open(Filename:=ファイルパス&ファイル名)

     2.オープンしたExcel File B の特定のセルの内容をコピーします。

     3.コピーした内容を File Aの特定のセルに貼り付けます。

     4.File Bをクローズします。
       ・実際に使用している構文
       ・変数名.Close SaveChanges:=False

     1.から4.までを繰り返し実行していると突然停止しますが、画面を左クリックするだけで
     処理が再開します。

     ※Excel VBA内では変数使用後の明示的な解放は行っていません。

     尚、Excel のバージョンは、Office 2007 になります。
     以前同様の処理をOffice 2003で実施していた時には恐らく発生していませんでした。

     また対象のFile B のファイルサイズは、約500 KBytesです。File Aのファイルサイズは、
     50 KBytes以下です。

     PCによって再現したり再現しなかったりするので原因がよくわかりません。
     どなたか原因をご教示頂けないでしょうか。

     宜しくお願い致します。

    • 移動 星 睦美 2015年2月9日 4:15 Windows クライアント開発 から
    2015年2月6日 10:35

回答

  • こんにちは。
    クリックして再開されるのであればメッセージ処理が止まってる可能性がありますので
    ループの中でDoEventsしてみてください。

    Sub ひらく()
    
        Dim i As Integer
        Dim wkBook As Workbook
        Dim wkSheet As Worksheet
        Dim sourceVal As String
        
        For i = 1 To 50
            Application.ScreenUpdating = False
            '1.他のExcel File (以降 File B)をオープンします。
            Set wkBook = Workbooks.Open(Filename:="C:\temp\" & i & ".xlsx")
            ThisWorkbook.Activate
            Set wkSheet = wkBook.Sheets(1)
            '2.オープンしたExcel File B の特定のセルの内容をコピーします。
            sourceVal = wkSheet.Cells(1, 1)
            '3.コピーした内容を File Aの特定のセルに貼り付けます。
            ThisWorkbook.ActiveSheet.Cells(i, 1) = sourceVal
            '4.File Bをクローズします。
            wkBook.Close SaveChanges:=False
            Application.ScreenUpdating = True
            '5.これをやっておく
            DoEvents
        Next i
        
    End Sub


    2015年2月9日 7:26
    モデレータ

すべての返信

  • どれくらいのファイル数を処理されようとしているのでしょうか?

    キャッシュ周りやメモリリーク関係が疑われるのと、処理のループが早すぎてどこかしらの処理が終わらないうちに次の処理が走っているなども考えられます。

    状態をどこかに表示させるデバッグ用のコードを入れて、どのあたりの処理で現象が起きているのか確認してみてはいかがでしょうか?

    • 回答の候補に設定 星 睦美 2015年2月9日 0:59
    2015年2月7日 2:11
  • フォーラム オペレーターの星 睦美です。
    YO_NAGANAGA さん、投稿ありがとうございます。
    VBA に関する話題を扱っているフォーラムがありますので、私のほうで今回の質問を移動させていただきますね。
    Visual Basic for Application(VBA) :

    ユーザーからの回答が参考になりましたら、投稿者からの[回答としてマーク]をお願いします。

    フォーラムのご利用方法、ヘルプ、回答のガイドラインに関するお知らせ




    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年2月9日 0:58
  • CryEarth tomoyuki sasaki 様

    ご回答ありがとうございました。

    >どれくらいのファイル数を処理されようとしているのでしょうか?

    ⇒大体総数200ファイル程度で実施して50ファイル目付近で現象が発生しております。

    ご参考までに実施した2台のPCのマシンスペックを以下に記載させて頂きます。

    (2台ともに同じような箇所で発生しております)

    ・CPU:Core i3 2.4GHz
     Memory:2G

    ・CPU:Core 2 Duo 2.53GHz
     Memory:2G

    尚、ファイルの総数ですが、実は700ファイル程度あり、いったん停止してもそのまま続行すると200ファイル目ぐらいで

    Excel自体が落ちてしまう事象も発生しているためファイルの母数を200ファイル程度に抑えて処理を実施しています。

    (Excel.exe自体が落ちているようです)

    この現象につきましても同じ原因なのでしょうか。

    また、デバッグ用のコードを入れて実施する件につきましては、実際に発生したPCで実施してみようと思います。

    もし上記の情報で何か追加でわかることがありましたらお手数ですが、再度ご教示頂けたらと思います。

    以上宜しくお願い致します。

    2015年2月9日 6:44
  • こんにちは。
    クリックして再開されるのであればメッセージ処理が止まってる可能性がありますので
    ループの中でDoEventsしてみてください。

    Sub ひらく()
    
        Dim i As Integer
        Dim wkBook As Workbook
        Dim wkSheet As Worksheet
        Dim sourceVal As String
        
        For i = 1 To 50
            Application.ScreenUpdating = False
            '1.他のExcel File (以降 File B)をオープンします。
            Set wkBook = Workbooks.Open(Filename:="C:\temp\" & i & ".xlsx")
            ThisWorkbook.Activate
            Set wkSheet = wkBook.Sheets(1)
            '2.オープンしたExcel File B の特定のセルの内容をコピーします。
            sourceVal = wkSheet.Cells(1, 1)
            '3.コピーした内容を File Aの特定のセルに貼り付けます。
            ThisWorkbook.ActiveSheet.Cells(i, 1) = sourceVal
            '4.File Bをクローズします。
            wkBook.Close SaveChanges:=False
            Application.ScreenUpdating = True
            '5.これをやっておく
            DoEvents
        Next i
        
    End Sub


    2015年2月9日 7:26
    モデレータ