VBA100本ノック 32本目:Excel終了とテキストファイル出力
この記事から得るもの
1 今回のお題
開かれているブック全てを上書き保存して、Excelアプリも終了させてください。
履歴として、保存したブックのパスをテキストファィルに出力してください。
テキストファイルはマクロブックと同一フォルダに以下の名称で出力(SJIS)してください。
log_yyyymmddhhmmss.txt(フルパス出力してください。)
2 今回のお題の意図
エクセルで開かれている全ブックを上書き保存して、テキストにエクセルのフルパスを書き出すことにより、どのエクセルファイルを保存したかが分かるようにする。
3 回答
私の最初の回答
Sub ノック32本目_1() 'FSO宣言 Dim fso As Object: Set fso = CreateObject("scripting.filesystemobject") Dim fsoText As Object Set fsoText = fso.CreateTextFile(ThisWorkbook.Path & "\32本目\log_" & Format(Now, "yyyymmddhhmmss") & ".txt", True) 'ファイルPathを取得 Set myfiles = fso.getfolder(ThisWorkbook.Path & "\32本目").Files For Each file In myfiles 'ファイルかどうか判断してlog保存先Pathを取得する If file.Name Like "log_*.txt" Then logText = file.Path Exit For End If Next fsoText.Close 'テキストファイルを閉じる 'ファイルを開いて書き込む Open logText For Output As #1 myBookPath = ThisWorkbook.Path & "\" & ThisWorkbook.Name '自Book以外を閉じる処理 For i = Workbooks.Count To 1 Step -1 otherBookPath = Workbooks(i).Path & "\" & Workbooks(i).Name If myBookPath <> otherBookPath Then Print #1, otherBookPath: Workbooks(i).Close 'テキストに書込み、ファイルを閉じる End If Next 'テキストに書込み、自Bookを保存 Print #1, myBookPath: ThisWorkbook.Save Close #1 'エクセルを終了する Application.DisplayAlerts = False Application.Quit End Sub
一応お題通りの処理はできていますが、fso.CreateTextFileでログ書き込み先のテキストファイルを作って、いったん閉じて「Open For Output As」で開きなおしているのがナンセンスです。
このお題での重要な気づきは、「Open ファイル名 For Output As」の時に、ファイル名が存在しなければ新規に作ってくれます。
つまりfso.CreateTextFileは必要ないのです。
サイト管理者の回答
Sub VBA100_32_01() ThisWorkbook.Save Dim ymdhms As String ymdhms = Format(Now(), "yyyymmddhhmmss") Open ThisWorkbook.Path & "\log_" & ymdhms & ".txt" For Output As #1 Dim wb As Workbook For Each wb In Workbooks wb.Save Print #1, wb.FullName Next Close #1 Application.Quit End Sub
実際動かしてみるとわかるのですが、「Open ThisWorkbook.Path & "\log_" & ymdhms & ".txt" For Output As #1」を実行したときに、Pathフォルダにテキストファイルが作成されます。これは大きな気づきでした。FSOいらんやん!!
4 感想
「Open ファイル名 For Output As」の時に、ファイル名が存在しなければ新規に作ってくれる。
大きな収穫でした。
ではでは、この辺で(^^)/~~~