「せっかく作ったExcelマクロを保存したのに、次にファイルを開いたらコードが全部消えていた」――このトラブルは、Excelマクロを使い始めたばかりの方が最初にぶつかる壁として非常に多く報告されています。原因はほぼひとつに絞られます。マクロを含むExcelファイルを「.xlsx形式」で保存してしまったことです。本記事では、なぜこの問題が起きるのかという仕組みから、正しい保存形式(.xlsm)の選び方、保存時の操作手順、さらにチーム・組織での共有時に気をつけるべき注意点まで、すべて丁寧に解説します。


目次


なぜマクロが消えるのか――.xlsxと.xlsmの根本的な違い

Excelのファイル形式には複数の種類があり、それぞれ「格納できる情報の種類」が厳密に定められています。マクロが消える原因の99%は、マクロを保持できない形式(.xlsx)でファイルを保存したことです。

Excel 2007以降、Excelのファイル形式はXMLベースのOOXML(Office Open XML)形式に刷新されました。このとき、セキュリティ上の観点からマクロを含むかどうかでファイル形式が分離されました。

  • .xlsx(Excelブック):マクロを一切含めない形式。VBAコードを書いていても、.xlsxで保存するとコードはすべて削除される
  • .xlsm(マクロ有効ブック):VBAマクロを含めることができる形式。マクロを使うファイルは必ずこの形式で保存する

.xlsxでの保存時、Excelは「この形式ではVBAプロジェクトは保存されません」という警告ダイアログを表示します。しかし日本語で表示されるこのダイアログの意味を理解していない場合や、操作に慣れてクセで「はい」を押してしまった場合に、コードが消えてしまいます。

つまりこのトラブルは、Excelの仕様を知らないことによる操作ミスであり、マクロのバグでもシステム障害でもありません。一度正しい保存方法を理解すれば、再発を完全に防ぐことができます。


Excelのファイル形式一覧と使い分け

Excelで保存できる主なファイル形式と、それぞれの特徴・用途を整理します。マクロの有無によって選ぶべき形式が明確に異なります。

マクロを含む場合に使う形式

  • .xlsm(Excelマクロ有効ブック):VBAマクロを保存できる標準的な形式。マクロを含むファイルは基本的にこれを選ぶ。ファイルアイコンに感嘆符(!)のマークが付く
  • .xlsb(Excelバイナリブック):バイナリ形式で保存するためファイルサイズが小さく、読み書きが高速。マクロも保存できる。大量データを扱うブックや高速化が必要なケースで使う。ただしXML形式でないため他のツールとの互換性が低い
  • .xls(Excel 97-2003ブック):旧バージョンのバイナリ形式。マクロも保存できる。古いシステムとの互換が必要な場合のみ使う。現在は積極的に選ぶ理由はない

マクロを含まない場合に使う形式

  • .xlsx(Excelブック):マクロを含まない現代の標準形式。マクロなしのデータ・表・グラフのみのファイルはこれで保存する。最も広く流通しており、互換性が高い
  • .xltm(Excelマクロ有効テンプレート):マクロを含むテンプレートファイル。開くたびに新規ブックとして開かれる。毎回同じマクロ入りのひな形を使いたい場合に有効
  • .xltx(Excelテンプレート):マクロなしのテンプレート形式
  • .csv(カンマ区切り):テキスト形式。マクロ・書式ともに保存できない。データ連携専用

形式の選び方フローチャート

  • VBAコード(マクロ)がある → .xlsm または .xlsb
  • VBAコードはないが大量データで速度重視 → .xlsb
  • VBAコードなし・他者と広く共有 → .xlsx
  • 毎回使うマクロ入りひな形 → .xltm
  • すべてのPCで動かしたい・旧システム連携 → .xls(最終手段)

正しい保存手順:.xlsmで保存する方法

マクロを含むファイルを.xlsmとして保存するには、以下の手順を行います。この操作を一度覚えておくだけで、マクロが消えるトラブルを完全に回避できます。

新規ファイルを.xlsmとして保存する手順

  • メニューの「ファイル」→「名前を付けて保存」をクリックする(ショートカットキー:F12)
  • 保存先フォルダを指定する
  • ファイルの種類」のドロップダウンを開く
  • Excel マクロ有効ブック (*.xlsm)」を選択する
  • ファイル名を入力して「保存」ボタンをクリックする

