同じフォーマットの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 件のコメント:
コメントを投稿