
エクセルVBAの初心者が入門書として知っておきたいことをまとめてみた。
エクセルを仕事で使い始めて、VBAを学ぶようになったタケイチですが、初心者の時に知っていたらもっと早く上達していたのではないか?
と思えるようなことがあったので、自分なりの初心者がまずはやった方が良い入門編を用意してみました。
VBAは、理解しやすい構造であるため、一番最初の言語に向いていますが、何事も最初は難しいものです。
VBAとは
ざっくりとで構わないんですが、VBAとは言語です。PythonやC言語といったような意味ですね。
VBAはマイクロソフトオフィスで使えるプログラミング言語!
VBEの環境設定
VBAと似た言葉のため、ちょっと整理します。
ただし、言葉の意味などはそんなに重要ではありません。
そのため、覚えなくても全然かまわないし、何度もエクセルにVBAを書いたりしていれば自然とやるようになります。
VBA(ヴィジュアル・ベーシック・アプリケーションズ)
→プログラミング言語
VBE(ヴィジュアル・ベーシック・エディター)
→プログラミング言語を書く環境
VBEの開き方
では、VBEというエディターを開く方法をお伝えします。
ほとんどの方が開いた経験がないと思います。僕も、VBAをやるまでは、マクロは聞いたことがあるけど、どこに書けば良いのかすらわかっていませんでした。
VBEの開き方は2種類あります。
Excelのメニューバーから開く方法
”開発”タブに、VBEを開くボタンがあるんですが、最初から”開発”タブが選択できる状況の人は少ないです。
ファイル→オプション→リボンのユーザー設定→開発にチェックを付ける→開発タブをクリック→Visual Basicをクリック



開発タブが選択できるようになりますので、OKボタンをクリックしてください。

Visual Basicをクリックすると、VBEが開きます。
短縮キーから開く方法
Alt + f11を押してください。Altを押しながらf11を押せばOKです。
短縮キーの方が圧倒的に楽なので、短縮キーで覚えた方が良いです。
会社で使うPCや会社でいつも使っているPCじゃないと、開発タブを毎回設定しなくてはいけない・・・
僕なりのVBEおすすめ環境を公開

VBEを開くと、こんな画面が出てきます。

この状態で書き始めても良いのですが、使い続けていくうちに変更を絶対にします。
僕のVBE環境は下の画像です。

イミディエイトウィンドウを追加
ローカルウィンドウを追加
タスクバーの「編集」を追加
文字色の変更
イミディエイトウィンドウ
イミディエイトウィンドウは、デバッグをするときに使います。
また、Stopをかけた状態で変数が何を取得しているかを調べるときにも使います。

ローカルウィンドウ
ローカルウィンドウは、変数のステータスを確認するときに使っています。イミディエイトの方が使う頻度は高いかもしれませんが、ローカルウィンドウを基準にイミディエイトウィンドウを活用したりもするので、私にとっては非常に重要なウィンドウです。

コードウィンドウ
コードウィンドウに実際に書き込む項は、もうちょっと先にします。
まずは設定と言うところにフォーカスして、文字色の変更や背景色の変更をします。
とりあえず、標準モジュールを立ち上げてください。

コードウィンドウの文字色の変更

エディターの設定タブを押してください。


タスクバーの「編集」の機能と追加方法
編集はコメントアウトの時に使うだけです。もとに戻すときにも使います。
表示されていた方が楽なので使いやすさをお伝えします。

VBAの書き方
さて、いよいよVBAをVBEに書き込むところまで来ました。しかし、どこに書き込めばよいのかわからない。
まずは、どこに書き込むのかを説明していきます。
VBAを書き込むモジュールについて
モジュールとは、VBEというノートに一枚一枚織り込まれている紙だと思ってもらえば良いと思います。その紙にも種類があり、適正な種類の紙を選択していく必要があります。
なんか難しそうだなぁ~って思わなくて大丈夫です。「標準モジュール」くらいしか最初のうちは使いません。
モジュールの種類については、もうちょっと詳しいページを準備しております。
モジュールの種類は複数あるが、標準モジュールを覚えておけば十分すぎる

標準モジュールの追加方法

こんな感じで、簡単です。場所を覚えるまでが大変だと思います。一緒に頑張ってみましょう。
SubとFunctionの違いについて
モジュールの書き方が分かったら、モジュール内のルールについて確認しておきましょう。
Subには2種類の宣言方法がある
厳密に言うと3種類ですが、2種類にまとまります。
2種類の違いは、「公開」と「限定公開」に分類されるイメージです。
Public Sub(パブリックサブ)とSub(サブ)は、「公開」
Private Sub(プライベートサブ)は、「限定公開」
こんなことを言ってもわかりにくいので、ちょっとした例を出します。

