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

VBAを100本の練習問題で鍛えます
公開日:2020-11-24 最終更新日:2021-01-13

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


開いている全ブックを保存し、保存したブックのフルパスをテキスト出力する問題です。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータはご自身でご用意ください。


出題

出題ツイートへのリンク

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

マクロ VBA 100本ノック


参考画像を間違えました。
フルパス出力してください。

マクロ VBA 100本ノック


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

テキストファイルの出力は何通りかありますが、まずは、Open…Print…Closeは覚えておいた方が良いでしょう。
ブックのフルパスはプロパティFullNameで取得できます。
ブックの上書き保存はSaveAsメソッドです。
Excelの終了はApplication.Quitです。

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


ブックのSaveやSaveAsはブックの状態やファイルの状況によりエラーになる可能性があります。
単純にOn ErrorをいれてCloseしてしまうと保存されないことになるので気を付けたいところです。
読み取り専用等のいくつかのパターンに対応したVBAを記事補足に掲載しました。


補足

上書き保存が出来ないことは多々あります。
・読み取り専用
・未保存の新規ブック
・その他、回復済みのような特殊なもの
かといって、単純に上記VBAに
On Error Resume Next
Application.DisplayAlerts = False
これらを入れてしまうと想定外の挙動になってしまう可能性があります。
例えば、新規ブックBook1は、Book1.xlsxで既存の別ファイルを上書きになってしまう可能性があります。

読み取り専用と新規ブックに対応して、その他はエラー対応するようにしました。

Sub VBA100_32_02()
  On Error Resume Next
  Application.DisplayAlerts = False
  ThisWorkbook.Save
  
  Dim ymdhms As String
  ymdhms = Format(Now(), "yyyymmddhhmmss")
  Open ThisWorkbook.Path & "\log_" & ymdhms & ".txt" For Output As #1
  
  Dim wb As Workbook, errMsg As String
  For Each wb In Workbooks
    Err.Clear
    
    Print #1, wb.FullName
    
    If wb.ReadOnly Then
      wb.Saved = True
      Print #1, "→読み取り専用"
    ElseIf wb.Path = "" Then
      '新規ブックはとりあえずxlsmで強制保存
      wb.SaveAs FileName:=ThisWorkbook.Path & "\" & wb.Name & "_" & ymdhms & ".xlsm", _
           FileFormat:=xlOpenXMLWorkbookMacroEnabled
      Print #1, "→新規保存:" & wb.FullName
    Else
      wb.Save
      If Err Then
        'エラーになる場合があります
        Print #1, Err.Description
        Err.Clear
        wb.SaveAs FileName:=ThisWorkbook.Path & "\" & wb.Name & "_" & ymdhms & ".xlsm", _
             FileFormat:=xlOpenXMLWorkbookMacroEnabled
        Print #1, "→別名保存:" & wb.FullName
      End If
    End If
    
    If Err Then
      Print #1, "↓想定外のエラー"
      Print #1, Err.Description
      Print #1, "↑想定外のエラー"
    End If
    
    If wb.Name <> ThisWorkbook.Name Then
      wb.Close SaveChanges:=False
    End If
  Next
  
  Close #1
  Application.Quit
End Sub

マクロ VBA 100本ノック

なかなか全ての場合を網羅するのは難しいと思います。

新規ブックにマクロがあるかはHasVBProjectで判断できますが、若干曖昧な部分もあるので、どうせ仮の保存だという事でxlsmで強制保存してみました。

単純に保存操作を簡略化するだけなら、むしろエラーで止めたほうが良いかもしれません。

今回のお題のようにExcelアプリまで終了させる場合は、いろいろと問題が出て来ると思います。
もしこのような自動化が必要な場合は、しっかりといろいろなパターンをテストしてください。
別のファイルを上書きしてしまったり、保存せずに閉じてしまう事のないように気を付けてください。


サイト内関連ページ

第64回.ブックを閉じる・保存(Close,Save,SaveAs)
・ブックを閉じる ・ブックを上書き保存 ・ブックに名前を付けて保存 ・ブックのコピーを保存 ・ブックを閉じる・保存の実践例
第116回.ファイル操作Ⅱ(OpenとClose)
・Openステートメント ・Closeステートメント ・OpenステートメントとCloseステートメントの使用例
第117回.ファイル操作Ⅱ(Line Input #)
・Line Input # ステートメント ・EOF関数 ・Line Input # ステートメント と EOF関数の使用例.
第118回.ファイル操作Ⅱ(Print #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、その後に、読込み書込みを行い、最後に、ファイルを閉じます。ファイルを書き込む時には、Print#ステートメントを使います。Print#ステートメント シーケンシャル出力モード(OutputまたはAppend)で開いたファイルにデータを書き込むファイル入…
第119回.ファイルシステムオブジェクト(FileSystemObject)
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例




同じテーマ「VBA100本ノック」の記事

29本目:画像の挿入
30本目:名札作成(段組み)
31本目:入力規則
32本目:Excel終了とテキストファイル出力
33本目:マクロ記録の改修
34本目:配列の左右回転
35本目:条件付き書式
36本目:列の並べ替え
37本目:グラフの色設定
38本目:1シートを複数シートに振り分け
39本目:数値リストの統合(マージ)


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