
【入門編】マクロをイチから勉強する事が出来る
この記事はエクセルVBAを勉強しコードを自在に操って業務を改善させたいと思っている方をサポートする為に用意しました。

この記事だけでもマクロについて勉強する事は可能はですがさらに特典があります。
関連記事に2分動画を12本用意して動画と記事の内容を組み合わせてマクロを学ぶことが出来るコンテンツにしています。文字で理解するよりはるかに分かり易いです。
加えてこの記事でも1時間の仕事を30秒にした動画を用意しています。よってTOTALで25分30秒の動画を用意しています。
後半に用意されている関連記事は実際にコードを書いているところを動画にしています。コードの書き方も学べる仕様になっています。
記事のターゲット
初心者様を想定しています。具体的には以下の様な方々です。
- これからマクロの勉強を始めようと思っている方
- 独学でマクロの勉強を始めてみた方
- マクロを一度勉強してみたけど挫折してしまった方
このような方々が自力でコードを書いてマクロを構築出来る様にサポートさせていただきます。
この記事を読むとわかる事
「ExcelのVBAという言語を使って自身の業務をマクロに置き換える事が出来る」ようになります。
何故このコンテンツで勉強するとマクロを使える様になるのかというと「挫折しにくいから」です。
その理由は「勉強初期に覚える必要がある事をインプットして覚えなくても良い事を省いているから」です。
最初から全体を見なくてよい
世の中のテキストはVBAを体系的に覚えようとして学習範囲を広く設定しています。私の経験と多くの方と会話した結果からこの学習範囲は広すぎると考えています。
私はVBAを習得し約7年が経過しました。ここ数年は毎年数千時間の業務改善を行っています。加えてオンラインで全国の方にVBAを教えています。外国籍の方とも勉強会を開催してきました。
自分で勉強してきた経験とVBAを勉強をしたいと考える多くの方々と会話する中で感じた事を合わせると「最初はもっと小さい範囲でVBAについて勉強するべき」という結論に達しました。
コンパクトに考える
初心者のうちは教材の選定や勉強の始め方、全て分かりません。そうなると広く情報を取りに行きます。これは当然の事ですので仕方ないと思っています。
そこで得た大きい情報をもってVBAの勉強を始めてしまうので情報が処理出来ず挫折するというプロセスを辿ります。これが勉強を始めた人が挫折するプロセスで一番多いパターンです。
適切な勉強範囲の中で最短でマクロを習得するにはここに書いてある順番で勉強を進めていただくことが何より大事です。

この記事群をマクロ入門編のテキストだと思ってください。効率良くマクロを学ぶことが出来ます。
- 序盤の勉強の進め方
- 勉強初期に必要な考え方や機能
- 難しい考え方や機能との付き合い方

マクロ
記事の読み方
この記事の取り扱い説明書です。大きく分けて3つです。
- 3部構成です
- 1番目は用語の定義や開発環境の整備について勉強するブロックです
- 2番目はコードの成り立ち、使い方について勉強するブロックです
- 3番目は実際にコードを書いて実行する為の方法を勉強するブロックです
- 2分×12本の動画付き記事が用意れています
- ポイント毎に短い動画を用意。
- 動画付き記事は「必ず見る」必要は無いです。この記事で勉強は完結します。
- 分からなくなっても気にしない事です
- まずは一通り読んでください。再び見直すと理解出来る事もあります。
- 前から順に読む必要は無いです。理解出来るところから勉強してください。
目次は右側サイドバーにも表示されています。気になるところから読み進めてください。

ここからマクロの勉強が始まります。よろしくお願いします。
用語の定義や開発環境について
3つあるブロックの中における最初のブロックです。手を動かすというより知識をインプットする為のブロックになります。まずはマクロやVBAの定義を明確にしましょう。
これから勉強する為の対象が良く分かってないと勉強自体がぼやけてしまいます。分かってるつもりでも一読してください。
続いてマクロを書く場所についてもこのブロックで解説していきます。
マクロとはなにか
最初は用語の定義の話をしていきます。マクロとはなにか?について考えます。
早速結論です。「マクロとは作業の集合体」です。個々の作業をまとめて1つにしたものです。複数の手数がかかる仕事を1つに出来ます。
ここはあっさり進みます。この後の動画でより詳しく説明します。
できること
基本的に「Excelでやる事はなんでも出来る」と思ってください。色々書くより映像の方がインパクトあるので動画を用意しました。約1分半の動画です。
画面左のフォルダ内にdummy.xlsmというデータがあります。画面右側にdummy.xlsmを展開しています。
このデータには疑似的に作った個人情報が1万件掲載されています。データ内の住所に書かれた都道府県をもとに各情報を.xlsxファイルに1クリックで仕分けてみます。