.xlsxで上書き保存しようとしたときに出るダイアログへの対処

すでに.xlsxとして保存されているファイルにマクロを追加し、Ctrl+Sで上書き保存しようとすると次のようなダイアログが表示されます。

次の機能はマクロなしのブックに保存できません:VBプロジェクト。マクロなしのブックとして保存するには、[はい]をクリックしてください。VBAマクロを保持するには、[いいえ]をクリックして、マクロ有効ブック形式で保存してください。

  • 「はい」を選ぶ:.xlsxで保存される → マクロが消える(選んではいけない)
  • 「いいえ」を選ぶ:ダイアログが閉じ、「名前を付けて保存」の画面が開く → ここで.xlsmを選んで保存する(正しい操作)

重要:このダイアログで「はい」を押すクセがついてしまっているとマクロが消え続けます。 必ず「いいえ」を選んでから.xlsmで保存し直してください。

VBAコードを使って自動的に.xlsmで保存するマクロ

' ========================================
' 現在のブックを.xlsm形式で保存するマクロ
' ボタンに割り当てて使うと便利
' ========================================
Sub SaveAsXlsm()

    Dim currentPath As String
    Dim xlsmPath    As String
    Dim fileName    As String

    ' 現在のファイルパスを取得
    currentPath = ThisWorkbook.FullName

    ' 拡張子を.xlsmに変換
    fileName = ThisWorkbook.Name
    If InStr(LCase(fileName), ".xlsx") > 0 Then
        xlsmPath = Left(currentPath, Len(currentPath) - 5) & ".xlsm"
    ElseIf InStr(LCase(fileName), ".xls") > 0 Then
        xlsmPath = Left(currentPath, Len(currentPath) - 4) & ".xlsm"
    Else
        xlsmPath = currentPath & ".xlsm"
    End If

    ' 確認ダイアログを抑制してxlsm形式で保存
    Application.DisplayAlerts = False

    ThisWorkbook.SaveAs _
        Filename:=xlsmPath, _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled   ' 52 = xlsm形式

    Application.DisplayAlerts = True

    MsgBox "マクロ有効ブックとして保存しました。" & vbCrLf & xlsmPath, vbInformation

End Sub
' ========================================
' 保存前に形式チェックを行う安全な上書き保存マクロ
' Ctrl+S の代わりにこのマクロを実行する運用もできる
' ========================================
Sub SafeSave()

    Dim ext As String
    ext = LCase(Right(ThisWorkbook.Name, 5))

    ' .xlsm または .xlsb または .xls ならそのまま上書き保存
    If ext = ".xlsm" Or ext = ".xlsb" Or Right(ext, 4) = ".xls" Then
        ThisWorkbook.Save
        Application.StatusBar = "保存完了:" & Format(Now(), "HH:mm:ss")
        Exit Sub
    End If

    ' .xlsx の場合は警告を表示
    Dim answer As VbMsgBoxResult
    answer = MsgBox( _
        "このファイルは「.xlsx」形式のため、マクロは保存されません。" & vbCrLf & vbCrLf & _
        "「.xlsm」形式に変換して保存しますか?" & vbCrLf & vbCrLf & _
        "[はい] → .xlsm形式に変換して保存" & vbCrLf & _
        "[いいえ] → このまま.xlsxで保存(マクロは消えます)" & vbCrLf & _
        "[キャンセル] → 何もしない", _
        vbYesNoCancel + vbExclamation, _
        "保存形式の確認")

    Select Case answer
        Case vbYes
            SaveAsXlsm   ' 上記のSaveAsXlsmマクロを呼び出す
        Case vbNo
            Application.DisplayAlerts = False
            ThisWorkbook.Save
            Application.DisplayAlerts = True
            MsgBox "マクロなしの.xlsxで保存しました。マクロは削除されました。", vbWarning
        Case vbCancel
            ' 何もしない
    End Select

End Sub

既存の.xlsxファイルを.xlsmに変換する方法

すでに.xlsx形式で作業を進めているファイルを.xlsm形式に変換するには、次の手順を行います。

