VBAマクロでログを取り込んで解析したらメモリ不足と表示された件
2023年03月19日
日時でやっているログ解析作業で、ログの内容から数値を除外して
左から48文字抽出する処理でメモリ不足が出た。
びっくり。
行数を確認したら、昨日の時点で244,236行。
今日の時点で251,951行。そんなすぐメモリ不足になるか???
多いときは100万行近く処理していたのに。。。
原因は文字コードの違うログの中に「=」で始まるものがあって、
書式が標準になっていたので関数として処理しようとして落ちたっぽい。
左から48文字抽出する処理でメモリ不足が出た。
びっくり。
行数を確認したら、昨日の時点で244,236行。
今日の時点で251,951行。そんなすぐメモリ不足になるか???
多いときは100万行近く処理していたのに。。。
原因は文字コードの違うログの中に「=」で始まるものがあって、
書式が標準になっていたので関数として処理しようとして落ちたっぽい。
以下、詳細。
メモリ不足が出ている処理は、
配列に格納した文字列をエクセルに貼り付ける箇所。
myRange.Offset(0, 1).Value = myArr
「集計用列を挿入するマクロ」
貼り付け処理が途中で中断されていて、
該当箇所の内容みたら、文字化けしているし。
Googleに以下のキーワードを入れて検索するもHITせず。あっても良さそうなんだけどなぁ。
キーワード
エクセル、集計、メモリ不足、貼り付け、文字コード、配列、xls、excel、VBA
ログ出力する文字コードが間違っているシステムがあって、
本来はシステム側を直すべきところなんだけど、
いつまた再発するかわからんからVBAマクロを修正しないといけない。
文字化けしてるところの共通点は、ログの中に?が入ってることくらい。
検索してみたら全然HITしない!?
ワイルドカード扱いになるから、チルダを付けて「~?」としないといけないらしい。
検索の結果他システムの文字化けしてないログにも?入ってるし、除外は無理。
メモリ不足が発生したときに貼り付けようとした文字列をもう一度確認したら、
「=」で始まってるし!!!
貼り付け処理の部分の表示形式見てみたら、1つ目のログに表示形式を合わせてたので、
化け化けのログが関数扱いされて、処理できずにメモリ不足になったっぽい。
配列の貼り付け先の書式を以下の通り文字列に修正して完了。
cells(tarRange).NumberFormatLocal = "@"
テキストのログを扱うときに文字化けするのはあるあるな気もするけど、
意外にも検索にHITしなかったな。
教訓
文字列のログを扱うときは、エクセル側の書式を文字列にしておく!
ソースについては過去記事を参照。
「集計用列を挿入するマクロ」
修正前
myRange.Offset(0, 1).NumberFormatLocal = Cells(tGyo + 1, col).NumberFormatLocal
修正後
myRange.Offset(0, 1).NumberFormatLocal = "@"
PR
Comment