4つの宣言をしています。
エクセルに移って、開発→挿入→ボタンをクリックして、ボタンを作成してください。
ドラッグするだけでも良いですし、ダブルクリックでも作れます。
ボタンの作成方法


すると作成前に、ポップアップが出てきます。Private Subで宣言した「ddd」が出てきません。
後々いやでも覚えるので、基本は「Public Sub」を使用しておけば問題ありません。
限定公開の「ddd」がマクロの指定に出てこない。
Functionは、関数のイメージ
SubとFunctionの違いは、返り値があることです。
Subだと返り値を受け取ることができません。しかし、Functionでは受け取ることができます。
最初はそこまで使わないと思いますので、Functionがある。ということを覚えておいていただければ大丈夫です。
返り値がある!Excelの関数と同じような働きと思っていればOK!
ちょっと練習してみましょう
練習問題に最適なのはどんなのかなぁ?と思ったんですが、英語と同じように頻出単語というのがVBAにもあります。
なので、まずは良く使われるコードの理解をしてから、VBAを学ぶきっかけにもなっているであろうビジネスなどへの応用をしやすいコードで進めてみましょう。
よく使うコードのまとめ
今回紹介したいコードは2つあります。
IFとForというコードですが、何を言っているのかわからない。と思っても全然平気です。
IFは、分岐。Forは、ループ。そんなキーワードを頭においてこの先を読んでみてください。
IFの使い方
IFのコードの使い方は簡単です。
1 2 3 4 5 |
If 条件式 Then 実処理記入 End If |
条件式には種類がありますが、プログラミングの用語をそのまま覚えるんではなくて、日本語の文章だと思ってやってみたら簡単に覚えられると思います。
とりあえず、こんな形であると認識しておいてください。
IFの使い方記事を準備中
Forの使い方
1 2 3 4 5 |
For カウントを実行する変数のセット = 開始数 To 終了数 実処理記入 Next カウントを実行する変数 |
ループの実行はForだけではありませんが、一旦一つだけの方が分かり易いと思いますので、基本はForで組み立てられるかを考えてみると作りやすいです。
Forの使い方記事を準備中
初級者入門に向けた練習問題に挑戦!
何かと汎用性が高いであろうと思う。練習問題を用意しました。もちろん、これで覚えられるなんて思いませんし、わからないところはコメントにどんどん書き込んで貰えると非常に助かります。
IFとForの感覚をつかんでほしい!
標準モジュールに対してのSubの役割をイメージしてほしい!
Functionの使い方は覚えなくて良い!理解出来たら便利
VBAを覚えてどんなエクセルを作ろうか考えやすい例題にしてみたつもり!
あまりごちゃごちゃ言っても最初は覚えきれないと思います。
僕はVBAで感動した一番のポイントは、「列や行を足さずに書き換えができること」です。指定の文字から指定の文字へ変換させられる。これが一番のストロングだと思っています。
動作を確認
- 特定の列から特定の値を探して特定の値に書き換える
ボタン1をクリック

ポップアップウィンドウが開くので、テキストボックスに検索したい値を入力して、「OK」をクリック

検索した値の代わりに入力するワードをテキストボックスに入力し、「OK」をクリック

メッセージボックスが表示されて処理が終了

