Excelを使っていると避けて通れないのがVBAです。
VBAとは何ぞやというと、Visual Basic for Applications の略で、MicrosoftのOfficeアプリを操作するためのプログラミング言語です。
「プログラミング言語」というとExcel初心者は「ひっ!」となりますが、今は生成AIの力を借りられるので、さほど扱いには困りません。
VBAは何が得意?
Excelを扱っていて何がしんどいって、大量のデータをあれこれ加工して切ったり貼ったりしてあちこちのファイルにどんどんコピペしてそれを毎日毎週毎月繰り返して…みたいな、定型的で単調で、でも量は多くて、しかも間違えるわけにはいかなくて…みたいな作業だと思います。
そこでVBAの出番です!
VBAは定型的な作業を大量にこなすことができるので、ルーティンワークの効率化の強い味方です。
ExcelのみならずWordやPowerPointなどのOfficeアプリも使えますし、CSVなどのテキストファイルも操作可能。ファイルサーバーのフォルダを開くこともできちゃう。
なので
- システムから出力しておいた売上明細を読み込む
- 売上データを顧客別にまとめる
- 用意しておいた請求書のテンプレートに必要データを書き込む
- 消費税や合計金額などの計算を行う
- 保存先フォルダを作成する
- ファイル名を指定して保存する
- PDF形式にエクスポートする
- 請求書発行ログを記録する
くらいの作業はボタンひとつで完了させることができます。
あなたがやることは、PCが一生懸命働いている間にコーヒーを淹れるだけ。
手始めに「マクロの記録」で作業を自動化
いきなりVBAでコードをすらすら書く必要はありません。
まずはマクロの記録で自分の作業を自動化するところからやってみましょう。
まずは「開発」タブから「コード」の「マクロの記録」ボタンを見つけましょう。

ひょっとすると「開発」がない設定になっているかもしれません。
その場合はリボンの辺りで右クリックし、「リボンのユーザー設定」をぽちっとしてください。
コマンドの選択から「開発」を探して選び、「追加」すれば表示されるようになります。
…ちなみにweb版だと「開発」がなくて、マクロやVBAが使えないんだな。ビジネスプランならOfficeスクリプトの「自動化」で似たようなことはできますが。
とりあえず例として、東京都の市区町村から市だけを取り出す的な作業のマクロを作成してみます。
まずは「マクロの記録」をぽちっとな。
すると、マクロ名やマクロの保存先を訊かれますので、適当に入力して「OK」します。

その後は、Excelのシートでいつも通りに作業するだけ。
フィルターをかけて、可視セルだけコピーして、別のシートに貼り付けて、みたいな流れをぽちぽちやっていきます。

ひと通り作業が終わったら「記録終了」ボタンを押します。
これでマクロ作成の作業は完了です。
これと同じ作業をやろうとするときも簡単。
先ほどの「開発」タブからリボンの「マクロ」ボタンをぽちっとし、名前をつけたマクロを選んで実行するだけです。
というわけで、簡単な作業ならVBAの力を借りずとも「マクロの記録」「マクロの実行」だけでも事足りてしまうのでした。
記録されたマクロのコードはどうなっている?
しかしこれではVBAの学習になりませんから、この先も進めます。
先ほどマクロを作成したときは、ボタンをぽちぽちしただけでコードは1行たりとも書きませんでした。
が、裏ではExcelがせっせとマクロをVBAコード化してくれていたのです。
その内容を確認するには、「開発」リボンから「Visual Basic」ボタンをぽちっとします。

見慣れない画面になりましたね。これがVBAの編集画面です。
Excel初心者には「何これー!」となる画面ですし、ワタシもいまだに「なんかよくわからんわ〜」と思いながら触っています。
マクロを作成した後は、これの左上の「プロジェクト」の中に「標準モジュール」フォルダができていると思います。
その中に「Module1」という何かがあるので、それをかちかちっと開いてください(場合によっては数字が「11」とかになっているかもしれません)。