マクロはこんなことも出来るんですよ。
手作業を想定してみましょう。47都道府県ごとにデータを用意します。1ファイル1分で作業しても最低47分かかりますね。疲労や見直しも入れると1時間前後はかかりそうです。
これぐらいの仕事量はマクロに置き換えると1クリックで30秒です。
以下グラフをご覧ください。手作業とマクロの作業時間の差を表現しました。99%以上の作業時間短縮が実現出来ます。
一見嘘みたいなデータですが動画で見ていただいた通り事実です。
マクロは時間と余裕を生み出す
手数がかかる仕事を適当に作った結果このようなデータを用意する事になったのですがこんな感じの手数がかかるルーティン作業は世の中にたくさんあります。
このような集計作業が毎日があったとしましょう。1ヶ月20日出勤で計算するとおよそ20時間/月はこの仕事の為に時間を使う事になります。
でもマクロなら30秒/回なので月単位で計算すると10分程度です。
これで毎月会社で19時間50分は何してても良い時間が生まれます。この時間でまた勉強するとさらに余裕が生まれます。
マクロの記録
動画のようなマクロを作るにはそれなりのトレーニングが必要ですがエクセルには「マクロの記録」という機能があります。簡単なマクロなら誰でも作る事が出来ます。
関連記事ではマクロの記録の使い方について動画で解説しています。ご覧いただけるとより理解が進みます。
関連記事エクセルの便利機能マクロの記録を使ってマクロを2分の動画で解説
VBAとはなにか
まずは結論です。VBAはプログラミング言語の名前です。正式名称はVisual Basic for Applicationsです。

Visual Basic というプログラミング言語をベースにMicrosoftさんのアプリケーションに特化して開発された言語です。
マクロの記録で生成されるコードや自分でコードを書く際はこのVBAという言語がベースになります。
他の言語との関係性
関連性は大いにあります。私Visual Basic も勉強してます。Visual Basicはコード自体VBAと似ていて考え方もほとんど同じです。
世の中の流れからするとVisual Basic を勉強する機会自体は少ないのですがVBAはVisual Basic の勉強にもなります。
他の言語の勉強になるか?という観点からいくと勉強になります。理由は変数や繰り返し処理、条件分岐などの個別の機能はPythonやJavaScriptなどにも用意されている為です。
書き方が違うだけで考え方はすごく似ています。よってVBAは色々な言語を勉強する前に学習する言語としては入り易く勉強し易い言語だと言えます。
Editorなどの環境が整っている
プログラミング言語は言語の勉強に入る前に環境構築という非常に大変な仕事があります。環境構築には「コードを書く場所を用意する」という仕事も含まれています。
基本的にはどの言語もEditor(エディターとよみます。言語を書く為のアプリケーションです。)を別でインストールして設定を整える必要があります。
VBAはこれをやる必要が無いです。既にExcelが持っているからです。環境構築はコードを書く前の序盤にやる作業です。よって知識がない中で行う事になる為非常に大変です。
環境構築をショートカット出来るのもVBAの強みです。
VBAでコードを自作する必要はあるのか
この段階でいただく質問の中で多いものを紹介します。
- マクロの記録があるならVBAでコードを書かなくても良いのでは?
- エディターの知識は必要なのでしょうか?
まとめると「コードを自力で書く必要はあるのか?」という質問ですね。
結論としては「必要有り」です。確かにマクロの記録でもコードを用意する事が出来るのですが一部の機能は自力でコードを書かないと用意出来ない仕様になっています。
以下対比表を用意しました。コードを自作する事でマクロの記録では出来ない事が出来る様になります。
この後紹介する事になる繰り返し処理や条件分岐は業務をマクロ化する際必ず必要な機能です。
見ていただくとすぐ分かるのですがマクロの記録で出来る事は限定されています。よってマクロの記録だけでは必ずVBAの勉強に行き詰まります。
以下リンク先で動画を使って詳しく説明しています。ご覧ください。
関連記事VBAでコードを書こうマクロの記録をおすすめしない2つの理由
VBAを使って仕事をマクロ化するにはコードを自力で書く事が必要不可欠です。次はコードを書く場所であるEditorについて解説していきます。
マクロは何処に書くのか
マクロやVBAについて勉強しました。このテーマは書籍やインターネットなどで検索すると沢山出てくるのですが「何処に書くのか」という話になると途端に資料が減ります。
しっかり紹介してくれている書籍や動画はものすごく少ないです。だからといって重要度が低いわけではないのでここではしっかり紹介していきます。
実はVBAを書く場所はどのExcelにも備え付けられています。だから用意する必要は無いです。あとは表示させるだけという事になります。
コードを書く場所はVBEという名前です。Visual Basic Editor の頭文字を取ってVBEです。
VBEの表示方法
何通りかあるのでここでは一番簡単な方法を紹介します。「Alt+F11キー」を押してみてください。
VBEが表示されない時
一部のパソコンではファンクションキーにデフォルトで別の機能が設定されている事があります。
VBEが表示されなかったら次は「Fn+Alt+F11キー」を押下しましょう。Fnキーはキーボード左下近辺です。おそらくこれでVBEが表示されます。
VBEの各要素について
画像とリストで各要素を紹介することにします。

番号 | 名称 | 機能 |
---|---|---|
1 | プロジェクトエクスプローラ | 各種モジュールをツリー状に表示 |
2 | コードウインドウ | コードを書く画面 |
3 | プロパティウインドウ | 選択しているオブジェクトのプロパティを表示 |
4 | ローカルウインドウ | コード実行中の各種要素の状態を表示 |
5 | イミディエイトウィンドウ | デバッグ作業用の作業場(一時表示用) |
6 | ウォッチウインドウ | 任意にセットした要素の動きを表示 |