というのが、表面の動きになります。
A列に書き込まれていること。そして、5行目から始まっていることを覚えておいてください。
さて、では裏側の解説に行ってみましょう!
VBAコードの説明
では、ここから裏側になります。
検索ワードと置換ワードをメッセージボックスで確認して、最終行までのループを実施して、検索ワードに一致していた時に置換ワードに置換する!
となります。
いっぺんにコードを見てもわからない部分が多いと思いますので、先に分割して説明します。
これから4分割されたそれぞれの担当部門が登場します。
最終的には全体のコードを作っていきますので、そのコードを標準モジュールに入れてみてください。
第一段階の説明
1 2 3 4 5 6 7 8 9 10 |
'=============================================================================== '==第一段階===モジュール全体で使う変数はここで宣言できる! '=============================================================================== '=============================================================================== Dim SearchStr As String '探す値の変数 Dim SubstitutionStr As String '代入する値の変数 Dim MasterWs As Worksheet '使用するワークシートの設定 Dim lastrow1 As Integer '最終行の取得 |
モジュールの一番最初で変数を宣言すると、そのモジュール全体で使えます。
とりあえず、変数には型などがあります!
Stringは、文字列。Worksheetは、ワークシート。Integerは、整数(小さい方)。
変数の型の詳細は、現在ページを準備しております。少々お待ちください。
第二段階の説明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'=============================================================================== '==第二段階===第一段階の変数を整えるときに使うことが多い! '=============================================================================== '=============================================================================== Private Sub 初期設定() 'ワークシートの設定 Set MasterWs = Worksheets("実運用シート") '最終行を取得 lastrow1 = MasterWs.Cells(Rows.Count, 1).End(xlUp).Row End Sub |
宣言した変数に、格納していきます。
格納するだけであり、初期設定と書いているのでイメージできているとは思いますが、補助的なSubです。補助的なSubはボタンに登録したくないので、Privete Subで宣言しております。
変数の格納をイメージした記事も準備しておりますのでしばらくお待ちください。
第三段階の説明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
'=============================================================================== '==第三段階===実コード、本筋のコードになる '=============================================================================== '=============================================================================== Public Sub 探して代入の処理() Dim looprun1 As Integer Dim cnt1 As Integer Dim MsgStr As String Dim IntStr As String Call 初期設定 cnt1 = 0 'カウンターを戻す '探す値を確定 MsgStr = "探す値を入力してください" 'InputBoxで表示させるステータスを表示 SearchStr = 値を返す(MsgStr) MsgStr = "" '空白に戻しておく '代入する値を確定 MsgStr = "代入する値を入力してください" 'InputBoxで表示させるステータスを表示 SubstitutionStr = 値を返す(MsgStr) MsgStr = "" '空白にしておく '実際に処理を開始 For looprun1 = 5 To lastrow1 IntStr = MasterWs.Cells(looprun1, 1).Value If IntStr = SearchStr Then MasterWs.Cells(looprun1, 1).Value = SubstitutionStr cnt1 = cnt1 + 1 End If Next looprun1 MsgBox SearchStr & "の値を" & SubstitutionStr & "に置換しました。" & Chr(10) & "実際に、処理した件数:" & cnt1 & "件" End Sub |
役割は、メインコードです。
ここで、初期設定をお願いしたり、どういうシナリオなのかを明記している部分になります。
ボタンに登録したいので、Public Subで宣言しております。
第四段階の説明
1 2 3 4 5 6 7 8 9 10 11 |
'=============================================================================== '==第四段階===ファンクションは返り値があるのを覚えておいて! '=============================================================================== '=============================================================================== Function 値を返す(MsgStr As String) 値を返す = InputBox(MsgStr) End Function |
正直、Functionの使い方としては簡単すぎますが、頻出するタイプのものであれば、Functionはめちゃくちゃ便利です。
検索ワードと置換ワードを引っ張らなくてはいけないので、同じコードを2回書いても良いんですが、面倒ですよね?
そんな時にFunctionを使っておけばめちゃくちゃ楽ですよ。って感じです。
コードの全体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
'=============================================================================== '==第一段階===モジュール全体で使う変数はここで宣言できる! '=============================================================================== '=============================================================================== Dim SearchStr As String '探す値の変数 Dim SubstitutionStr As String '代入する値の変数 Dim MasterWs As Worksheet '使用するワークシートの設定 Dim lastrow1 As Integer '最終行の取得 '=============================================================================== '==第二段階===第一段階の変数を整えるときに使うことが多い! '=============================================================================== '=============================================================================== Private Sub 初期設定() 'ワークシートの設定 Set MasterWs = Worksheets("実運用シート") '最終行を取得 lastrow1 = MasterWs.Cells(Rows.Count, 1).End(xlUp).Row End Sub '=============================================================================== '==第三段階===実コード、本筋のコードになる '=============================================================================== '=============================================================================== Public Sub 探して代入の処理() Dim looprun1 As Integer Dim cnt1 As Integer Dim MsgStr As String Dim IntStr As String Call 初期設定 cnt1 = 0 'カウンターを戻す '探す値を確定 MsgStr = "探す値を入力してください" 'InputBoxで表示させるステータスを表示 SearchStr = 値を返す(MsgStr) MsgStr = "" '空白に戻しておく '代入する値を確定 MsgStr = "代入する値を入力してください" 'InputBoxで表示させるステータスを表示 SubstitutionStr = 値を返す(MsgStr) MsgStr = "" '空白にしておく '実際に処理を開始 For looprun1 = 5 To lastrow1 IntStr = MasterWs.Cells(looprun1, 1).Value If IntStr = SearchStr Then MasterWs.Cells(looprun1, 1).Value = SubstitutionStr cnt1 = cnt1 + 1 End If Next looprun1 MsgBox SearchStr & "の値を" & SubstitutionStr & "に置換しました。" & Chr(10) & "実際に、処理した件数:" & cnt1 & "件" End Sub '=============================================================================== '==第四段階===ファンクションは返り値があるのを覚えておいて! '=============================================================================== '=============================================================================== Function 値を返す(MsgStr As String) 値を返す = InputBox(MsgStr) End Function |