なんか面妖な文字列が現れました。
これがVBAコードです。
こんな風にマクロを作ればVBAコードも勝手に記載されていくので、自分でVBAコードを書けるようになる必要はありません。
が、「このマクロとこのマクロを組み合わせたい」「この箇所の作業を別のシートでも繰り返したい」と作業効率化を発展させようとすると、マクロの記録ではなくVBAコードを直接編集できる方が断然速いです。
なので、VBAを見て「この辺りでこんな作業をやっているのかなあ」くらいの見当はつけられるようになった方がいいです。
VBAの基本中の基本
VBAの書き方
VBAは「Sub」から始まり「End Sub」で終わる塊になっています。
この塊をプロシージャといいます。
Sub マクロ名()
‘↑「マクロの記録」で設定したマクロ名が入る
MsgBox “こんにちは” ‘メッセージを表示する
End Sub
上のVBAは、マクロを実行すると「こんにちは」と書かれたメッセージボックスが出てきます。
VBA中の「’」以降に書かれた箇所(斜体の部分)はプログラムの実行を飛ばすようになっていて、VBAで何をやっているのかのメモに使ったりします。
セルに値を入力
Sub マクロ名()
Range(“A1″).Value=”こんにちは”
End Sub
Rangeでセルを指定し、Valueでそこに「こんにちは」と入力するよう指示しています。
このRangeの部分をオブジェクト、Valueなど指示する箇所をメソッドと呼びますが、ややこしくなるのであんまり覚えなくていいです。
セルの値を削除
Sub マクロ名()
Range(“A1”).Delete
End Sub
A1に入力されている値を削除する指示です。
なんとなくわかりましたね。VBAはプログラミング言語と聞くと小難しいのですが、基本的には何らかの規則で英語を使って書くコードなので、英単語がわかれば雰囲気は掴めるのです。
「アクティブシートをセレクトしたな」とか「35行スクロールダウンしたな」とか「このセル範囲をセレクトして、コピーして、ペーストしたな」くらいのことはほんのり理解できる。
あとはデータ型を宣言するとか様々な関数を使えるとかいろいろありますが、ガチでVBAを勉強したいわけではなく「普段の作業をちょっと効率化したいな」程度なら、把握する必要はありません。
なぜなら生成AIに聞けば大抵のことはやってくれるから…!
生成AIにVBAコードを修正させてみた
先ほどマクロの記録で作ったVBAですが。

これ、手でやった作業そのままなので汚いし無駄な工程も含まれてしまっています。
これをAIに投げて「修正して?」と頼むと。

