同じフォーマットのEXCEL シート(ファイル)をマージ(統合)するvbaコードで、たくさんファイルを読ませると、メモリ不足でEXCELがコケた。
ググってみたら、マイクロソフトのバグ らしく、ファイルのオープン・クローズを繰り返すだけで、マイクロソフトはメモリ解放のタイミングを逃してしまうようだ。
例によって、それが仕様なのでしょう。これを回避するには、closeの後にDoEventsという呪文をかけておかなくてはならないようだ。
Optoon Explicit Dim maxRow As Long Dim filePath As string Dim fileName As String Dim i,j,k As Long Sub MergeALL() j = 1 ' the row counter of TO(COPY) filePath = ThisWorkbook.Path & "¥" fileName = Dir(filePath & "*DATA*.xlsx") ' Get a file to be merged Do While fileName <> "" ' Is there a file to be merged ? Workbooks.Open Filename :=filePath & fileName maxRow = ActiveWorkbook.Worksheets(1).Cells(Roes.Count,3).End(xlUp).Row If j = 1 then k = 1 ' k: the row counter of FROM(COPY) If j > 1 then k = 3 m = maxRow - ( k - 1 ) ' m: the numbers of lines to be copied ActiveWorkBook.Worksheets(1).Range(Rows(k),Rows(maxrow)).Copy ThisWorkBook.Worksheets("まとめ").Activate ThisWorkbook.Worksheets("まとめ").Range(Rows(j),Rows(j+m-1).PasteSpecial (xlPasteAll) application.CutCopyMode = False j = j + m Workbooks(fileName).Close DoEvents ' give a chance to release memory area fileName = Dir() ' Get the next file to be merged Loop End Sub
こんな感じで、今度こそいいと思う。たぶん。ここで、一息のコーナーです。NHKの100分で名著で、ル・ボンの「群集心理」を観た。政治家やメディアは、しばしば、精緻な論理などを打ち捨て、「断言」「反復」「感染」という手法を使って、群衆たちに「紋切り型のイメージ」「粗雑な陰謀論」「敵-味方の単純図式」を流布する。まさに、そのとおりだなと感じた。誠に、空恐ろしい。
0 件のコメント:
コメントを投稿