「VBA で便利なものを作ったよ。GitHub に上げといたから、モジュールをダウンロードしてインポートして使ってね」と人に言う場合、注意すべき点がいくつかあります。
- VBA モジュールのインポートは敷居が高い
自分で便利って言ったらハードルが上がる
経験のない人が「モジュールのインポート」なんて聞いたら、その時点で挫折してしまうかもしれません。夢破れたり。
というわけで、一連の流れをまとめておこうと思った次第です。「GitHub からダウンロードしてインポートしてね」と言う予定のある方、あるいは言われた方のお役に立ちますように。
実行環境
- Windows 10 Home 21H2 (OB Build 19044.1645)
- Microsoft® Excel® 2016 MSO (バージョン 2204 ビルド 16.0.15128.20158) 64 ビット
- Microsoft Visual Basic for Applications 7.1
「はじめからモジュールをインポートした状態で配布してくれよ」というごもっともなお声
そもそもモジュールというのは、マクロのコードが書いてあるファイルのことです。ワークシート(セルがたくさんあるやつ)とは別になっていて、Excel ファイルから分離させて単体で配布することができます。
モジュールのインポートというのは、分離させたモジュールを再び Excel ファイルにくっ付ける作業です。
つまり、今読者のみなさんは、わざわざ切り離したモジュールファイルをくっ付けなおすという目に遭っているわけです。コメディー。
はじめからマクロ付きの状態で配布してくれというお声はごもっともです、はい。しかしこちらにも様々な事情がありまして……
プログラムを書く際、変更履歴を残しておくことが重要になります。こうすることで、もしも上手くいかなくなっても簡単にやり直せるからです。その変更履歴を記録する仕組みとして GIt や GitHub というものを使うのですが、そこでは Excel ファイルそのものを管理できません。ですので、モジュールだけを分離して、Excel ファイルとは別に扱っているのです。
また、セキュリティの観点からも、マクロ付きファイルのダウンロードは推奨できないのです。
- ダウンロードしたVBAマクロは既定でブロックへ ~「Microsoft Office」攻撃への対策を強化 - 窓の杜
- マルウェアEmotetの感染再拡大に関する注意喚起
- マルウェア「Emotet」の新たな攻撃手法をIPAが公開。Excelファイルの悪用、偽PDF閲覧ソフトをダウンロードさせる手口にも注意を - INTERNET Watch
そんなわけで、モジュールをインポートしてみましょう!
流れ
- 準備
- 拡張子を表示する
- ダウンロード
- ZIP ファイルをダウンロードする
- ZIP ファイルを展開する
- インポート
- Excel ファイルを開く
- 開発タブを表示する
- VBE を開く
- モジュールをインポートする
- 保存する
準備
拡張子を表示する
まずは事前準備です。今回の作業をするにあたって、フォルダ上でファイルの拡張子を表示するように設定しましょう。
拡張子というのは、とてもざっくり言うと、ファイルの種類を表す目印です。.xlsx
や .docx
、.pdf
、.jpg
、.ps1
のような「ドットなんとか」の形で、様々な種類があります。適当なフォルダを開いてファイル名を眺めたときにすでに末尾に付いていれば、この準備は不要です。付いていない場合は、次の手順で表示してください。
- 適当なフォルダを開く
- [表示] タブを開く
- [表示/非表示] グループの [ファイル名拡張子] にチェックを入れる
ファイル名の末尾に拡張子が付いたことを確認してください。一度設定すると、全てのフォルダで拡張子が表示されます。
ダウンロード
ZIP ファイルをダウンロードする
VBA モジュールをダウンロードしましょう。「GitHub からダウンロードしてね」と言われたときに、ダウンロードページの URL をもらったはずです。そのページに行きましょう。
以下のように、https://github.com/<アカウント名>/<プロダクト名>
の URL の場合は、そのプロダクトのトップページが開きます。
https://github.com/taidalog/X2P-QuizMaker
この場合は、緑の "Code" ボタンをクリックして "Download ZIP" からダウンロードしましょう。
一方、以下のように、https://github.com/<アカウント名>/<プロダクト名>/releases
の URL の場合は、そのプロダクトの、バージョンごとのダウンロードページが開きます。
https://github.com/taidalog/X2P-QuizMaker/releases
この場合は、最新バージョンの枠内の "Source code (zip)" をクリックしてダウンロードしましょう。
ZIP ファイルを展開する
ダウンロードしたら、その ZIP ファイルを展開(解凍)してください。その中の、拡張子が .bas
のファイルが VBA モジュールです。
インポート
では本命のインポートです。
Excel ファイルを開く
モジュールをインポートする Excel ファイルを開いてください。それ以外の Excel ファイルは閉じておくことをおすすめします(理由は後述)。
開発タブを表示する
次に、[開発] タブを表示します。[開発] タブというのは、マクロを作る上で使う機能が詰まったタブです。
[ファイル] タブ > [オプション] タブの順でクリックします。
[Excel のオプション] ダイアログが開いたら、[リボンのユーザー設定] の [メイン タブ] で「開発」にチェックを入れて [OK] をクリックします。
[開発] タブを表示できました。
VBE を開く
[開発] タブから VBE を開きます。VBE というのは、マクロの編集などを行う画面のことです。
実は VBE は Alt
+ F11
で開けるのですが、それ以外の機能も詰まっているので、[開発] タブは是非表示してください。
モジュールをインポートする
VBE の左上に、現在開いている Excel ファイルが並んでいます。
複数開いていると、この欄にファイルが複数並んで訳がわからなくなるので、前述の通り使わないファイルは閉じておきましょう。
インポートする Excel ファイルを右クリックして「ファイルのインポート(I)...」をクリックしてください。
ファイルの選択ダイアログで、先程ダウンロードして展開したモジュールファイル (.bas
) を選択し、[開く(O)] をクリックしてください。
インポートするモジュールが複数ある場合は、この操作を繰り返してください。
インポートしたら、「標準モジュール」というものが出現します(既にファイルにマクロが入っていた場合は、はじめからあったはずです)。
「標準モジュール」をダブルクリックするか、その左端の「+」をクリックして開くと、モジュールファイル (.bas
) と同じ名前(この場合は "main")のものがあるはずです。そうなっていればインポート成功です! おめでとうございます!
せっかくですので、これをダブルクリックして開きましょう。
パスワードがかかっていなければコードを見られます。かかっていたら諦めてください。
最後に保存したらおしまいなのですが、注意点があります。このまま読み進めてください。
保存する
モジュールをインポートした Excel ファイルの拡張子によって、保存の仕方が変わってきます。ここで間違えると、せっかくインポートしたモジュールが消えて今度こそ心が折れます。最後までお気を付けて。
.xlsm
または.xlam
そのまま上書き保存してください。
元々マクロが入っているので、ファイルがマクロに対応しています。.xlsx
名前を付けて保存で「Excel マクロ有効ブック(*.xlsm)」を選択してください。.xlsm
ファイルとして保存したら、今後はその.xlsm
の方を使ってください。
「Excel マクロ有効ブック(*.xlsm)」に変更せず、.xlsx
のままで上書き保存しようとすると、以下の画面が出ます。「はい(Y)」を選択するとインポートしたモジュールが消えます。「いいえ(N)」を選択すると、名前を付けて保存の画面になります。.xls
このままでもマクロを保存できるのですが、.xls
ファイルはウィルスの感染経路として悪用されやすいので、.xlsm
として保存しなおしてほしいと思います。
.xlsx
と同じ手順で名前を付けて保存してください。- 新規ファイル(=まだ一度も保存したことがない)
名前を付けて保存で「Excel マクロ有効ブック(*.xlsm)」を選択してください。
ThisWorkbook モジュールを編集
モジュールのインポートの他に、ThisWorkbook
モジュールも編集するように言われる場合もあります。拙作ですとSuwarinやX2P-QuizMakerで必要になります。以下に手順を示しますので、どうか最後まで諦めずに頑張ってください。
VBE で、編集したいファイルの ThisWorkbook
モジュールをダブルクリックして開いてください。白紙かもしれませんし、すでに何か書いてあるかもしれません。
必要に応じて編集してください。たとえば、以下のコードを追加する場合、
Private Sub Workbook_Open() Call AddToContextMenu End Sub
ごく普通にコードをコピーして貼り付けるだけでいいです。もしも既にコードが入っていた場合は、それより下に貼り付けてください。
Private Sub <...>()
の <...>
の部分が同じコードが既に入っていた場合、基本的に以下のようにしたらいいと思うのですが……コードによってどうなるかわかりませんので、「インポートして使ってね」って言ってきた人に聞いてください。
↓これを貼り付けようと思ったけど
Private Sub Workbook_Open() Call AddToContextMenu End Sub
↓ Private Sub Workbook_Open()
が既にあった場合、
Private Sub Workbook_Open() ThisWorkbook.Worksheets(1).Select ThisWorkbook.Worksheets(1).Cells(1, 1).Select End Sub
↓ End Sub
の前に追加すればいいと思われます。
Private Sub Workbook_Open() ThisWorkbook.Worksheets(1).Select ' 元からあったコード ThisWorkbook.Worksheets(1).Cells(1, 1).Select ' 元からあったコード Call AddToContextMenu ' 追加したコード End Sub
↓こうするとエラーが出ます。
Private Sub Workbook_Open() ThisWorkbook.Worksheets(1).Select ThisWorkbook.Worksheets(1).Cells(1, 1).Select End Sub Private Sub Workbook_Open() Call AddToContextMenu End Sub
編集し終わったら保存してください。
結び
モジュールのインポートって慣れないと難しいですよね。また、Git や GitHub でバージョン管理するのも、いちいちエクスポートするのがめんどうです。この機に PowerShell を始めてみてはいかがでしょうか!
F# も面白いですよ!
変更履歴
- 「モジュールをインポートする」の表記を訂正 (2022/05/05)