こんにちは、Яeiです。
今回はVBAを実際に使っている私が、Excel VBAを実際に使うのに最低限必要な知識について解説していきたいと思います。
私は今まで多くの現場を転々とし、その度にExcel VBAを作成し利用してきました。
設計書の自動生成はもちろん、何か調査する際の自動化や資料作成時の補助としてなど用途は多岐に渡ります。
当記事では、これからExcel VBAを始める方へのスタートアップ的な立ち位置で前回記載できなかったシート操作やデバッグ方法などについて記載していきます。
あくまでも「初心者が慣れ親しむこと」をメインに記載しておりますので、今は不要と判断した知識は紹介しないようにしております。
当記事を読んで、興味を持たれた方は自分でより効率的な方法を探すべく書籍を買って勉強されることをおすすめいたします。
今までのVBA記事は以下になりますのでまだ見られていない方はこちらから見て頂けると幸いです。
①環境設定
VBAを使うのに最低限必要な知識(設定編)(エクセルを自動化しましょう)
②最低限の知識
VBAを使うのに最低限必要な知識(プログラム編)(エクセルを自動化しましょう)
目次
VBAプログラミング技(前回書き切れなかったシリーズ)
シート操作
前回書ききれなくて、かつ最低限必須な知識の一つとして「シート」の操作となります。
ここでは難しいことをしようというのではなく、「開いているシートとは別のシート」の値を取得したりする程度の内容となります。
別のシートのセルの値を取得する際は、
「シートオブジェクト.Cells(行, 列).value」
で取得します。新しい部分は「シートオブジェクト」となっておりますが、要は「どのシートのどのセルの値」の「どのシート」の指定が必要となるだけです。
指定方法は簡単です。
「Worksheets(シート名)」または「Worksheets(先頭からのシート番号)」
例えば、Sheet2のC2セルに「sheet2 values」と入力してあるとします。
ここで、Sheet1を選択した状態で以下のようにコードを記述します。
Sub TestVBA()
MsgBox (Worksheets("Sheet2").Cells(2, 3).Value)
End Sub
すると、これを実行すると
となります。また、「Sheet2」シートは先頭のシートから数えて2番目にありますので、
Sub TestVBA()
MsgBox (Worksheets(2).Cells(2, 3).Value)
End Sub
でも同様になります。こちらの番号指定の方法は、ループ文と併用することで、すべてのシートに対して順番に処理を行うことが出来ます。
補足になりますが、このシートオブジェクトを変数に入れることもできます。
Sub TestVBA()
Dim ws
Set ws = Worksheets(2)
MsgBox (ws.Cells(2, 3).Value)
End Sub
「Dim ws」で変数となる箱を作成します。
次に「Set ws = Worksheets(2)」で箱の中にワークシートオブジェクトを格納しているのですが、ここで今までと違う点として「Set」がついております。
実は、オブジェクト(ブックやワークシートなど)を変数に入れる際は「Set」を付けるというルールがあります。
今回はワークシートを変数に入れたいのでSetを先頭につけているのです。
これでワークシートを操作する方法を覚えました。
最後に、最初のシートから最後のシートまで処理を繰り返す例文を見てみましょう。
Sub TestVBA()
Dim sheet_cnt
For sheet_cnt = 1 To Worksheets.Count
Worksheets(sheet_cnt).Cells(1, 1).Value = "value is " & sheet_cnt
Next
End Sub
「Worksheets.Count」では「Worksheetsオブジェクト」が持っている状態を取得しています。
この例ではWorksheetsオブジェクトはワークシート数を「Count」に保持してくれているのでそれを利用しているのです。
それを知るにはネットで調べるか、ウォッチ式に登録しておいてデバッグする方法があります。
これを実行するとすべてのシートのA1セルに「value is シート番号」が出力されます。
ブック操作
先ほどワークシートを操作しましたが、「ブック」を操作することも可能です。
ブック操作ができれば、別のエクセルを開いて処理をすることも可能です。
例えば、ルールを決めてフォルダに毎日作成しているエクセルファイルをすべて開いて結果をまとめるような作業もできます。
ブックは先ほどのワークシートと同じく変数に入れて使う方法が主流となります。
使い方は以下のようになります。
Dim wb
Set wb = Workbooks.Open("Book1.xlsx", , True)
MsgBox (Cells(1, 1).Value)
wb.Close
基本的な流れとしては、変数を用意して、ブックを開いたら変数に入れる。
最後にブックを閉じる。といった流れになります。「Workbooks.Open」はCtrl+スペースにて引数に指定できる内容を確認できるのでそれに沿って入れてみて下さい。
今回は「読み取り専用で開く」ようにしております。
例えば、このマクロと同じフォルダに「Book1.xlsx」があるとします。
Book1.xlsxのA1セルには「Book1」と入力してあります。この状態でこのコードを実行すると、
が表示されます。マクロとは別のブックが開かれたのです。
本来はフォルダ配下のブック全てを開いて操作するところまでやりたいのですが、複雑になりますのでまたの機会にしたいと思います。
プロシージャと関数
プロシージャ
VBAではSub~End Subまでの全体をプロシージャと呼びます。
英語で「procedure(手順)」ですね。
今まで一つのSubのみ使ってきましたが、複数記載しても問題ありません。
ただし、Sub~End Subの間に新たにSubを作成することはできません。
以下のように分ける必要があります。
プロシージャからプロシージャを呼び出すこともできます。
「Call プロシージャ名」
です。ここで「Call」は書かなくてもよいのですが、プロシージャを呼び出していることを明示するためにも記載しておきましょう。
Sub TestVBA()
MsgBox ("TestVBA")
Call SampleProcedure
End Sub
Sub SampleProcedure()
MsgBox ("SampleProcedure")
End Sub
関数
関数については、それだけでも1記事書けてしまうのでここでは手法だけ紹介致します。
関数のイメージについては以下の記事をご参照下さい。
(関数に関する詳細な記事が書けましたらリンクを貼っておきますのでしばしお待ち下さい)
構文は以下の通りとなります。
Function プロシージャ名(引数 As データ型) As 戻り値のデータ型
プロシージャ名 = 戻り値
End Function
引数って何?と思われるかもしれませんが、これは関数側に引き渡して上げる数となります。
思い出して下さい。MsgBoxは実は関数です。
MsgBoxという関数は呼び出す際に引数として「出力したい文字」を指定してもらいます。
関数側では「その情報を出力する」という処理を実施します。
では「戻り値」は?というと、関数が呼び出し元に返してくれる値となります。
「あれ?MsgBoxって何か返していたっけ?」と思うかもしれませんが、実は今までは結果を受け取っていなかっただけになります。
試しに以下のようなコードを実行してみましょう。
Sub SampleProcedure()
Dim ret
ret = MsgBox("SampleProcedure")
Debug.Print ("ret=" & ret)
End Sub
「ret = MsgBox(“SampleProcedure”)」はMsgBoxの戻り値を「ret」という箱(変数)に格納しております。
実行結果のイミディエイトウィンドウは以下のようになります。
ここで、1って何?って感じですが、それは関数側の仕様となります。
なので、関数を使う(作る)際は引数が何で、戻り値が何かを明確にしてあげる必要があります。
関数は多くの人に使ってもらってなんぼのものになるからです。
ちなみにですが、エクセルが用意してくれているようなMsgBoxの戻り値はエディタからも大体確認できます。
まず、関数名をドラッグ→右クリック→定義
小さくて見辛いのですが、下の項目のAsの後が戻り値の型(型については別記事で触れようと思います)を示しておりますのでこれをクリックしてください。
すると右側に戻り値で返される可能性があるものが一覧で出てきまして、これが戻り値になります。
今回、1が返ってきたので順にみていきますと「vbOK」だそうです。
これで何となく「OK」が選択されたときの返却値なんだなと予想はつきます。
ただし、実際は関数のリファレンスを見た方が早いでしょう。
デバッグ方法
デバッグでは、不具合が発生した場合の調査やコードを記述しているときにお試しで実行してみる際にコードの途中で処理を中断できます。
まずは「ブレークポイント」を設定します。
これはエディタ(VBE)のコードの左の灰色部分をクリックします。
そうすると画像のように、その行の背景色が変わります。
こうすることで、実行した際に、ここで処理が中断されます。
では、実際に実行(F5)してみましょう。今度は左側に矢印マーク、背景色が黄色になったと思います。
これは処理中断している状態になります。
この状態で変数にカーソルをあてると、その変数に今どんな値が設定されているのか確認することができます。
また、変数名を選択して右クリック→「ウォッチ式の追加」でウォッチウィンドウに追加して常にウォッチすることができます。
(ウォッチウィンドウが表示されていない人は「表示」タブ→ウォッチウィンドウで表示できます)
※ 変数名をドラッグしてウォッチウィンドウにドロップでも追加できます。
ループ処理のときとか特にそうですが、いちいちカーソルを当てるのも面倒な場合にウォッチしておくと良いです。
一行ずつ処理を進めていきたい場合は「デバッグ」タブの「ステップイン」または「ステップオーバー」で可能です。
ここら辺はショートカットも同時に覚えておくと良いかもしれません。
次のブレークポイントまで処理を進めたい場合はF5でOKです。
なお、あまり知られておりませんが、左側の黄色い矢印はドラッグしたまま好きな場所まで動かすこともできます。
なので、うっかり進みすぎてしまった場合は戻すと良いでしょう。
ただし、処理によっては不具合の元なので多用しないようにしましょう。
中断していた処理をやめたい場合は「実行」タブのリセットから可能です。
デバッグについては以上です。他にも色々手法があったりするのですが、大体これで何とかなります。
あとは、デバッグに慣れてきた頃に「もう少し楽にできないかな」と思った際に調べる程度で良いと思います。
当記事は以上となります。
全3回にわたってVBAの基礎的な知識を学んできました。本当に基礎部分となりますので、あとはやりたい事をピンポイントで調べると良いでしょう。
少しでもVBAのお勉強の助けになれば幸いです。
次回以降は、実際に簡単なプログラムを作ってみましょう。
プログラミングは結局自分で作ってみないことには始まりません。
自分で手を動かして理解を深めていきましょう!
長々とお疲れさまでした!