直近で必要な機能はプロジェクトエクスプローラとコードウインドウです。今はこの2つだけ紹介する事にします。
プロジェクトエクスプローラ
画像左、背景色が白で縦長の枠がプロジェクトエクスプローラです。

エクセルが持っているモジュールがツリー状に表示される場所です。現在Book1というデータを開いています。このあとデータの保存をすると拡張子が表示されますが今は表示されていません。
Microsoft Excel Objectsの中にSheet1というモジュールが居ますね。これはSheet1専用のモジュールです。今は覚える必要は無いので次に進みます。
次はThisWorkbookというモジュールです。これはワークブックに紐付いたモジュールです。ここもあっさり進みます。今は覚える必要は無いです。
最後がMicrosoft Excel Objectsと並列に居る標準モジュールです。最初はこのモジュールだけ使います。あとの機能は「こんなものがあるんだ」ぐらいの認識で良いです。
デフォルトでは標準モジュールが表示されない
最初にVBEを表示させた段階では標準モジュールは無いです。よって表示させる方法を紹介します。
プロジェクトエクスプローラ内でVBAProjectを選択後右クリック→挿入→標準モジュールの順で選択してみてください。

これで標準モジュールが表示されます。標準モジュールの配下に居るModule1をダブルクリックしてみましょう。右のコードウインドウが白くなるはずです。
これでモジュール内の領域がコードウインドウに表示されたことになります。
コードウインドウ
コードを書く場所になります。プロジェクトエクスプローラで選択したモジュールの中に用意されているコードを書く領域が表示されるという建付けになっています。
ここで1つ提案です。デフォルトだとコードが読みにくいのでエディターの配色を変えましょう。
エディターの設定
ツールタブ→オプション→エディターの設定の順に進むと以下ダイアログ画面が立ち上がります。

設定を以下の様に変えていただくと私と同じ配色になります。今後この配色で記事を書いていきますので合わせていただくと見易く感じると思います。
コードの表示色 | 前景 | 背景 |
---|---|---|
標準コード | 黄色 | 黒 |
コメント | 濃いグレー | 黒 |
キーワード | 水色 | 黒 |
識別子 | 白 | 黒 |
標準モジュールにコードを書く理由
これで必要最低限の事はやりました。早速コードを書いていこうと思うのですがなぜ標準モジュールにコードを書かないといけないのかについて回答していません。
考えなくても勉強は継続可能ですが何故か気になる方も居ると思いますので回答を用意しておきます。
回答です。標準モジュールは全てのシートに命令を送ることが出来る為です。標準モジュールにコードを書いておけばコードの実行時に起きる問題を減らす事が出来る為です。
関連記事ではVBEを使って標準モジュールとシートモジュールとの関係を説明しています。ここでも2分の動画を用意しています。興味がある方はご覧ください。
関連記事なぜ標準モジュールにコードを書くのかVBEを使って説明します
マクロ付きエクセルの保存方法
拡張子は.xlsmで保存しましょう。理由は拡張子.xlsxでデータを保存するとマクロが消える為です。

エクセルを保存する際(ファイル→名前を付けて保存)ファイルの種類を選択する事が出来ます。ここで「.xlsm」を選択しましょう。
ちなみにここでExcelをPDFにも変換できますよ。拡張子.pdfを選択すると変換されます。お試しください。

これでエクセルを閉じても一度用意した環境を再現出来るようになりました。
プロシージャとはなにか
続いてプロシージャという用語について勉強していただきます。プロシージャは「作業単位」と言い換える事が出来ます。

勉強が進むと状況が変わりますが今は1つのプロシージャ内に書いた命令は1回で実行されるという認識でいてください。
コードを使って説明する
コードを使って具体的に説明します。コードウインドウにカーソルを合わせてください。
コードはSubで始まりEnd Subで終わります。このキーワードの間に書かれた命令が1つのプロシージャという事になります。

画像を使って説明すると「Sub プロシージャとは()」から「End Sub」までが1つのプロシージャです。この間に書いたコードが1回の命令で実行されることになります。
よって作業をまとめたいと考えた時はまとめたいと思った作業を全てSub~End Subの間に書くようにしましょう。
初心者のうちはコードの量は考えなくて良いです。やりたい事を書いてください。
標準モジュールには複数のプロシージャを持つことが出来るのか
本格的にコードを書く前に標準モジュールに複数のプロシージャを持てるのか?、プロシージャの命名規則について知っているとさらに勉強がはかどります。
結論だけお伝えしておきますと1つの標準モジュールには複数のプロシージャを持つことが出来ます。関連記事(動画付き)を用意しておきましたので気になる方はご覧ください。
関連記事マクロの書き方標準モジュール内にSubプロシージャは複数書けるのか
コードの成り立ち、使い方について
3つあるブロックの中における2つ目のブロックです。オブジェクト、プロパティ、メソッドについて学習していきます。3つの要素はコードを構成する為の骨組みの役割をしています。
これらの要素を組み合わせてコードを書くのですが組み合わせのパターンや例外が多すぎて非常に難しいです。
初心者のうちはインプットが多くなりすぎて対応出来ない方が多い傾向があります。
そこで「一定の決まりや型」を使う事にしました。序盤に必要な知識と不要な知識を整理し話をシンプルにすることが出来る為です。
このブロックではコードを書く為の「決まりや型」を勉強していただきます。
学習進度
現在35%の勉強が終わりました。この35%は今回の記事における進捗率です。ご注意ください。
このブロックの勉強が終了すると50%達成となります。
オブジェクト、プロパティ、メソッド
コードには2つの型があります。主にオブジェクト、プロパティ、メソッドという3つの要素から構成されています。
- オブジェクト.プロパティ = 代入する値
- オブジェクト.メソッド(状況に応じて引数)
この2つのコードが分かるとコードの9割は理解出来ます。まずはオブジェクト等の要素がどんなものなのか理解する事に努めましょう。