わあ、随分スッキリしましたね。
「’」の説明部分(緑文字の箇所)はワタシが書いたわけではなく、AIが追記したものです。
そしてワタシのマクロでは元データをコピーしっぱなしだったので「選択解除も追加しました!」と気を利かせてくれました(コピーしっぱなしだとチラチラうるさいし誤って別の場所に貼り付けちゃう危険があるから)。
ま、このコードはこのコードで特定の範囲しかコピーしないようになっているのでもうちょい修正が必要ですが、ボタンをぽちぽちしただけで作ったマクロからここまでスッキリ書いてくれるので楽な時代になりました。
VBAを書くには、AIと手を取り合って、ステップバイステップで
というわけで作業効率化の道筋が見えましたが、一気にがっつりVBA化するのは難しいと思っておいてください。
冒頭で例に挙げたVBAでやっつけられる作業一連ですが。
- システムから出力しておいた売上明細を読み込む
- 売上データを顧客別にまとめる
- 用意しておいた請求書のテンプレートに必要データを書き込む
- 消費税や合計金額などの計算を行う
- 保存先フォルダを作成する
- ファイル名を指定して保存する
- PDF形式にエクスポートする
- 請求書発行ログを記録する
これも例えば1.の「売上明細が保存されているフォルダ・ファイルを開く」「読み込み先のフォルダ・ファイルを開く」「売上明細の対象データを選択する」「読み込み先の場所を指定し、値貼り付けする」…みたいに細分化して、マクロ作成・VBAをAIを使って修正・動きを確認、とちょっとずつ進めるのをオススメします。
というのも、思わぬところでエラーが出てコードの修正が必要になったり、AIが修正したコードが意図した作業内容ではなかったり、何ならAIの作成したコードが誤っていたりと、何かとトラブルが発生するから。
なに、慣れるとマクロをわざわざ作らなくてもAIのプロンプトが書けるようになってくるし、何ならVBAも「この箇所をコピーすればこっちの作業にも流用できるな」と自分でちょっとは弄れるようになるしで、VBA作成のスピードもアップします。
なので大量だけど単純なステップだけVBA化を試す、みたいなところからスタートしてください。
作業の細分化は面倒ですが、作業の棚卸しはExcel云々以前の、業務効率化の一丁目一番地です。
別にやらなくてもいい作業が紛れていたとか、昔は必要だったけど今は要らないとか、そういう整理をするうえでも、ぼや〜んと自動化するのではなくひとつひとつのステップを見直してみてください。
いやー、生成AIがない時代はVBAを書くのにホントに苦労していまして。
ちゃんと勉強すればいいのに面倒くさがって勉強しないから、見切り発車で作成開始したはいいものの途中で詰まって「多分こういうことできると思うんだけどなあ…」とググりまくる、の繰り返しでした。
それがAIがあるとサンプルデータを見せながら「こういうことしたいんだけど、できる?」と訊くと、サラッと出力してくれますからね。
…たまに間違っているけどね!
年に数えるほどしか発生しないけど半日〜1日潰れる、みたいな作業があったのですが、なんか上手いやり方が思いつかずVBAが書けなくて「ま、たまのことだからいいか…」と諦めてハンドでやっつけていました。
それがAIが使えるようになってVBAを作らせてみたら、半日仕事がものの数分で終わるじゃないですか! ブラボー、AI!
こうして浮いた時間を使って別の作業を効率化するもよし、残業を削って余暇を充実させるもよしです。
まあ、大抵は浮いた時間に別の仕事が割り込んでくるんだけどね! どういうことだろね!
VBAは他人を幸せにするのか
と、ワタシはVBAをこよなく愛用しているのですが、自分だけでなく人様も使うファイルにはVBAを組み込まないようにしています。
ひとつは、ファイルが重くなるから。
ほら、ワタシの世代は容量を軽くしたい呪いにかかっているから…。
なので共有用のファイルの場合、作業終了後はVBAが入ったモジュールをエクスポートして保存するけれど、モジュール自体は削除してしまいます。んで、次回の作業のときにまたモジュールをインポートしてVBAを実行させています。
モジュールの削除やエクスポートは、標準モジュールフォルダ内の「Moduleなんとか」を右クリックすると操作できます。
インポートしたいときはVBAエディタの「ファイル」からイケます。

もうひとつは、VBAはセキュリティ的にイマイチなので。
だから普段マクロに用がない人のExcelは、そもそもマクロを含んだ拡張子「xlsm」を開けないような設定のままだったりしますね。
そして、VBAを扱える人って限られるので、人から見たときに作業がブラックボックス化してしまうのも理由のひとつです。
ワタシもVBAが扱えるというほどのレベルではなく「一応VBAエディタは開きますけれど」くらいの人なので、人様が作ったVBAってモノによっては見ても「???」なんですよね。
丁寧にコメントが残されている場合もあるけど、そもそもワタシに知識が足りないからコメントを見ても「この部分、何やっているんだろう…」となります。
そしてそれを実行するだけならともかく、メンテナンスするとなると「えー」です。
なので人から引き継いだVBAをほとんど使わず、メンテナンスの必要がない箇所だけ引っこ抜いて作り直したなんてこともありました。
自分でVBAを書く場合にはVBAを扱える人用に細かくコメントを残していますが、そもそもExcelの関数で躓く人も多い世の中でVBAまみれにするのもなんだかね…という気がして、それで業務や担当者を見て選びながらVBAを使える箇所だけやっている、というカンジです。
おわりに
- マクロの記録と生成AIで何とかなるから、VBAに臆することなかれ
- VBA化の前に、まずは作業の棚卸し
- VBAの使いどころの見極めは慎重に
と、VBAって便利なんだか不便なんだかという絞め方ですが、半日仕事が数分間で終わるときの快感ったらないよ!
ハンド作業で繰り返すのと違ってミスはなくなるし、ルーティンワークが多い人にはぜひ試していただきたいです。

