VBA100本ノック 32本目:Excel終了とテキストファイル出力

この記事から得るもの

1 今回のお題

開かれているブック全てを上書き保存して、Excelアプリも終了させてください。
履歴として、保存したブックのパスをテキストファィルに出力してください。
テキストファイルはマクロブックと同一フォルダに以下の名称で出力(SJIS)してください。
log_yyyymmddhhmmss.txt(フルパス出力してください。)

f:id:bimori466:20201212062948p:plain

excel-ubara.com

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」の時に、ファイル名が存在しなければ新規に作ってくれる。
大きな収穫でした。


ではでは、この辺で(^^)/~~~