オブジェクト、プロパティ、メソッドは難しいです。意味が分からなくても型(配置)で覚えるとコードが書けるようになります。お試しください。
オブジェクトとは
アプリケーションの要素です。WorkBookやWorksheet、Range(セル)など文字を書いたりコピーしたり削除を行う為の対象となる要素です。
Excelを手作業で操作する時はアイコンやセルに対して操作を行うのでオブジェクトを意識しなくてもよいのですがVBAを使う時はオブジェクトという考え方が必要になります。
オブジェクトという考え方のもとではセルやワークシート、グラフなどは独立した部品のようになっています。使う時に都度呼び出してくる事になります。
例えばセルに文字を書きたい時はセル関連のオブジェクトを持ってくる、グラフを作りたい時はグラフ関連のオブジェクトを持ってくる事になります。
先程2つの型を説明しましたがどちらの型にも冒頭にはオブジェクトが居ますね。オブジェクトが話の起点になるので基本的にはコードを書くうえでは最初に配置されることになります。
次に出てくるプロパティ、メソッドがオブジェクトの操作に関連する要素です。
プロパティとは
オブジェクトに紐付く属性です。それぞれのオブジェクトは属性を保持しています。Range(セル)だったら文字の大きさや背景色、文字色、フォント等沢山の属性を持っています。
オブジェクトによって用意されている属性が違う事もあり全ての属性を理解するのは不可能です。
まずはプロパティというのはオブジェクトが持っている属性の事なんだなというところまで理解してください。
この属性を操作する事で色々な事が出来るようになります。具体的には属性を書き換えるという作業をします。
そのコードが先程紹介した型の1つである「オブジェクト.プロパティ= 代入する値」になります。この型を使ったコードを紹介します。
コード | 意味 |
---|---|
Range(“A1”).Value = “おはよう” | セルA1に おはよう を記入 |
Range(“A1”).Font.Size = 14 | セルA1の文字サイズを14に変更 |
Range(“A1”).Interior.ColorIndex = 3 | セルA1の背景色を赤に変更 |
最初のValueについて説明します。Valueというプロパティはセルの値を管理するプロパティ(属性)です。どのプロパティも最初は何も入ってない状態です。
そこに「おはよう」という文字を代入する(書き換える)事で指定のセルに文字が入ります。
残りの2つは少し形が違いますね。Rangeオブジェクトの後にプロパティが2つ続いています。これはValueプロパティとは少し違う考え方が必要です。
- オブジェクトやプロパティは階層構造になっている事
- コードは機能毎にブロック状になっている事
これらの考え方を理解する必要があります。関連記事(動画付き)の中で説明しています。
関連記事【簡単】VBAコードの書き方2つの型を覚えると基礎の9割はカバー出来る
メソッドとは
メソッドはオブジェクトが実行できる処理です。コピーや削除などオブジェクト自体に動的な命令を課す事が出来る機能です。
メソッドもプロパティと同じようにオブジェクトによって関連のあるメソッドは違うので全部を覚える事は不可能です。
メソッドはオブジェクトへ指示を出す事が出来るというところまでは理解しておきましょう。コードには2つの型がありましたね。メソッドについて書かれていたのはこの型です。
オブジェクト.メソッド(状況に応じて引数)
この型を使ったコードを紹介します。
コード | 意味 |
---|---|
Range(“A1”).AutoFill Range(“A1:A3”) | セルA1の値をセルA3までオートフィル |
Range(“A1”).Copy Range(“A2”) | セルA1をコピーしてセルA2に貼り付け |
Range(“A1”).ClearContents | セルA1の値を削除(値だけ削除) |
メソッドを用いたコードの方がプロパティに値を代入するコードよりシンプルです。引数が無ければさらにシンプルになります。
リストを見るとオートフィルやコピーは指示した後のコードの行先まで指定する必要がありますが値の削除は消すだけなので引数を指定する必要は無いです。
オブジェクト等の要素を覚える必要はあるのか
このコードはプロパティでこのコードはメソッド・・・というような覚え方は必要無いです。ただし各要素がどんな性質を持っているのかは理解しておいた方が良いです。
理由はコードを型に当てはめる時に要素が分かってないとコードが組めない為です。そうなると結局はプロパティやメソッドを全部覚えないといけないのではないかと考えてしまいます。
そこでVBEの便利機能を使いこの問題を解決させていきます。
VBEには入力を補助する機能で入力候補が表示されるという機能があります。画像を用意しておきました。ご覧ください。

