こんにちは、Яeiです。
今回はVBAを実際に使っている私が、Excel VBAを実際に使うのに最低限必要な知識について解説していきたいと思います。
私は今まで多くの現場を転々とし、その度にExcel VBAを作成し利用してきました。
設計書の自動生成はもちろん、何か調査する際の自動化や資料作成時の補助としてなど用途は多岐に渡ります。
当記事では、これからExcel VBAを始める方へのスタートアップ的な立ち位置で実際に簡単なプログラムを動かしながらプログラミングについて説明していきます。
あくまでも「初心者が慣れ親しむこと」をメインに記載しておりますので、今は不要と判断した知識は紹介しないようにしております。
当記事を読んで、興味を持たれた方は自分でより効率的な方法を探すべく書籍を買って勉強されることをおすすめいたします。
目次
VBAプログラミングを始めるにあたっての準備
プログラムを記述する場所
前提として、前回の記事についてはマスターしておいて下さい。
難しいことはありません。設定関係となります。
VBAを使うのに最低限必要な知識(設定編)(エクセルを自動化しましょう)
さて自分でプログラムを作成する場合、まずはエディタ(VBE)を開き、開いているブックに「標準モジュール」を挿入します。
このとき、自分が開いているエクセルブックを選択した状態で「挿入」タブ→標準モジュールを選択しましょう。
すると、プロジェクトに「標準モジュール」が追加され、Module1が作成されたと思います。
プログラムを書く場所(Subルーチン)
先ほど作成したModule1を選択すると、右側にプログラムを記述するスペースが表示されます(前回の設定通りの場合、「Option Explicit」とすでに表示されていると思います)
「Option Explicit」の下の行に「sub TestVBA」と入力してEnterを押しましょう。
次のように、自動でソースコードが補完されたと思います。
Option Explicit
Sub TestVBA()
End Sub
VBAプログラミングでは「Sub 名前()」と「End Sub」の間にプログラムを記述していきます。
(Subはサブルーチン、このSub~End Subまでのブロックをプロシージャなんて呼んだりします)
ここで「TestVBA」は自分で好きにつけた名前となります。分かりやすい名前をつけておきましょう。
プログラムの確認方法(MsgBox)
では実際にプログラムを書こうと思いますが、まず始めにプログラムの確認方法として「MsgBox」を覚えておきましょう。
先ほどのSubとEnd Subの間に「msg」と入力してCtrl+スペースを押下して下さい。
「MsgBox」まで入力が補完されたと思います。
そして試しに「MsgBox(“はじめてのVBAプログラミング”)」と入力してみましょう。
入力したらカーソルを次の行にあわせて下さい。勝手にフォーマットを成形してくれた事と思います。
このように、エクセルのエディタ(VBE)では入力を自動で補完してくれる仕組みがあります。
そのためスペルを全て覚える必要はなく、困ったらCtrl+スペースを押してみると候補が挙がってきますので是非ご活用下さい。
この状態で実行(F5)してみましょう。
以下のような画面が出てきたと思います。
今後、プログラミングの挙動確認が必要になった際は基本的にはこの方法で確認していきますので覚えておいて下さい。
なお、このMsgBoxについてはさらに複雑な使い方もできるのですが、今は覚える必要はありません。
※ 余力のある人は「Debug.Print (出力したい内容)」も覚えておくと便利です。
Sub TestVBA()
Debug.Print ("test")
End Sub
こうすることでイミディエイトウィンドウに出力したい内容が出力されます。
(イミディエイトウィンドウが表示されていない場合は、「表示」タブ→イミディエイトウィンドウを選択しましょう)
VBAプログラミング技(最低限の基礎)
値の取得
まず始めに覚える必要があるのはエクセルシートに設定されている値をVBEの方で使う方法となります。
例えばA1セルの値を先ほどのMsgBoxで表示してみましょう。
これはやり方は複数ありますが、一つだけ覚えればOKです。
それが、
「Cells(行, 列).value」
となります。A1セルは1行、1列目のセルとなりますので、VBEではCells(1, 1).valueで値を取れます。
試しにやってみましょう。
A1セルには「この値使いたいな」と入力しておき、エディタ(VBE)では以下の通り入力してみます。
(ここでも、cellと小文字で入力してCtrl+スペースで補完できます)
Sub TestVBA()
MsgBox (Cells(1, 1).Value)
End Sub
これで実行(F5)をすると正しくA1セルの値が取得されていることが確認できると思います。
これにて、エクセルシートの値をプログラム側で取得できるようになりました。
値の出力
今度は逆に、プログラム側からエクセルシート側に文字を出力してみましょう。
「Cells(行, 列).value=”出力したい値”」
となります。これは先ほどのイメージからなんとなく分かるのではないでしょうか。
試しに以下のように記述して実行(F5)してみましょう。
Sub TestVBA()
Cells(3, 4).Value = "出力テスト"
MsgBox ("完了!")
End Sub
3行4列目に「出力テスト」という文言が出力されていると思います。
変数
次に、エディタ側で値を保持しておく箱を用意したいと思います。
例えば、B列の1行目~10行目すべてに「テスト」と出力するにはどうしたらよいでしょうか。
以下のようになると思います。
Sub TestVBA()
Cells(1, 2).Value = "テスト"
Cells(2, 2).Value = "テスト"
Cells(3, 2).Value = "テスト"
Cells(4, 2).Value = "テスト"
Cells(5, 2).Value = "テスト"
Cells(6, 2).Value = "テスト"
Cells(7, 2).Value = "テスト"
Cells(8, 2).Value = "テスト"
Cells(9, 2).Value = "テスト"
Cells(10, 2).Value = "テスト"
MsgBox ("完了!")
End Sub
ここで「やっぱりテストって言葉をお試しって言葉に変えたい」となった場合、どうでしょうか。
きっと「うーわ、10箇所も直す必要があるよ」って思うはずです。
「置換使えば良いのでは?」と思うかもしれませんが、置換は少し危険です。
なぜなら「コンテスト」みたいな文言がどこかで使われていた場合、「コンお試し」になってしまうからです。
そんなわけで、プログラミングをする際は変数という名の箱を用意してあげます。
そして、後々使いそうなものはいったんこの箱に格納しておくのです(一つにつき一つの箱)。
箱は、
「Dim 箱名」
作成できます(本来、Dim XXX As YYYみたいに記載できますがここでは省略します)。
このとき、箱の名前は好きに決めて下さい。
こうすることでコードはコードは以下のように書き直すことができるのです。
Sub TestVBA()
Dim out_msg
out_msg = "テスト"
Cells(1, 2).Value = out_msg
Cells(2, 2).Value = out_msg
Cells(3, 2).Value = out_msg
Cells(4, 2).Value = out_msg
Cells(5, 2).Value = out_msg
Cells(6, 2).Value = out_msg
Cells(7, 2).Value = out_msg
Cells(8, 2).Value = out_msg
Cells(9, 2).Value = out_msg
Cells(10, 2).Value = out_msg
MsgBox ("完了!")
End Sub
これなら、1箇所「テスト」を「お試し」に直すだけで済みます。
(MsgBoxの「完了!」は?と思うかもしれませんが、はい、これも本来は変数に入れておいた方がよいです。どの道1箇所でしか使わないので、と面倒で入れていないだけになります。これについては人の好みになってきたりもしますが)
ループ文
先ほどの処理では似たような処理を10回も実施しておりました。
プログラミングでは「似たような処理を繰り返す」場合は「ループ文」を使います。
ループ文には色々あるのですが、VBAでは基本的にfor文を覚えましょう。これだけで結構何とかなります。
構文は次の通りとなります。
Dim カウンタ変数
For カウンタ変数 = 開始値 To 終了値
~繰り返し行いたい処理~
Next
カウンタ変数は先ほど学んだただの変数です。
ループする際に何回ループしたかをカウントする用途なので、特別にカウンタ変数なんて呼んでいるだけです。
for文では「何回ループする」というよりは「カウンタ変数を開始値から終了値まで順に1ずつ上げていく」といったイメージになります。
これをもとに先ほどのコードを書き直すと次のようになります。
Sub TestVBA()
Dim out_msg
out_msg = "テスト"
Dim cnt
For cnt = 1 To 10
Cells(cnt, 2).Value = out_msg
Next
MsgBox ("完了!")
End Sub
(1ずつではなく2ずつ上げたい!なども可能ですが、ここでは省略します)
「Cells(cnt, 2).Value = out_msg」のcntは開始値の1から順に1ずつ試していき、最後は終了値の10までとなります。
条件分岐
次に「条件によって処理を実施したり、しなかったり」という操作も覚えましょう。
プログラミングの世界では「条件分岐」「if文」などと言われております。
例えば、先ほどの例において「2行目」だけは出力したくない場合はどうしたらよいでしょうか。
if文の構文は以下の通りです。
If 条件 then
条件にマッチした場合に実施される処理
End If
条件部分の指定方法はいくつかありますが、最低限以下の二つを覚えておきましょう。
・一致した場合:=
・一致しなかった場合:<>
例えば、先ほどの例において、2行目だけ出力したい場合は以下のようになります。
If cnt = 2 Then
Cells(cnt, 2).Value = out_msg
End If
また、2行目以外を出力したい場合は以下のようになります。
If cnt <> 2 Then
Cells(cnt, 2).Value = out_msg
End If
次に、条件を複数つけたい場合もあります。例えば、2行目と5行目だけ出力したい場合などです。
「または」「かつ」条件の指定方法は以下になります。
・または:Or
・かつ:And
それぞれ例は以下のようになります。
①2行目と5行目のみ出力する例
If cnt = 2 Or cnt = 5 Then
Cells(cnt, 2).Value = out_msg
End If
②2行目かつ2行目が空白だった場合に出力する例
If cnt = 2 And Cells(cnt, 2) = "" Then
Cells(cnt, 2).Value = out_msg
End If
②については、2行目(B2セル)に値がすでに入っている場合は上書きされません。
このように、条件分岐を利用するといろいろなことができるようになります。
もちろん、ここで上げた条件だけでは後々困ってくるのですが、その場合は適宜調べて使えるようになればよいです。
領域指定
今までは一つのセルを操作してきましたが、一括で操作したい場合もあります。
その場合にはRange指定が可能です。
ただし、このRange指定方法もいくつもあって覚えるのが大変です。
そこで、以下の方法を覚えておきましょう。
Range(範囲の最初のセル, 範囲の最後のセル)
これだけだとよく分からないと思うので実例を見てみましょう。
例えば、A1セルからC5セルの間のすべてのセルに「テスト」と入力したいとします。
A1セルは「Cells(1, 1)」、C5セルは「Cells(5, 3)」で表せます。
そのため、A1セルからC5セルのすべてのセルを表すには「Range(Cells(1, 1), Cells(5, 3))」となります。
これの値(Value)に「テスト」と入力したいのでコードは以下の通りとなります。
Sub TestVBA()
Dim out_msg
out_msg = "テスト"
Range(Cells(1, 1), Cells(5, 3)).Value = out_msg
End Sub
実はRange指定には他にも「Range(“A1:C5”)」みたいな指定方法もあり、こちらの方がどう考えても見栄えが良いです。
なぜ、こちらの方法をお勧めしなかったのかと言うと、こちらの方法だとループ文と併用する場合に若干面倒になるからです。
両方覚えておけば良い話ではありますが、初心者の方は最低限一つ覚えておけば十分で、汎用性の高い方法をお勧めしました。
人によっては「可読性!」といってコードが見辛くなる!と怒る方もいるかもしれませんが、初心者の方は可読性よりも「まずは出来ること」を意識しましょう。
ただし、出来るようになったら「コードの可読性」を意識して、自分以外の人が見ても分かるようにすることを心がけましょう。
削除
最低限の知識シリーズの最後は「あらかじめ入力されている値の削除」となります。
これは先ほどの領域指定と組み合わせると簡単にできます。
Range(範囲の最初のセル, 範囲の最後のセル).ClearContents
です。実は簡単に「削除」といっても実は複雑です。
書式ごと削除したり、コメントを削除したりと多岐に渡ります。ここで紹介した方法はあくまでも「セルの値」の削除となります。
もしも、「書式(赤字、Boldなど)ごと削除したい!」と言う場合は「Clear」とすると消えます。
自分が何を削除したいかで若干変わってきますので適宜調べながら使ってみて下さい。
コメントアウト
プログラミングをするにあたって「コメントアウト」という機能は基本的にどの言語でもあります。
プログラミング言語は「翻訳機にかけて機械語に翻訳ための人類が理解できるような言語」でした。
しかし、いくら人類が理解できる言語とはいえ、慣れ親しんだ母国語でもなければやはり複雑になることもあります。
そこで、自分や他の人への申し送り事項として「コメントアウト機能」があるのです。
自分で書いたコードでも1ヶ月もすれば「この処理何やっているんだっけ?」みたいなことはよくあります。そうならないためにもコメントはしっかりと書きましょう。
VBAのコメントは「’」となります(シングルクォーテーション)。
Sub TestVBA()
Dim out_msg
out_msg = "テスト"
' コメントテスト
Range(Cells(1, 1), Cells(5, 3)).ClearContents
End Sub
コメントの使い方としては、例えばエラーが起きた際にコードをコメントアウトして原因がどこか特定することにも使えます。
しかし、この場合、いちいちコードの先頭に「’」(シングルクォーテーション)を入力するのは面倒だと思います。
そこで、前回の記事で紹介した設定方法をしておくと「コメントブロック」が使えるようになります。
使い方は、コメントしたい部分をドラッグして「編集」ツールバーの「コメントブロック」を押すだけです。
この方法でドラッグした部分を一括でコメントアウトしてくれます。
また、戻すときはその右の「非コメントブロック」を押下すると元に戻ります。
意外に知っている人は少ないですが、知っておくと便利ですよ。
長くなってしまったので当記事は以上となります。
次回はもう少しだけVBAの最低限知っておきたいシリーズを記載していきたいと思います。
ここまで知っておくだけでもある程度VBAプログラミングができるようになると思いますが、次回の記事ではさらに知っておくと便利な話について触れていきたいと思います。
是非、読んでみて下さい。
長々とお疲れさまでした!
前回の記事