分析と広告のためのCookie
分析と広告のためにCookieを使っており、どちらもGoogleに送られます。拒否しても、目に見える動作は何も変わりません。プライバシーポリシーを読む
XLSM
マクロを内側に抱えた Excel ブックです。
XLSM
XLSM はコンテナです。誰か別のものが符号化した流れを、中に収めておく外殻です。 編集のために使われます。
拡張子は .xlsm、正式名称は Excel Macro-Enabled Workbook です。ただしどちらも、そのファイルが中に何を持てるかほどには多くを語りません。このページの残りは、その中身についての話です。
Microsoft が 2007 年に公開しました。 仕様は ECMA-376 です。
古さが役に立つのは、ごく実務的な理由からです。形式が古いほど、それを覚える時間が多くのプログラムに与えられてきたということだからです。
仕様書がそのまま公開されているので、中身を推し量るのではなく文書を読んで実装できます。この形式が数多くのプログラムに載っているのはそのためであり、20 年前に書かれたファイルが今も開けるのもそのためです。ただし「仕様が公開されている」ことと「使用料が要らない」ことは別の話です。中でコーデックを包んでいる形式では、特許のライセンスは仕様書が答えていない別の問題として残ります。
XLSM ファイルは 1 ページに縛られていません。1 ページしか持てないものへ変換するときには、これが効いてきます。1 回の変換で出てくるのは 1 ページぶんのファイル 1 つで、取られるのは先頭のページです——どのページを取るかを選ばせてくれる変換であれば、そのページになります。
XLSM ファイルは実行されるコードを一緒に運べます。そして、この拡張子と関わることになる理由はたいていそこにあります——メールサーバーか、文書提出のポータルに弾かれたのです。マクロを持てない形式へ変換するのがよくある逃げ道で、そのあとマクロが残らないのはご想像のとおりです。
XLSM の中身は表計算です。セルと数式、そしてそれを囲むシートでできています。
これが変換のされ方を決めます。表計算は印刷の領域になり、列をどこで折るかは誰かが決めなければなりません。
Microsoft Excelが読めますし、同じ種類のプログラムならたいてい読めます。
ファイルが開かないとき、形式が悪いことはめったにありません。たいていはプログラムのほうが形式より古いのです。もっと古い形式に変換してしまうのが確実な逃げ道で、このサイトの残りの部分はそのためにあります。
これを読めるブラウザーはありません。
これを変換するいちばんよくある理由がこれです。形式が悪いのではありません。ファイルを見せたい場所が、それを読めないというだけのことです。
XLSM は、開いて手を入れるために作られています。作業が続いているあいだはこの形式でファイルを持ち、完成したものが必要になるたびに、ここから書き出してください。
XLSM と XLSX は同じ形式です。どちらも XML を詰めた ZIP パッケージで、どちらも同じシート、数式、書式を持ち、唯一の違いは XLSM が VBA プロジェクトを含められて XLSX は含められないという点です。
この分離こそが目的でした。2007 年より前は、ワークブックは拡張子に何の表示もないままマクロを含められ、スプレッドシートは史上最も効果的なマルウェア配布経路の一つでした。拡張子を分けることで、受け取った人は何かを開く前に、そのファイルが VBA プロジェクトを持つと主張しているかどうかを見分けられます。これは「安全」とは違います。DDE の数式や埋め込まれた OLE オブジェクトは普通の XLSX にも存在するからです。それでも、あらゆる受け入れルールがこの区別の上に成り立っています。
VBA はファイルシステム、ネットワーク、他のアプリケーションにアクセスできる本格的なプログラミング言語です。マクロは、そのユーザーがアクセスできる場所ならどこでもファイルを読み書きでき、データを外部に送信し、プログラムを起動し、他の文書を変更できます。シートの中に閉じた数式言語ではありません。
これが、この警戒の正直な理由です。マクロの圧倒的多数は、同僚が書いた、まさに説明どおりのことをする業務自動化です。そうではないわずかな数のマクロも同じ能力を持ち、コードを読む以外にそれらを見分ける方法はファイルの中にありません。
Excel は既定でマクロを無効にし、バナーを表示します。ファイルがインターネットやメールの添付ファイルから来た場合、Windows はさらにゾーンフラグを付け、2022 年以降 Excel はそうしたファイルのマクロを完全にブロックします。有効化ボタンではなく赤いバナーが表示されるだけです。
信頼できるファイルへの意図された対処は、ファイルのプロパティでブロックを解除するか、信頼できる場所として設定したフォルダーに置くことです。抵抗すべきなのは、深く考えずにクリックして通過させる習慣です。このブロックが存在するのは、まさにそのクリックが、非常に多くの実際のインシデントの最後の一歩だったからです。
VBA プロジェクトは ZIP の中にバイナリのストリームとして保存されていて、Office Open XML パッケージの中で唯一、読めるXML ではない部分です。ファイルを .zip に改名して中を見ると、シートはプレーンテキストで見える一方、マクロは読めない塊のまま見えます。
つまりマクロを確認するには Excel か LibreOffice の VBA エディターを開く必要があり、これはほとんどの人がやらないことであると同時に、そのワークブックが何をするかを知る唯一の確実な方法です。これはまた、バージョン管理がそのコードの意味のある差分を示せないことも意味し、本格的なスプレッドシートの自動化が最終的に VBA を離れ、テキストファイルの中で完結する何かへ移行していく理由でもあります。
XLSM を XLSX として保存すると、VBA プロジェクトは取り除かれ、シート、数式、書式、グラフ、名前付き範囲といったそれ以外はすべて残ります。Excel は実行前に警告を出し、その警告がすべてです。
外部から受け取り、数値を読むだけでよいワークブックにとっては、まさにこれが望ましい結果です。逆に、自動化そのものが目的のファイルにとっては望ましくありません。区別は単純です。ボタンを押すと何かが起きるワークブックなら、変換するとそれが壊れます。単にデータを保持しているだけなら、変換すると安全になります。
送る、保管する、印刷するなら PDF です。結果は固定され、実行可能なコンテンツを一切持たず、レイアウトの問題とマクロの問題を一度に取り除きます。マクロ主導のワークブックが生成したレポートを配布するなら、これがほぼ常に正しい出力形式です。
行き先がデータベースやスクリプト、分析パイプラインなら CSV です。一枚のシートの値だけを運び、数式も書式もコードも持ちません。まさにそれゆえに、取り込みルーチンやセキュリティを重視するシステムがこれを名指しで求めます。
ある部署の仕事のやり方そのものになってしまった VBA プロジェクトは、負債と呼ぶ価値があります。コードはバージョン管理にとって不透明で、Excel が動く場所でしか動かず、シートの名前を変えると壊れ、たいてい担当していた一人がすでに異動したあとです。
Microsoft 自身の方向性は、そうした作業には Office Scripts や Power Automate です。Microsoft の外では、ファイルを直接読む小さなスクリプトを別の言語で書けば、差分の取れるファイルの中で同じ仕事ができます。どちらも、動いているマクロを書き直す理由にはなりません。ただし、百人が依存することになる新しいマクロを書く前には、知っておく価値があります。
| 拡張子 | .xlsm |
|---|---|
| メディアタイプ | application/vnd.ms-excel.sheet.macroEnabled.12 |
| 公開元 | Microsoft |
| 初版 | 2007 |
| 仕様 | ECMA-376 |
XLSM は VBA マクロを含められ、XLSX は含められないという点だけです。それ以外はまったく同じで、どちらも同じシート、数式、書式を持つ XML を詰めた ZIP パッケージです。拡張子を分けているのは、受け取った人が開く前に、そのファイルがコードを持つと主張しているかどうかを見分けられるようにするためです。
Excel が既定でマクロを無効にしているためで、2022 年以降はインターネットやメールの添付ファイルから来たファイルではマクロを完全にブロックします。信頼できるファイルなら、ファイルのプロパティでブロックを解除するか、信頼できる場所に置いてください。このブロックが存在するのは、そのクリックが多くの実際のインシデントの最後の一歩だったからです。
マクロを無効にしたまま開くのは XLSX を開くのと同じくらい安全です。マクロを有効にすることが本当の判断で、VBA はファイルシステム、ネットワーク、他のアプリケーションに完全にアクセスできます。出どころを実際に知っているファイルにだけ有効にしてください。
XLSX として保存してください。VBA プロジェクトは取り除かれ、シート、数式、書式、グラフといったそれ以外はすべて残ります。Excel が先に警告を出し、その警告がすべての操作です。
Excel か LibreOffice の VBA エディターを開く以外に方法はありません。コードはパッケージの中にバイナリのストリームとして保存されているため、.zip に改名するとシートは読める XML として見えますが、マクロは読めない塊のままです。
ファイルを開いてデータは保持できますが、VBA を確実には実行できません。二つのアプリケーションは異なるオブジェクトモデルを持つ異なるスクリプトシステムを使っているためです。単純なマクロを超える部分は、翻訳ではなく書き直しが必要です。