Range(“A1”). と記入すると次に続くプロパティやメソッドが一覧で表示されます。緑の箱を投げた様なアイコンがメソッドで紙を指で指している様なアイコンがプロパティです。

裏を返せばここで表示されるプロパティやメソッドしか後には続かないのでコード全体の入力補助の様な機能も持ち合わせています。有効に使ってください。
これでも難しくてよく分からないという方も居ると思います。オブジェクト関連の話は難しいです。実際に何人かはずっと分からない方も居ました。しかしなんとかして勉強だけは続けてください。
もう1つ独学で勉強する方法を紹介しておきます。
キーワードをそのままインターネットの検索窓に入れて検索をかけましょう。
例えば上の画像にあるRangeオブジェクトの後に続くActivateメソッドを使うとこうなります。
VBA Range Activate 使い方
これでOKです。出てきた記事を頑張って読みましょう。「そんなこと?」と思うかもしれませんがこれが効果絶大です。
これを繰り返すと次第に検索する回数が減りコードが書ける様になります。加えて「検索して調べる」という行為の質が上がっていきます。徐々にですがレベルアップしていくという事です。
とにかく最初はコードを書いて実行する事が必要です。セルにどんな情報が展開されるのか?どんなエラーが出るのか?を自分で経験する事で勉強が進みます。チャレンジあるのみです。
実際にコードを書いて実行する為の方法を勉強する
3つのブロックの中でここが最後のブロックになります。自身の仕事をマクロに置き換える為に色々な機能を使ってコードを書いて実行していただきます。
前のブロックではオブジェクト、プロパティ、メソッドについて学習してきましたのでコードの骨格、決まりや型については理解いただきましたがこのブロックから勉強を始める方もい居ます。
オブジェクト、プロパティ、メソッドについては関連記事で動画を使って解説をしているコンテンツがあります。まずはこちらを紹介させていただきます。
コードの考え方、使い方をおさらいした後でコードを書いて実行する勉強を進めていただきます。
学習進度
進捗率50%を達成しました。ここまでは理屈中心でしたが残りの半分は手を動かします。コードを書くステージに入っていきます。
この進捗率は今回の記事における進捗率です。ご注意ください。
コードは型で覚える プロパティに値を代入
このブロックから勉強する方の為に再度プロパティの扱いについて関連記事を用意しておきました。
プロパティに値を代入しコードを実行した結果セルの値や書式がどうやって変化していくのかが分かる動画を用意しています。
関連記事【動画】VBAの基本的なコードの書き方プロパティに文字や値を代入
コードは型で覚える メソッドを使う
メソッドについても動画を使ってコードを書いて実行するところまでデータを用意しています。より理解を深めたい方は関連記事をご覧ください。
メソッドの中でClear関連のメソッドは沢山あります。値の削除や書式の削除、コメントの削除等様々なコードがあります。関連記事の中で分かり易くリスト化しています。
関連記事【動画】VBAの基本的なコードの書き方オートフィルやコピペを使う
罫線を引く
VBA初心者の皆様からいただく質問の中に「罫線は引けますか?」という質問が非常に多いのでここで切り取って取り上げます。
罫線は書式設定の中の機能です。セルの背景色を変える機能と同じ場所に属しています。セルの背景色を変えるという作業はプロパティ関連の記事内でも紹介しています。

罫線は オブジェクト.プロパティ=代入する値 の型で書きます。
という事はVBAでも罫線を引く事が出来ます。ここでもRangeオブジェクトを使用します。
コードを紹介
色々な引き方があります。1つのセルの1部分だけに線を引いたり複数セルに一括で格子状に線を引く事も可能です。使いそうな事例を数点用意してみました。
セルの上下左右に線を引く
Rangeオブジェクトが持つBordersプロパティからBordersオブジェクトのLineStyleプロパティを指定します。そこに xlContinuousを代入するというコードです。xlContinuousは実線です。
Range(“A1”).Borders.LineStyle = xlContinuous
セル範囲に格子状に線を引く
Rangeオブジェクトで範囲指定すると指定した範囲全てに格子状に線を引く事が出来ます。
Range(“A1:B3”).Borders.LineStyle = xlContinuous
セルの一部分だけ線を引く
代わってセルの一部だけ線を引きたい時はBordersプロパティの引数を指定します。
Range(“A1”).Borders(xlEdgeTop).LineStyle = xlContinuous
線を引く位置とコードの関係が分かる画像を用意しました。

エクセルを手作業で行う際によく見るセルの書式設定の画面です。ここで部位を指定して線を引いたり消したり出来ますね。今回はこの作業と同じことをVBAで表現しています。
Withステートメントを使う
部位ごとに線を引ける事は分かりました。ただしコードが多くなってしまいます。Bordersプロパティの引数が違うだけで似たようなコードをたくさん書いていますね。
見辛いので止めたいです。自分で書いたものなら良いのですが他の人に見てもらう事を考えると少しでもコードは少ない方が良いです。
解決させるための手段としてWithステートメントを使います。コードをまとめて文字数を減らす事でコードを見易くしていきます。
コードを紹介
以下コードをご覧ください。WithからEnd Withの間に書かれているコードが少なくなっています。見た目もスッキリしています。

