CELLNETS Excel開発の専門会社

xlsmをxlsxに変換して保存するVBA|マクロを外して社外に送る方法【VBA中級】

Excel開発のシーンでは、ベースとなるExcelマクロ形式のファイルの更新後、VBAソースの削除が必要となる場合があります。

Excel開発のシーンでは、ベースとなるExcelマクロ形式のファイルの更新後、VBAソースの削除が必要となる場合があります。

みなさん、こんにちは。セルネッツ竹本です。

今回は、「VBAプログラムソース削除の方法」をテーマに、解説をしたいと思います。

結論から言うと、マクロ付きのブック(*.xlsm)からマクロを外すだけなら、VBAソースを1行ずつ消す必要はありません。
送りたいシートを新しいブックにコピーし、「Excel ブック(*.xlsx)」形式で保存すれば、マクロは自動で外れます。

この記事では、次のことがわかります。

  • xlsmとxlsxの違いと、マクロを外して保存する場面
  • 手作業とVBAで、xlsmをxlsxに変換して保存する方法
  • VBAソースそのものを削除する方法と、社外に送る前の注意点

社外送付の自動化

マクロ付きブックを、取引先向けにxlsxで送り直していませんか?

  • 在庫表などを更新するたび、手作業でxlsxに保存し直している
  • マクロ入りのまま社外に送ってしまい、先方で警告が出た
  • 保存→添付→送信の流れを担当者ごとにバラバラに行っている

そのお悩み、社外送付用ファイルの自動作成で解決できます。Excel専門のシステム開発会社『セルネッツ』なら、VBAを除いたxlsx形式での自動保存を作れます。日付入りのファイル名付けや、出力先フォルダへの振り分けもまとめて自動化できます。いまお使いの在庫表や一覧表を活かしたまま仕組み化します。

\Excel専門特化 × 低価格 × スピード対応/

社外送付ファイルの自動化を相談する

全国対応・お見積もり無料

xlsmとxlsxの違い

xlsmとxlsxの違いは、マクロ(VBA)を保存できるかどうかです。
見た目のシートや数式は同じでも、xlsxにはマクロを入れられません。

拡張子ファイルの種類マクロVBAで保存するときの値
.xlsxExcel ブック保存できないxlOpenXMLWorkbook(51)
.xlsmExcel マクロ有効ブック保存できるxlOpenXMLWorkbookMacroEnabled(52)
.xlsbExcel バイナリ ブック保存できるxlExcel12(50)
.xlsExcel 97-2003 ブック保存できるxlExcel8(56)

値はMicrosoftの「XlFileFormat 列挙体 (Excel)」によるものです。
社外の方に渡すなら、マクロの警告が出ないxlsxが安心です。

マクロを外して保存するのはどんな場面か

例えば、部門スタッフが共有している「在庫一覧表.xlsm」の更新後、現在庫情報を出荷担当者へExcel(*.xlsx)でメール添付で送付したい。

要望としては、外部のお客様には、純粋なExcel形式で送付したいケースが多いと思うので、その方法をご紹介します。

保存したxlsxを、そのままメールで送るところまで自動化することもできます。
手順は「VBAでOutlookメール送信する方法と限界」で解説しています。

手作業でxlsxに変換する方法

手作業なら、「名前を付けて保存」でファイルの種類をxlsxに変えるだけです。

  1. xlsmのブックを開き、「ファイル」>「名前を付けて保存」を選ぶ
  2. ファイルの種類で「Excel ブック(*.xlsx)」を選び、「保存」を押す
  3. 「次の機能はマクロなしのブックに保存できません」と出たら、「はい」を押す

これで、マクロを除いたxlsxが別のファイルとしてできます。
元のxlsmはそのまま残りますが、開いている画面はxlsxに切り替わっている点に気を付けてください。

VBAでxlsxとして保存する方法(おすすめ)

VBAなら、シートを新しいブックにコピーし、FileFormat:=xlOpenXMLWorkbookで保存するのがおすすめです。
元のブックには手を加えず、後で説明するセキュリティ設定の変更もいりません。

Option Explicit

Sub M_xlsx形式で保存()
    Dim wbNew As Workbook
    Dim strPath As String

    '保存先(日付入りのファイル名)
    strPath = ThisWorkbook.Path & "\在庫一覧_" & Format(Date, "yyyymmdd") & ".xlsx"

    '送りたいシートだけを新しいブックにコピー
    ThisWorkbook.Worksheets("在庫一覧").Copy
    Set wbNew = ActiveWorkbook

    'マクロなしのブック(xlsx)として保存
    Application.DisplayAlerts = False
    wbNew.SaveAs Filename:=strPath, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True

    wbNew.Close SaveChanges:=False
    MsgBox "保存しました。" & vbCrLf & strPath