手動で変換する手順

  • 対象の.xlsxファイルをExcelで開く
  • ファイル」→「名前を付けて保存」(F12)を選択する
  • 「ファイルの種類」で「Excel マクロ有効ブック (*.xlsm)」を選択する
  • ファイル名は元のまま(または任意の名前)で「保存」をクリックする
  • 元の.xlsxファイルは残ったままになる。不要なら手動で削除する

変換後の確認事項

  • タイトルバーのファイル名が「○○.xlsm」になっていることを確認する
  • ファイルのアイコンに感嘆符マーク(!)が付いていることを確認する
  • VBAエディタ(Alt+F11)を開き、モジュールとコードが保持されていることを確認する
  • 一度ファイルを閉じて再度開き、マクロが消えていないことを最終確認する

VBAで複数の.xlsxファイルを一括して.xlsmに変換するマクロ

' ========================================
' フォルダ内の.xlsxファイルをすべて.xlsmに変換するマクロ
' 注意:元の.xlsxファイルのマクロは空のため変換後もコードは空
'       このマクロはファイル形式の変換のみを行う
' ========================================
Sub ConvertAllXlsxToXlsm()

    Dim folderPath As String
    Dim fileName   As String
    Dim xlsmPath   As String
    Dim wb         As Workbook
    Dim count      As Long

    ' フォルダ選択ダイアログ
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "変換対象フォルダを選択してください"
        If .Show = False Then Exit Sub
        folderPath = .SelectedItems(1) & "\"
    End With

    count    = 0
    fileName = Dir(folderPath & "*.xlsx")

    If fileName = "" Then
        MsgBox "対象フォルダに.xlsxファイルが見つかりませんでした。", vbInformation
        Exit Sub
    End If

    Application.ScreenUpdating = False
    Application.DisplayAlerts  = False

    Do While fileName <> ""

        Dim fullPath As String
        fullPath = folderPath & fileName

        ' .xlsxをブックとして開く
        Set wb = Workbooks.Open(fullPath)

        ' 保存先パス(同フォルダに.xlsmとして保存)
        xlsmPath = folderPath & Left(fileName, Len(fileName) - 5) & ".xlsm"

        ' .xlsm形式で保存
        wb.SaveAs Filename:=xlsmPath, FileFormat:=xlOpenXMLWorkbookMacroEnabled
        wb.Close SaveChanges:=False

        count    = count + 1
        fileName = Dir()

    Loop

    Application.ScreenUpdating = True
    Application.DisplayAlerts  = True

    MsgBox count & " 件のファイルを.xlsmに変換しました。" & vbCrLf & _
           "元の.xlsxファイルは削除されていません。", vbInformation

End Sub

自動保存・OneDriveとマクロファイルの注意点

Microsoft 365(旧Office 365)では、OneDriveやSharePointに保存されたファイルに対して自動保存(AutoSave)機能が働きます。この自動保存がマクロファイルに対して意図しない動作をすることがあります。

自動保存とマクロファイルの問題点

  • OneDriveの同期フォルダに.xlsmを保存すると、自動保存は機能するが共同編集(リアルタイム共有)はサポートされない
  • 自動保存がオンの状態で誰かが.xlsxに変換してしまうと、OneDrive上でマクロが削除された版に上書きされるリスクがある
  • Excelのタイトルバー左端の「自動保存」トグルがオンになっている場合、ファイルを上書き保存する際に.xlsxへの変換を求めるダイアログが出ることがある

推奨する運用方法

  • マクロを含む.xlsmファイルはローカルドライブ(Cドライブや社内ファイルサーバー)に保存するのが最も安全
  • OneDriveに置く場合でも、.xlsm形式を維持することを徹底し、チームメンバーに形式変更しないよう周知する
  • 自動保存が不要な場合は、Excelの「ファイル」→「オプション」→「保存」で「既定でコンピューターに保存する」にチェックを入れると自動保存の動作を抑制できる