コードはWクリックで選択出来ます。その後「Ctrl+C」でコピー、「Ctrl+V」で貼付けです。
'Withステートメント使用前
Range("B2:F10").Borders(xlEdgeTop).LineStyle = xlContinuous
Range("B2:F10").Borders(xlEdgeBottom).LineStyle = xlContinuous
Range("B2:F10").Borders(xlEdgeRight).LineStyle = xlContinuous
Range("B2:F10").Borders(xlEdgeLeft).LineStyle = xlContinuous
'Withステートメント使用後
With Range("B2:F10")
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeLeft).LineStyle = xlContinuous
End With
具体的にやっている事は以下3点です
- Withの後にまとめたいコードを書く
- WithからEnd Withの間にコードを書く
- WithからEnd Withの間に書かれたコードは省略したコードの前に.(ドット)を付ける
今回はBordersプロパティの引数がそれぞれ異なる為その前のコードまでをまとめています。コードの前方にはドットを付けて「ここにはWith以下のコードが居るよ」とお知らせしています。
関連記事では罫線とWithステートメントの使い方を2分の動画で説明しています。罫線については実線の他の線や線の太さについてマトリクスを用意して分かり易く説明しています。
関連記事VBAで罫線を引く1行のコードで格子状に実線が入る部位毎のコードも紹介
ここからはマクロの記録では生成されない機能について解説していきます。以降の記事が理解出来ると初心者卒業です。少し難しくなりますが何度も読み返して理解する様にしてください。
変数について
コード内で値を変化させることの出来る機能を持ったオブジェクトを変数と呼びます。なんでも入れられる箱をイメージしてください。変数には色々な種類があります。一部をリスト化しました。
データ型(コード) | データ型(型の種類) | 詳細 |
---|---|---|
Long | 整数型 | およそ-20億から+20億の整数 |
String | 文字列型 | 文字列 |
ここでは必要最低限の情報を紹介します。もっとたくさんデータ型はありますが最初はこの2つをしっかり覚えましょう。

変数が使えるようになると世界が広がります。
変数には数値や文字など何を入れるのか先に宣言してから使う事になります。型を決める事で箱の大きさを決めています。メモリの消費量をコントロールする為です。
コードを紹介
以下の様な使い方をします。
Dim 変数名 as データ型
数値を入れる為の変数名を a と想定ししてデータ型をLongにした場合は以下の様に変数を定義します。
Dim a as Long
変数aをプロシージャ内に書く前に変数aを使う事を宣言(コード内に書く)する事でエラーが出ることなくコードとして認識してもらえる様になります。(Option Explicitの話は省略します)
繰り返し処理
まずは繰り返し処理とはどんな機能なのか説明します。開始と終了の条件を決めてその範囲の中で作業を繰り返すというのが繰り返し処理です。
字のままですので説明不要に感じてしまうのですが重要なのは「開始と終了の条件を決めて・・・」という説明の冒頭部分です。
コードを紹介
以下コードのテンプレートを紹介します。基本形と書かれた下のFor 変数名からNextまでがForNextステートメントになります。
ForNextステートメントについても型が決まっています。基本的にはForからNextの間を決められた範囲内でループするというコードです。
'****************************************
'基本となる型
Dim 変数名 As Long
'基本形
For 変数名 = 初期値 To 最終値
'繰り返す内容
Next
'****************************************
For 変数名 = 初期値 To 最終値
変数名には変数が入ります。ここでは数値型の変数を定義する様にしましょう。理由はイコールの右側で設定する初期値と最終値は数値だからです。
続いて初期値と最終値の説明です。繰り返し処理の冒頭で「開始と終了の条件を決めて・・・」と説明したのは初期値と最終値の事です。
文字の通り変数がどの数値の範囲内で変化するのかを設定する為に使われます。
例えば初期値1で最終値が10だったとしましょう。変数名にセットされる変数はコードのループの際1から10まで1つずつ値が変化する事になります。
Next
ループの管理を行うコードです。変数がFor~で決めた条件内であればコードをループさせます。反対に条件から外れた際はループから抜ける処理を取ります。
例えば初期値1で最終値が10のループの中で変数が11になった際はループから抜けるという処理を取る事になります。
Cellsプロパティ
CellsプロパティはRangeオブジェクト同様セルを指定する事が出来るプロパティです。加えて「変数と繰り返し処理とCellsプロパティは相性が非常に良い」です。理由は後ほど説明します。
Cellsプロパティ単体の話に戻ります。Cellsプロパティは最終的にはRangeオブジェクトを返します。ならば最初からRangeオブジェクトで良いのではと思ってしまいます。
でもそうしないという事はCellsプロパティには特有のメリットがあるはずです。このメリットについて説明してきます。
コードを紹介
Cellsプロパティは Cells(行,列) という並びでセルを表現します。よってセルB3を表現するには以下の様にコードを書きます。
Cells(3,2)
RangeオブジェクトではRangeの後の引数に(“B3”)という様に番地を設定していました。CellsプロパティではRangeオブジェクトと比べ2つの変化点があります。
- 行列の並びが変った
- 列が数字に変った
この2つの変化点にメリットがあるのでRangeオブジェクトを使わずCellsプロパティを使っているはずです。もう少し詳しく見ていきましょう。
変化点を整理する
Rangeオブジェクトの引数(“セルの番地”)はダブルクォーテーションで挟まれています。という事はエクセルの決まりからするとこれは文字列です。
Rangeオブジェクトは引数で文字列を使っています。一方のCellsプロパティはどうでしょうか。数値ですね。列についても記号を止めて数値を使っています。
数値という事はForNextステートメントで使った変数をそのままCellsプロパティにも転用できるという事です。以下コードをご覧ください。
Dim i As Long
For i = 1 To 10
Cells(i, 1) = "おはよう"
Next
変数iを宣言しForNextステートメントで使用しています。そのiという変数をCellsプロパティの行にも使ってみましょう。
変数として宣言したiはForNextステートメントの変数にも使われCellsプロパティにも組み込まれる事になりました。
これでForNextステートメントで変数iがループして数値が1つずつ変化するのに連動してCellsプロパティで1行ずつ違うセルを指定する事が出来るようになります。
これがCellsプロパティを使うメリットです。「変数と繰り返し処理とCellsプロパティは相性が非常に良い」という伏線はここで回収される事になりました。
関連記事の中で繰り返し処理と変数、Cellsプロパティを使ったコードを動画で紹介しています。コードの実行時にセルの画面やコードウインドウでどんな動きをしているのか確認出来ます。
関連記事VBAのForNextステートメントで複数セルの仕事を1秒で片付ける
条件分岐
条件分岐はエクセルで言うところのIF文です。VBAではIfステートメントという呼び方をします。