End Sub

ポイントは次の3つです。

  • 複数のシートを送るときは、Worksheets(Array(“在庫一覧”, “出荷予定”)).Copy のように並べる
  • シートのモジュールに書いたコードもコピーされますが、xlsxで保存した時点で外れる
  • DisplayAlerts = False で、「マクロなしのブックに保存できません」の確認を出さずに保存する

保存の処理があちこちのマクロに散らばっている場合は、1か所にまとめると管理が楽になります。
考え方は「Save As ステートメントを1Moduleに集約して分散管理を回避」をご覧ください。

VBAソースそのものを削除する方法

コピーしたブックからコードを消しておきたい場合は、VBProjectの各モジュールのコードを全行削除します。
この方法は、事前にセキュリティ設定を変える必要があります。

【注意】VBAプロジェクトオブジェクトモデルへのアクセスを信頼する(V)
マクロ実行環境のPCでは、以下の設定が必要になります。
既定値はチェックがありませんが、オンにしないと実行時エラーが発生するので、留意してください。

設定の場所は、「ファイル」>「オプション」>「トラスト センター」>「トラスト センターの設定」>「マクロの設定」です(バージョンによっては「セキュリティ センター」と表示されます)。
「開発」タブの「マクロのセキュリティ」からも開けます。

トラストセンターの「マクロの設定」で、「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックを入れた画面

Microsoftサポートの説明では、この設定は既定でアクセスを拒否する、開発者向けの設定です(Excel のマクロのセキュリティ設定を変更する)。
コード中のコメントにある「ツール>マクロ>セキュリティ」は古いExcelの操作なので、上の手順に読み替えてください。

以下のModuleをCallします。

Option Explicit

'★★★ 不要オブジェクト削除用~外部保存における活用
Public P_BufBookModule削除用 As Workbook
Public P_VB_CompoModule削除用 As Object

'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Sub M_VBAソース削除()
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
'ツール>マクロ>セキュリティ>信頼できる発行元>Visual Basic プロジェクトへのアクセスを信頼するにチェック

   '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    '★ 自分自身のSheetモジュール(プロシージャ)を削除
    '★ VBA「プロジェクトへのアクセスをすべて信頼する」ONが前提
    '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

        Dim lngLines As Long

        Set P_BufBookModule削除用 = ActiveWorkbook  ' 対象シートをコピーした新規ブック

        '-----(↓VBProjectに対するアクセスが許可されていない場合はエラー
        '-----( VBProject内の各コンポーネントのコードを削除

        For Each P_VB_CompoModule削除用 In P_BufBookModule削除用.VBProject.VBComponents

            With P_VB_CompoModule削除用.CodeModule

                lngLines = .CountOfLines  ' コードを削除(全行)

                If lngLines <> 0 Then .DeleteLines 1, lngLines

            End With

        Next P_VB_CompoModule削除用

End Sub

これで、VBAソースが削除されるので、xlsx 形式の保存が可能になります。

赤字の「Dim lngLines As Long」は、今回追加した1行です。
Option Explicitがあるため、この宣言がないと「変数が定義されていません」というコンパイルエラーになります。

また、このModuleは、実行したときに前面にあるブック(ActiveWorkbook)のコードを消します。
必ずシートをコピーした新しいブックを前面にしてから呼び出してください。元のxlsmで実行すると、元のソースが消えてしまいます。

2つの方法の比較

社外に送るxlsxを作るだけなら、コピーしてxlsxで保存する方法で十分です。

比べる点コピーしてxlsxで保存VBAソースを削除
セキュリティ設定の変更いらない必要(使うPCごと)
元のブックへの影響なし対象を間違えると元のソースが消える
コードの量数行コピーと保存の処理も別に必要
向いている場面社外送付・定期的な配布xlsmのまま、コードだけ空にしたいとき

社外に送る前の注意点

マクロを外しても、ブックの中には見えない情報が残ることがあります。送る前に次の5点を確認してください。

信頼の設定はオンのままにしない

「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」は、他のプログラムからもVBAを書き換えられる状態にする設定です。
ソース削除の方法を使った場合も、作業が終わったらオフに戻しましょう。

マクロを登録したボタンを残さない