' ========================================
' 保存時にOneDriveパスかどうかを検出して警告するマクロ
' Workbook_BeforeSaveイベント(ThisWorkbookモジュールに記述)
' ========================================
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim savePath As String
    savePath = LCase(ThisWorkbook.Path)

    ' OneDriveまたはSharePointのパスに保存しようとしている場合に警告
    If InStr(savePath, "onedrive") > 0 Or _
       InStr(savePath, "sharepoint") > 0 Then

        Dim answer As VbMsgBoxResult
        answer = MsgBox( _
            "このファイルはOneDrive/SharePoint上に保存されています。" & vbCrLf & vbCrLf & _
            "マクロ有効ブック(.xlsm)のOneDrive保存は" & vbCrLf & _
            "自動保存中にマクロが消えるリスクがあります。" & vbCrLf & vbCrLf & _
            "このまま保存しますか?", _
            vbYesNo + vbExclamation, "保存先の確認")

        If answer = vbNo Then
            Cancel = True   ' 保存をキャンセル
        End If

    End If

    ' .xlsxで保存しようとしている場合に警告
    If LCase(Right(ThisWorkbook.Name, 5)) = ".xlsx" Then
        MsgBox ".xlsx形式ではマクロが保存されません。" & vbCrLf & _
               "「名前を付けて保存」から.xlsmを選択してください。", _
               vbCritical, "保存形式の警告"
        Cancel = True
    End If

End Sub

個人用マクロブック(Personal.xlsb)の活用

特定のファイルに依存せず、Excelを起動するたびにどのブックでも使えるマクロを作りたい場合は、「個人用マクロブック(Personal.xlsb)」を活用します。このファイルはExcel起動時に自動的に非表示で開かれ、常にマクロが利用可能な状態になります。

個人用マクロブックの作成方法

  • Excelを開き、「開発」タブ→「マクロの記録」をクリックする
  • 「マクロの保存先」で「個人用マクロブック」を選択する
  • 「OK」をクリックして記録を開始し、すぐに「記録終了」をクリックする(内容は何でもよい)
  • これにより「PERSONAL.XLSB」が自動的に作成される
  • Alt+F11でVBAエディタを開き、「VBAProject(PERSONAL.XLSB)」の配下に標準モジュールを追加して、常用マクロを記述する
  • VBAエディタを閉じ、Excelを終了するとき「個人用マクロブックに加えた変更を保存しますか?」と聞かれるので「保存」を選ぶ

個人用マクロブックの保存場所

' 個人用マクロブックの保存先パスを確認するコード
Sub CheckPersonalXlsbPath()
    ' 通常は以下のフォルダに保存されている
    ' Windows: C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLStart\PERSONAL.XLSB
    ' または Application.StartupPath で確認できる
    Debug.Print "XLStartフォルダ: " & Application.StartupPath
End Sub

個人用マクロブックの特徴と注意点

  • メリット:Excelを起動した状態であればどのブックでもマクロが使える。ファイルを移動してもマクロは消えない。.xlsb形式のため高速で容量も小さい
  • 注意点:あくまで「個人のPC」に紐づくファイルのため、他のPCや他のユーザーとはマクロを共有できない。チームで使いたいマクロはアドイン(.xlam)として作成する
  • PERSONAL.XLSBを別のPCに移行したい場合は、ファイルをそのままXLStartフォルダにコピーすればよい