もし○○だったら・・・という様にこれから起こる事を想定して指示を分ける事が出来ます。
コードを紹介
Ifステートメントにも型があります。以下コードをご覧ください。IfからEnd Ifまでが1つのステートメントです。最初に条件を設定し条件に対してTrue、Falseの時の動きを用意します。
ElseはTrueとFalseのコードを仕切る壁だと思ってください。IfからElseの間が条件Trueの処理です。ElseからEnd Ifの間が条件Falseの処理になります。
'****************************************
'基本となる型
If 条件 Then
'条件Trueの処理
Else
'条件Falseの処理
End If
'****************************************
If、Then、Else、EndIf が定型文です。条件とTrue,Falseの処理は都度設定する事になります。
If 条件 Then
最初に条件を設定します。コード内で条件と書いてある場所に自身が設定した条件を記入します。
Else
TrueとFalseの処理を仕切るコードです。Falseの処理が無い時は書かなくても良いコードです。
True、Falseの処理
条件とセットで都度用意するコードです。
End If
Ifステートメントの締めとなるコードです。
使用例
セルA1におはようという文字が入っている時はセルB1におはようという文字が入ります。条件に当てはまらない時はセルB1は空欄になります。
Sub 条件分岐()
If Range("A1") = "おはよう" Then
Rage("B1") = "おはよう"
Else
Rage("B1") = ""
End If
End Sub
関連記事ではIfステートメントとメッセージボックスを組み合わせたコードを用意しています。他の記事同様動画もありますのでコードの書き方含めご覧ください。
関連記事VBAIfステートメントとメッセージボックス2つの機能を組み合わせる
メッセージボックスと組み合わせて使うと対話型のアプリケーションの様な使い方が出来ます。
個人で使う時は必要ないかもしれませんが複数人やもっと大きなグループでデータを使う時には効果を発揮します。メッセージボックスはエラー対策にもなります。
ワークシート関数を使う
VBAでも関数が使えます。何点か注意する事はありますが基本的にはセルに直書きする関数と同じ効果が得られます。注意点は以下2点です。
- 関数によってコードの構成が異なります
- VBAの作法でコードを用意する必要があります
1つずつ確認していきましょう。

関数はコードをシンプルに出来ます。よってエラーも減ります。積極的に使いましょう。
関数によってコードの構成が異なる
関数は非常にたくさんあるので全て同じところに格納されているわけではないです。イメージで考えて欲しいのですが会社では色んな人が居て仕事をしていますがおそらく出身は様々です。
VBAの関数も同じでこの群に所属している関数は冒頭にWorksheetFunctionオブジェクトを用意する・・・など出身によってコードが少し変わります。これが注意する点の1つ目です。
VBAの作法でコードを用意する必要がある
関数はVBAの作法で用意する必要があります。セルに書く関数と建付けは同じですがコードはVBAの書き方で用意しないといけません。
コードを紹介
この2つの注意点をVLOOKUP関数をもとに確認してみましょう。


VBAでVLOOKUP関数を使う時はWorksheetFunctionというコードが必要です。加えてコードはVBAの書き方です。セルを指定する際もRangeオブジェクトを使用しています。
デメリット
ここでも2つ紹介させていただきます。
- 引数を覚えてないとコードが書けない
- エラーへの対策が必要
1つずつ解説していきます。
引数を覚えてないとコードが書けない
引数の数は分かりますが引数の内容を覚えてないとコードが書けません。入力補助が無いです。以下画像のようにArg~という表示になってしまいます。