図形やボタンに登録したマクロは、コピー先でも元のブックのマクロを指したまま残ります。
先方で押すと、元のブックを探してエラーになるため、送るシートからは削除しておくと安心です。

非表示のシートが一緒に渡らないか

手作業でブックごと保存すると、非表示のシートもそのまま相手に渡ります。
VBAで「再表示」できないようにしたシートも同じです(存在するシートなのに表示させない方法~xlSheetVeryHidden)。送るシートだけをコピーする方法なら防げます。

名前の定義や元ブックへのリンクが残らないか

シートをコピーすると、名前の定義も一緒に付いてきます。
コピーしなかったシートを参照する数式は、元のブックへのリンクになり、先方で「リンクの更新」の確認が出ることがあります。
数式を値に変えるか、不要な名前を消しておきましょう(不要な「名前の定義」を一括削除する方法)。

同じ名前のファイルを上書きしない

DisplayAlerts = False にすると、同じ名前のファイルがあっても確認なしで上書きされます。
ファイル名に日付を入れるなど、前回の送付ファイルを消さない工夫をしてください。

社外に渡す前のブックの点検項目は、「Excelシステム~納品前ブック点検【重要7項目】」にまとめています。

よくある質問

拡張子を「.xlsx」に書き換えるだけではだめですか?

だめです。ファイルの中身はxlsmのままなので、開くときに「ファイル形式またはファイル拡張子が正しくありません」と表示されて開けません。
必ず「名前を付けて保存」かVBAのSaveAsで、形式を変えて保存してください。

xlsxで保存したあと、マクロを元に戻せますか?

戻せません。xlsxで保存した時点で、マクロは削除されます。
元のxlsmは上書きせず、別のファイルとして残しておきましょう。

確認メッセージを出さずに保存するには?

保存の直前に Application.DisplayAlerts = False を書き、保存が終わったら True に戻します。
途中でエラーが出ると戻らないことがあるため、エラー処理の中でも True に戻すと安全です。

まとめ

  • xlsmとxlsxの違いは、マクロを保存できるかどうか
  • マクロを外すだけなら、シートをコピーしてxlsx(51)で保存する方法がおすすめ
  • VBAソースを削除する方法は、信頼の設定と、対象ブックの取り違えに注意
  • 送る前に、ボタン・非表示シート・名前の定義・上書きを確認する

今回のテーマは、「VBAプログラムソース削除の方法」について、解説を行いました。

本記事が、Excel実務の効率化において、ご参考お役立てになれば幸いです。

相見積もり歓迎

ファイル出力の自動化は、小さな規模から始められます

  • データ変換の仕組みは8万円〜(税別)が参考価格です
  • 複数フォーマットへの変換は20万円〜(税別)が目安です
  • Excelでやるべきでない処理なら、正直にお伝えします

セルネッツでは相見積もりを歓迎しています。料金は基本料金50,000円に、要件定義・設計・開発の時間単価を加えた体系です(税別)。Excelより別の方法が合う場合は、その旨を正直にお伝えします。システム導入相談やセカンド・オピニオンも、60分無料で承ります。

\Excel専門特化 × 低価格 × スピード対応/

無料見積もり・お問い合わせはこちら

全国対応・お見積もり無料


関連記事

Excelシステム開発

Excelを複数人で共同編集する方法|オンライン共有の手順と事例

更新日:2026年11月4日

Excelシステム開発

システム開発の依頼ガイド|費用相場・流れ・会社の選び方と「作りすぎない」判断軸

更新日:2026年9月24日

Excelシステム開発

予約システムの開発依頼にかかる費用相場|小規模店舗は100万円以下で作れる

更新日:2026年9月24日

Excelシステム開発

CRMシステム開発の外注費用は?依頼先の選び方と100万円以下に抑える考え方

更新日:2026年9月24日

Excelシステム開発

勤怠管理システム開発の外注費用相場|100万円以下で作る方法とプラン別料金【2026年版】

更新日:2026年9月24日

Excelシステム開発

SFAシステム開発の依頼相場は?高額SaaSに払い続ける前に知るべき「安く作る」現実解

更新日:2026年9月24日

Excelシステム開発

業務システム開発の依頼はいくら?費用相場と「100万円以下」で頼む方法

更新日:2026年9月24日

Excelシステム開発

受発注システム開発の費用相場は?外注料金の内訳と安く抑える方法を解説

更新日:2026年9月24日

Excelシステム開発

販売管理はエクセルで十分?売上管理表・発注管理表の作り方と「限界」の乗り越え方

更新日:2026年11月4日

newsite