' ========================================
' 個人用マクロブックのXLStartフォルダを開くマクロ
' ========================================
Sub OpenXLStartFolder()

    Dim xlStartPath As String
    xlStartPath = Application.StartupPath

    If Dir(xlStartPath, vbDirectory) <> "" Then
        Shell "explorer.exe """ & xlStartPath & """", vbNormalFocus
    Else
        MsgBox "XLStartフォルダが見つかりませんでした。" & vbCrLf & xlStartPath, vbExclamation
    End If

End Sub

セキュリティ警告とマクロの有効化設定

.xlsmファイルを開いたとき、Excelのリボン下部に黄色いバーで「セキュリティの警告 マクロが無効にされました」というメッセージが表示されることがあります。これはマクロが消えたわけではなく、セキュリティ設定によりマクロが実行できない状態になっているだけです。「コンテンツの有効化」ボタンを押すと実行できるようになります。

マクロのセキュリティ設定の確認と変更

  • ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」をクリックする
  • マクロの設定」を選択する
  • 設定の選択肢は以下の4つ
  • 警告を表示せずにすべてのマクロを無効にする:最も安全。マクロはすべて動かない。セキュリティ最優先の組織向け
  • 警告を表示してすべてのマクロを無効にする(既定):ファイルを開くたびに確認バーが表示され、ユーザーが有効化を選べる。一般的な推奨設定
  • デジタル署名されたマクロのみ有効にする:信頼できる発行元の署名付きマクロのみ実行する。企業内配布向け
  • すべてのマクロを有効にする(推奨しない):危険なマクロを含む悪意あるファイルを開いてしまうリスクがある。個人の開発環境のみで使う

信頼できる場所(トラステッドロケーション)の設定

特定のフォルダを「信頼できる場所」として登録しておくと、そのフォルダ内の.xlsmファイルはセキュリティ警告なしにマクロが自動有効化されます。自分が作成・管理しているマクロファイルを置くフォルダに設定しておくと便利です。

  • 「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」を開く
  • 信頼できる場所」→「新しい場所の追加」をクリックする
  • マクロファイルを保存しているフォルダのパスを入力し「OK」をクリックする
' ========================================
' 現在のマクロセキュリティ設定をイミディエイトウィンドウに表示するコード
' ========================================
Sub CheckMacroSecurity()

    Dim secLevel As Long
    secLevel = Application.AutomationSecurity

    ' MsoAutomationSecurity の値
    ' 1 = msoAutomationSecurityLow(すべて有効)
    ' 2 = msoAutomationSecurityByUI(UI設定に従う)
    ' 3 = msoAutomationSecurityForceDisable(すべて無効)

    Dim levelName As String
    Select Case secLevel
        Case 1 : levelName = "低(すべてのマクロを有効)"
        Case 2 : levelName = "UI設定に従う(標準)"
        Case 3 : levelName = "高(すべてのマクロを無効)"
        Case Else : levelName = "不明"
    End Select

    Debug.Print "マクロセキュリティレベル: " & secLevel & " (" & levelName & ")"
    Debug.Print "Excelバージョン: " & Application.Version
    Debug.Print "XLStartパス: " & Application.StartupPath

End Sub

VBAコードをバックアップする習慣と方法

万が一マクロが消えてしまったときのためにも、VBAコードを定期的にバックアップしておくことが重要です。以下に代表的なバックアップ方法を紹介します。

方法1:VBAコードをテキストファイルに書き出す

' ========================================
' プロジェクト内の全モジュールをテキストファイルとして書き出すマクロ
' VBAエディタに記述して実行する
' 注意:このマクロを実行するには「ツール→参照設定」で
'       「Microsoft Visual Basic for Applications Extensibility」を有効にする必要がある
' ========================================
Sub ExportAllModules()

    Dim vbProj   As Object
    Dim comp     As Object
    Dim savePath As String
    Dim count    As Long

    ' バックアップフォルダを作成
    savePath = ThisWorkbook.Path & "\VBA_Backup_" & Format(Now(), "yyyymmdd_HHmmss") & "\"

    On Error Resume Next
    MkDir savePath
    On Error GoTo 0

    Set vbProj = ThisWorkbook.VBProject
    count = 0

    For Each comp In vbProj.VBComponents

        ' コードを含むモジュールのみエクスポート
        If comp.CodeModule.CountOfLines > 0 Then

            Dim ext As String
            Select Case comp.Type
                Case 1 : ext = ".bas"   ' 標準モジュール
                Case 2 : ext = ".cls"   ' クラスモジュール
                Case 3 : ext = ".frm"   ' フォームモジュール
                Case Else : ext = ".bas"
            End Select

            Dim exportPath As String
            exportPath = savePath & comp.Name & ext

            comp.Export exportPath
            count = count + 1
            Debug.Print "エクスポート: " & exportPath

        End If

    Next comp

    Set vbProj = Nothing

    If count > 0 Then
        MsgBox count & " 個のモジュールをエクスポートしました。" & vbCrLf & savePath, vbInformation
        Shell "explorer.exe """ & savePath & """", vbNormalFocus
    Else
        MsgBox "エクスポートするコードが見つかりませんでした。", vbInformation
    End If

End Sub

方法2:コードをテキストエディタにコピーして保存する

最もシンプルなバックアップ方法です。VBAエディタでモジュールを開き、Ctrl+Aで全選択→Ctrl+Cでコピーし、メモ帳やVS Codeに貼り付けて.txtや.basファイルとして保存します。復元するときはコピーして貼り付けるだけです。

方法3:保存のたびに日付付きバックアップを自動作成する

' ========================================
' Workbook_BeforeSaveイベントで自動バックアップ
' ThisWorkbookモジュールに記述する
' ========================================
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    ' バックアップは上書き保存のときのみ作成(名前を付けて保存時は除外)
    If SaveAsUI Then Exit Sub

    Dim backupFolder As String
    Dim backupPath   As String

    backupFolder = ThisWorkbook.Path & "\Backup\"

    ' バックアップフォルダを作成(なければ)
    On Error Resume Next
    MkDir backupFolder
    On Error GoTo 0

    ' 日付付きファイル名で保存
    Dim baseName As String
    baseName = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)

    backupPath = backupFolder & baseName & "_" & _
                 Format(Now(), "yyyymmdd_HHmmss") & ".xlsm"

    ' 確認ダイアログを抑制してバックアップコピーを作成
    Application.DisplayAlerts = False
    ThisWorkbook.SaveCopyAs backupPath
    Application.DisplayAlerts = True

    ' ステータスバーにバックアップ完了を表示
    Application.StatusBar = "バックアップ作成: " & backupPath

End Sub

方法4:Gitでバージョン管理する(上級者向け)

VBAのコードをエクスポートしてGitリポジトリで管理する方法は、チームでの開発や変更履歴の追跡に非常に有効です。xltrailrubberduck といったVBA向けのツールを使うと、Gitとの連携がしやすくなります。個人での利用であれば、前述の「ExportAllModules」マクロをGitで管理するフォルダにエクスポートするだけで実現できます。


チーム・組織でマクロファイルを共有するときの注意点

マクロを含むファイルをチームや組織内で共有するときには、個人での利用以上に保存形式と運用ルールの徹底が重要です。

共有ルールの徹底

  • チーム内で「マクロを含むファイルは必ず.xlsm形式で保存する」というルールを明文化し、周知する
  • ファイルの保存担当者を決め、形式の変換が起きないよう管理する
  • ファイル名に「_macro」「_マクロ」などの識別子を付けると誤変換のリスクを減らせる(例:売上集計_macro.xlsm)

マクロを配布するときはアドイン(.xlam)形式を検討する

組織全体で使うマクロは、Excelアドイン(.xlam形式)として配布する方法が最も安全で管理しやすいです。アドインとして配布すると次のメリットがあります。

  • データブックとマクロが分離されるため、データブックを誰が保存してもマクロに影響しない
  • マクロを更新するときはアドインファイルだけ更新すればよく、データブックには影響しない
  • マクロを「メニュー」や「リボン」に追加してユーザーが使いやすい形で提供できる
' ========================================
' 現在のブックをアドイン(.xlam)として保存するマクロ
' ========================================
Sub SaveAsAddin()

    Dim addinPath As String
    Dim baseName  As String

    baseName  = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)
    addinPath = ThisWorkbook.Path & "\" & baseName & ".xlam"

    Application.DisplayAlerts = False

    ThisWorkbook.SaveAs _
        Filename:=addinPath, _
        FileFormat:=xlOpenXMLAddIn   ' 55 = .xlam形式

    Application.DisplayAlerts = True

    MsgBox "アドインとして保存しました。" & vbCrLf & addinPath & vbCrLf & vbCrLf & _
           "インストールするには:" & vbCrLf & _
           "「ファイル」→「オプション」→「アドイン」→「Excelアドイン」→「参照」" & _
           "から このファイルを選択してください。", vbInformation

End Sub

マクロ有効ファイルの受け取り側への案内文テンプレート

' ========================================
' マクロファイルの利用案内を生成するマクロ
' ========================================
Sub CreateUsageGuide()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add
    ws.Name = "利用案内"

    With ws
        .Range("A1").Value  = "【マクロファイルの利用案内】"
        .Range("A1").Font.Bold = True
        .Range("A1").Font.Size = 14

        .Range("A3").Value  = "■ このファイルについて"
        .Range("A4").Value  = "このファイルにはVBAマクロが含まれています。"
        .Range("A5").Value  = "必ず「.xlsm形式(Excelマクロ有効ブック)」のまま保存してください。"

        .Range("A7").Value  = "■ ファイルを開いたときに黄色いバーが表示された場合"
        .Range("A8").Value  = "「コンテンツの有効化」ボタンをクリックしてマクロを有効化してください。"

        .Range("A10").Value = "■ 保存する際の注意"
        .Range("A11").Value = "・「Excel ブック (*.xlsx)」形式では保存しないでください(マクロが消えます)"
        .Range("A12").Value = "・保存時に「VBプロジェクトは保存されません」というダイアログが出た場合は"
        .Range("A13").Value = " 「いいえ」を選択し、.xlsm形式で保存し直してください。"

        .Range("A15").Value = "■ マクロが動かない場合"
        .Range("A16").Value = "「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」"
        .Range("A17").Value = "→「マクロの設定」→「警告を表示してすべてのマクロを無効にする」を選択してください。"

        .Columns("A").AutoFit
    End With

    MsgBox "利用案内シートを作成しました。", vbInformation
    Set ws = Nothing

End Sub

マクロが消える原因チェックリスト

「マクロが消えた」「次回開いたらコードがなくなっていた」という状況が起きたとき、以下のリストで原因を特定してください。

  • ファイルを .xlsx形式で保存していないか(タイトルバーのファイル名の拡張子を確認する)
  • 保存時に表示されたダイアログで 「はい」を押してしまっていないか(「VBプロジェクトは保存されません」のダイアログ)
  • Ctrl+Sで上書き保存したとき、現在のファイル形式が.xlsxになっていないか
  • OneDriveの自動保存によって.xlsxへの変換が行われていないか
  • 誰かが「名前を付けて保存」で 形式を.xlsxに変えて保存していないか(チーム共有のケース)
  • 「テンプレートとして保存」してしまい、.xltxとして保存されていないか(.xltxはマクロなし)
  • VBAエディタ(Alt+F11)を開いたとき、プロジェクトエクスプローラーにモジュールが表示されているか確認する
  • 正しく.xlsmで保存しているが セキュリティ設定でマクロが無効化されていないか(「コンテンツの有効化」をクリックしているか)
  • コードを書いたモジュールが 正しいプロジェクト(ThisWorkbook)の配下にあるか(別のブックのモジュールに書いていないか)
  • VBAエディタで記述した後、ファイルを保存せずにExcelを閉じていないか(Excelを閉じるとき「保存しますか?」のダイアログで「保存しない」を押していないか)

まとめ

「Excelマクロを保存したのに次回開いたら消えている」という問題は、.xlsxと.xlsmのファイル形式の違いを理解するだけで完全に解決できます。本記事の要点を整理します。

  • 根本原因:マクロを含むファイルを.xlsx形式(Excelブック)で保存してしまうと、VBAコードはすべて削除される。マクロを保持するには .xlsm形式(Excelマクロ有効ブック) で保存しなければならない
  • 正しい保存手順:F12キーで「名前を付けて保存」を開き、ファイルの種類で「Excel マクロ有効ブック (*.xlsm)」を選ぶ。保存時に「VBプロジェクトは保存されません」というダイアログが出たら必ず「いいえ」を選んで.xlsm形式で保存し直す
  • 形式の確認方法:タイトルバーのファイル名の拡張子が「.xlsm」になっていることを確認する。ファイルアイコンに感嘆符マークが付いていれば.xlsm
  • 自動保存・OneDrive:マクロファイルはローカルドライブへの保存が最も安全。OneDriveに置く場合は自動保存による形式変換に注意する
  • 常用マクロ:特定のファイルに依存しない常用マクロは「個人用マクロブック(PERSONAL.XLSB)」に保存する
  • バックアップ:VBAコードは定期的にモジュールのエクスポートまたはテキスト保存でバックアップする。Workbook_BeforeSaveイベントで自動バックアップを設定すると安心
  • チーム共有:.xlsmでの保存をルール化する。組織全体で使うマクロはアドイン(.xlam)として配布するとデータと分離でき安全に管理できる

一度.xlsmで保存する習慣が身につけば、マクロが消えるトラブルは二度と起きません。また本記事で紹介した「SafeSave」マクロや「Workbook_BeforeSave」イベントによる形式チェックをプロジェクトに組み込んでおくと、誤操作によるマクロ消失を自動的に防ぐことができます。