IT仕事

同じセルに数字があるファイルを開いて別のファイルにどんどん転記しては閉じていく×1000件・・・をExcelマクロで作る

投稿日:

昨日は、アンケートの下仕事をやった。
各ファイルの同じセルに数字の記入があって、それを開いて別のファイルにどんどん転記しては閉じていく・・・というのをExcelマクロで作るのだが。
最初は手作業でコピペしていたのだが、対象が1000件近くもあると、疲れてくるし間違いが起こるので、マクロにすることに。
数時間後、そのマクロが完成したはいいが、途中、処理が30件~70件目で止まる(Excelが応答なしになる)。
テキストボックスが大量に貼り付けてあるから重いのが理由の様子。
あと483エラーが頻発(オブジェクトが見つかりませんエラー)。
ブレークポイントを使って、ストップ&ゴーを繰り返すやり方だと、必ずうまくいく。
原因がわからないので対症療法になり、コードの修正に時間がかかった。

以下は、よく止まって困ったコード(修正前。アドイン登録してショートカットキーで呼び出ししていたのでその処理を含む)
[code] Sub AUTO_OPEN()
‘Ctrl + k
Application.OnKey "^{k}", "TenkiData"
End Sub

Sub auto_close()
Application.OnKey "^{k}" ‘元に戻す
End Sub

Public Sub TenkiData()
Dim l As Long
ActiveSheet.Range("A799:IV799").Copy
Windows("データ集約マクロ.xlsm").Activate
Range("A65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues ‘値のみ

ActiveWindow.ActivatePrevious
Range("A801:B801").Copy
Windows("データ集約マクロ.xlsm").Activate
Range("IX" & ActiveCell.Row).PasteSpecial Paste:=xlPasteValues

ActiveWindow.ActivatePrevious
Range("C80").Copy
Windows("データ集約マクロ.xlsm").Activate
Range("IZ" & ActiveCell.Row).PasteSpecial Paste:=xlPasteValues

Application.SendKeys "({HOME})", True
ActiveWindow.ActivatePrevious
ActiveWindow.Close SaveChanges:=False

End Sub[/code]

以下は修正後。集約先ファイルに記述。

[code]Public Sub TenkiData()

On Error GoTo myError
Dim l As Long, waitTime As Date

Dim ShellApp As Object
Dim objFolder As Object
Set ShellApp = CreateObject("Shell.Application")
Set objFolder = ShellApp.BrowseForFolder(&H0, "フォルダを選択して [OK]をクリックしてください。", &H1)

If Not objFolder Is Nothing Then
strDir = objFolder.Items.Item.Path
Else
Exit Sub
End If

Set FS = CreateObject("Scripting.FileSystemObject")
Set Fol = FS.GetFolder(strDir)
Set Fil = Fol.Files

Application.ScreenUpdating = False
For Each MyFile In Fil
If MyFile.Name Like "*.xls*" Then
Workbooks.Open MyFile.Path
Dim strWB As String
strWB = ActiveWorkbook.Name

ActiveSheet.Range("A799:IV799").Copy
r = Workbooks("データ集約マクロ.xlsm").Worksheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Row
Workbooks("データ集約マクロ.xlsm").Worksheets("Sheet1").Range("A" & r).PasteSpecial Paste:=xlPasteValues ‘値のみ

ActiveSheet.Range("A801:B801").Copy
Workbooks("データ集約マクロ.xlsm").Worksheets("Sheet1").Range("IX" & r).PasteSpecial Paste:=xlPasteValues

ActiveSheet.Range("C80").Copy
Workbooks("データ集約マクロ.xlsm").Worksheets("Sheet1").Range("IZ" & r).PasteSpecial Paste:=xlPasteValues

ActiveWindow.Close SaveChanges:=False

Workbooks("データ集約マクロ.xlsm").Save

waitTime = Now + TimeValue("0:00:03") ‘短時間でファイルを閉じられなくてエラーになるケースを回避
Application.Wait waitTime

End If
Next
Application.ScreenUpdating = True
Exit Sub
myError:
MsgBox Err.Description, vbExclamation
End Sub[/code]

以下、効果のあった対策:
・開いた直後にWaitを数秒かけるとよい(必須)。
・ActiveやSelectを使ってバタバタウィンドウを開閉するとうまくいかないケースがあったので、それらをなるべく使わないようにコード修正(必須)。
・ScreenUpdatingを使う。それとDisplayAlertの使い方を間違えていて、気がつかなかった・・・。
・ブラウザなどバックグラウンドで開いているメモリ食いのアプリを終了しておく(処理が格段に速くなる!)。
・読み込み対象データの置き場所を、USBメモリからではなくHDDにしたら成功率がかなり上がった(必須)。
・各ファイルの容量を調べてみると、1件だけ、容量が倍のものがあった。勝手にシートを複製していたため。不要シートを削除すると成功率が上がった。

効果があったかもと思われる対策:
・ワークブック名とワークシート名を明示。
・1件読み込み処理終了毎に保存する

ファイル一覧の取得方法で参考になったサイト:マクロについて、①フォルダ内のエクセルファイルを順番に開いて行く方法… – Yahoo!知恵袋

処理の最終検証確認で役に立ったサイト:Windows:フォルダ内のファイル名一覧を取得(出力)するには – 教えて!HELPDESK

-IT仕事

執筆者:

関連記事

no image

2年ぶりくらいにルミーズカートを使おうとしたのだがうまくいかん

2年ぶりくらいにルミーズカートを使おうとしたのだがうまくいかん カートのバージョンはVer1.4.5。 早速、サーバへの設置がうまくいかない。 「非公開ディレクトリ」の設定をしたがどうもdbフォルダに …

アンケートソフト秀吉でMAを作るためのExcel自作関数

会社の同僚用に作った。 複数列の回答を「1,2,4」のように1列にしたり、3は無ければ飛ばしたり、先頭と末尾にはカンマつけないで、とか、手作業だと色々面倒な処理を、Excelマクロにした。 以下を標準 …

no image

Limesurvey 表示される日本語をちょっと変更した

ひっさびさにlimesurveyを触ることになったけど、だいぶ忘れている・・・。 ボタンに表示されている日本語を変えるだけなのに、あのファイルこのファイルひっくり返し、最後にLC_MESSAGESフォ …

no image

ATOKからGoogle日本語入力に乗り換え

長年、ATOK2008を使ってきたが、先日Windowsのバージョンを10にしたら、使えなくなってしまった。 メーカーのHPを見ると、そのバージョン同士は使えなくなったみたい。 まあいいかと諦めてWi …

no image

ExcelWebAddin でWebフォームを自動入力

たまーーに、おじさんの不動産物件の入力をボランティアでお手伝している。 電話オーダーが多く、また前回メールで問い合わせたもんだけど・・・という方が結構多い。ありがたいことである。 その際、見積システム …