エラーへの対策が必要
VLOOKUP関数は検索値が検索範囲の中に居ない時はエラーになります。#N/Aですね。よく見るエラーです。VBAでもエラーになりますがVBAの場合はコードが止まってしまいます。
これは対策を講じる必要があります。ワークシート関数の解説とVLOOKUP関数のエラー対策は関連記事で紹介しています。
関連記事ワークシート関数の使い方VLOOKUPメソッド使用時はエラー対策が必須
WorksheetFunctionオブジェクトを使用しない関数についても一部紹介しています。ご覧ください。
月末を取得する
Excelは日付を扱う頻度が非常に高いアプリケーションです。どんなデータでもおおよそ日付か番号、名前など固有の情報を特定する為のキーとなる情報が居ます。
使用頻度が高い日付の中でさらに使用頻度が高い月末を出来るだけ簡単に取得出来る様になると仕事の効率が上がります。
VBAを使えば簡単に月末を取得出来ます。色々な方法がありますがここで1つ例を紹介させていただきます。
DateSerial(Year(Range(“A3”)), Month(Range(“A3”)) + 1, 1) – 1
結論としては上記コードで月末を取得出来ます。以降で解説を進めます。

月末を含め色々な日付を取得するには何らかのロジックが必要です。勉強していきましょう。
考え方
月末にどんな規則性があるのかを考えます。理由は「抽出する際のきっかけ」を探す為です。月末というぐらいなので月の最後の日ですね。
具体的に日付を挙げてみましょう。31,30,29,28日が存在しますね。29日は4年に1回ですが必ずやってきます。
もう少し見える化したいです。リスト化してみましょう。
月 | 末日 |
---|---|
1 | 31 |
2 | 28 |
3 | 31 |
4 | 30 |
5 | 31 |
6 | 30 |
7 | 31 |
8 | 31 |
9 | 30 |
10 | 31 |
11 | 30 |
12 | 31 |
こんな分かりきった事をなんでリスト化するのかについては理由があります。見た目で気付く事はないか最終的に確認する為です。
情報を並べて眺めると頭で考えてた時には見えなかった事が見える時があります。今回は収穫は無いのですがこの行為が必要なのであえてやりました。
日付としては4種類ですが簡単な規則性は無いです。ならば考える軸を変えてみます。月末から反対に振って月初を考えてみましょう。月初は全部1から始まりますね。
規則性を見つけました。「月は毎月1日から始まる」という非常に分かり易い規則性です。これを使いましょう。
コードを紹介
セルA3に書いてある日付の月末を取得するコードです。
DateSerial(Year(Range(“A3”)), Month(Range(“A3”)) + 1, 1) – 1
DateSerial関数を使います。引数で年,月,日を与えると日付として返してくれるという関数です。n月の末日が知りたい時はまずn+1月の初日を作ります。
その日付から1を引くとn月の末日が取得出来ます。以下画像をご覧ください。

今回は月末だっただけで他の日付や仕事でも言える事ですが規則性や型を見つけるという意識を持って情報を見る様にしていきましょう。面倒ですがリスト化はおすすめです。
表の最終行を取得する
Excelの業務をマクロ化するにあたって表の最終行を取得するというの避けて通れない作業です。理由はどんなデータを扱うにしても作業範囲を決める必要がある為です。
コードを紹介
表の最終行も型があります。
Cells(Rows.Count, 1).End(xlUp).Row
最終列も型があります。
Cells(1, Columns.Count).End(xlToLeft).Column
どちらのコードもCellsプロパティが先頭に居ますね。今まで記事を読んできた方はここまでは理解できるはずです。この後は・・・難しいので最初は暗記して使ってください。
最後に「暗記してください」は私としても納得できないのですがこのコードを理解するのは少し難しいです。この記事が理解出来て余裕が出てきたら以降の総括記事を読んでみてください。
総括記事
最終行のコードを3分割して画像を使って分かり易く説明しています。加えてこの記事で勉強してきた事を全て盛り込んだ動画を用意しています。卒業試験の様な記事になっています。
関連記事にある様なコードが理解出来たうえで自力でコードを書く事が出来る様になれば初心者卒業です。この記事の冒頭で用意した動画のような仕事をする為のステップに進みましょう。
関連記事DateSerial関数を使って月末を調べる方法月初を取得後1日戻る
まとめ
マクロ入門編のテキストとして用意した記事もこれで終了です。お疲れ様でした。マクロについての理解が進んだと思っていただけると嬉しいです。

最後までご覧いただきありがとうございました。
ExcelVBA(マクロ)についてはまだ1割から2割程度しか紹介していません。でも皆さんの仕事の半分以上はカバー出来ているはずです。
ここまで勉強できた人は既に自力で勉強できるスキルを身に付けています。あとの半分はご自身で勉強していただき仕事をマクロ化してください。
ファイル、フォルダの取り回しや保存、CSVの扱い方・・・辺りを勉強するとほとんどの事は出来る様になります。
これで記事のアウトプットとして宣言した「ExcelのVBAという言語を使って自身の業務をマクロに置き換える事が出来る」が達成される事になります。
お知らせ:オンラインミーティング
私オンラインでVBAの講師をしております。記事を読んで行き詰まってしまったり1人での勉強は継続が難しいので質問出来る環境が欲しいという方は以下リンクよりご連絡ください。
