VBAの構文
・オブジェクト式
・ステートメント
・関数(Right、Left、Mid、InStr、Now、Format、MsgBox、InputBox など)
・演算子(「+」「-」「*」「/」「^」「\」「Mod」「And」「Or」「Not」
・モジュールとプロシージャ
【ここでのポイント】
細部については、後の章で詳しく学ぶので、
VBAがとのような作りになっているかをざっくりと理解すれば良いで使用。
最初は、たとえ話で全体のイメージを持てればそれで構いません。
従って、この時点では細部について、
「良く分からない・・・」
それは当たり前と言っても良いでしょう。
難しく感じる部分もあると思いますが、
そういうものだと思って、とりあえずはそんなものかと思うくらいで良いです。
後々の章をやりながら、時々読み返すことで理解を深めていくようにして下さい。
オブジェクト式
・ステートメント
・関数
ステートメントと関数についての詳細は後の章になります。
目的の対象物を特定し、その対象物に何かをする時のVBAの書き方の事です。
そして、
目的の対象物がオブジェクトであり、
何をするかによって、プロパティやメソッドを使い分けるという事です。
オブジェクトとは
目に見える物体と考えても良いでしょう。
このセルがオブジェクトです。
VBAでは、セルはRangeオブジェクトと言います。
これらがオブジェクトです。
ワークシートには、名前、行数、列数、等々の情報があります。
セルには、番地(A1等)、値、フォント、塗りつぶし、罫線、等々の情報があります。
セルのフォントもオブジェクトです。
フォントは、フォント名、サイズ、色などがあります。
このように複数の情報を持っているものは、オブジェクトになります。
操作対象 | オブジェクト名 | VBAでの命令 | 説明 |
ワークブック | WorkBook | WorkBooks | ワークブック全般 |
ActiveWorkbook | アクティブなワークブック | ||
ThisWorkbook | マクロが書かれているワークブック | ||
ワークシート | WorkSheet | WorkSheets | ワークシート全般 |
ActiveSheet | アクティブなワークシート | ||
セル | Range | Range | セル範囲 |
Cells | 一つのセル | ||
ActiveCell | アクティブなセル | ||
Rows | 行全体 | ||
Columns | 列全体 | ||
フォント | Font | Font | フォント全般 |
塗りつぶし | Interior | Interior | 塗りつぶし全般 |
罫線 | Border | Borders | 罫線全般 |
このあたりを覚えることが難しく、VBA習得の障壁ともなっています。
事例のVBAコードを見て、少しずつ慣れていくことで自然に覚えていけるものです。
プロパティとは
対象物(つまり物体)がどういうものかを説明している項目です。
姿形、大きさ、色、等々
フォントであれば、フォント名、サイズ、色
対象物がどのような物かの情報であるかを知ることが出来ます。
そして、
その情報を変更することで、対象物の状態を変えることが出来ます。
このように、
プロパティの値を取得したり、変更することでオブジェクトを操作することが出来ます。
これがオブジェクト式と呼ばれるものです。
この=は、等しいと言っているのでなく、値を入れるものだと覚えて下さい。
オブジェクトのプロパティに値を入れることで、オブジェクトの状態を変えられます。
ピリオド(ドット)でつないで書きます。
この、ピリオド(ドット)は、
「の中の」と読んでください、簡単に「の」と読めば意味が通じます。
オブジォク「の中の」プロパティに値を入れる
というように読めば理解しやすいはずです。
A1セルなら、Range("A1") と書きます。
そして、値はValueプロパティです。
Range("A2").Value = 2018
A2セルに「2018」と入れる
数値はそのまま書けますが、文字列は"ダブルクォーテーションで囲みます。
変更出来ないプロパティものもあります。
変更出来ないプロパティを、
「読み取り専用プロパティ」と言います。
ヘルプや、オブジェクトブラウザで調べなければ知ることはできません。
もしくは、
上記のメッセージが出た時に、読み取り専用プロパティなのだと知ることになります。
プロパティの値の取得
しかし、値を取得したら何かに使わなければなりません。
VBAで、
オブジェクト.プロパティ
とだけ書くと、以下のエラーメッセージが出ます。
A1セルのValueプロパティを取得して、メッセージボックスの引数に渡します。
メソッドとは
VBAでは、オブジェクトに何らかの動作を起こさせるものだと覚えて下さい。
または
オブジェクト.メソッド 値
または
オブジェクト.メソッド オプション:=値
オブジェクト.メソッド 値1, 値2, 値3
オブジェクト.メソッド オプション1:=値1, オプション2:=値2, オプション3:=値3
シートの関数で括弧()の中に書くものと同じです。
=SUMIF(範囲,検索条件,合計範囲)
つまり、
セルを削除するには、このオプション・追加情報が必要だという事です。
Range("B2").Delete xlUp
または
Range("B2").Delete Shift:=xlUp
このように書きます。
セルを削除した後に、上にずらすのか左にずらすのかを指定しています。
Range("B2").Delete Shift:=xlUp
オプション:=
Shift:=
これらを引数名と呼びます。
引数には、それがどのようなものかがわかるように名前がついています。
この引数名は省力することもできますので、
オブジェクト.メソッド 値
オブジェクト.メソッド オプション:=値
これらは同じことをしていることになります。
:=
これはVBAの中でも特殊な記号の使い方で、
このメソッドの引数名の指定以外では使われることはありません。
プロパティとメソッド
その機能だけを見ると違いがはっきりしません。
メソッドは、オブジェクトに何らかの動作を起こさせる
実際には、
プロパティで、オブジェクトが動作しているように見えるものもありますし、
メソッドでオブジェクトの状態や様子が変わることにもなります。
何より、同じことをするプロパティとメソッドも存在しています。
メソッドは動詞
名詞っぽい単語、動詞っぽい単語くらいの感じになります。
従って、確実に見分けられるわけではありません。
ヘルプや、オブジェクトブラウザで調べなければ知ることはできません。
以下の文だけが書かれていた場合、
オブジェク.○○○ オプション:=値
それを区別することは出来ません。
MsgBox Range("A1").Select
Selectは、メソッドです。
従って、この命令は間違って指定したもで、結果は「True」と表示されます。
少なくともエラーにはなりません。
プロパティとメソッドの厳密な区分けは出来ないという事になります。
そうはいっても、
ほとんどの場合、引数に指定されているものはプロパティです。
プロパティの値の取得した結果を、引数として渡すものです。
物体が違えば、それを表す状態の項目も違うということです。
多数のプロパティ・メソッドがあります。
そして、それは、オブジェクトごとに違います。
これを全て覚えることは不可能と言っても良いでしょう、それくらい沢山あるという事です。
どのくらいあるかを実感しておいてください。
MOS試験に出そうなものは、実務で良く使うものが多いはずです。
従って、サンプルのVBAコードに出てくるプロパティ・メソッドを都度覚えていけば良いでしょう
オブジェクトの階層構造
これらがオブジェクトだと言いました。
シートの中にセルがあります。
どのブックのどのシートのどこのセルかを指定しなければなりません。
これを指定する時に、VBAでは、
つまり、プロパティに値を入れるなら、
つまり、
オブジェクト.子オブジェクト.孫オブジェクト.プロパティ = 値
こういう事になります。
実はかなり違う説明が必要になってきますが、
試験対策として、また入門時の解釈としては、このように理解してください。
コレクションとは
この複数のワークシートの集まりを、ワークシートのコレクションと呼びます。
コレクション | コレクション名 | オブジェクト名 |
ワークブックのコレクション | WorkBooks | WorkBook |
ワークシートのコレクション | WorkSheets | WorkSheet |
セルのコレクション | Range | Range |
Cells | ||
Rows | ||
Columns | ||
罫線のコレクション | Borders | Border |
そうです、
「オブジェクトとは」に掲載した、「VBAで良く使うオブジェクト」とかなり同じです。
つまり、先の表で「VBAでの命令」の多くが、実はコレクションだという事です。
コレクションは複数形になっていることに注目してください。
つまり、
オブジェクトとは、その物体1つを指していて、
コレクションは、その物体を集めた集合体なので複数形になっているという事です。
ごく一部に、単数形・複数形の規則に反するものもあります。
Rangeは、オブジェクトでもありコレクションでもあります。
しかし、単数形のCellオブジェクトは存在しません。
Cellsは、Rangeオブジェクトのコレクションです。
コレクションを使って、名前で指定するか、何番目かの数値で指定します。
WorkSheets(数値)
WorkSheets(2)
オブジェクトブラウザの使い方
「表示」→「オブジェクト ブラウザ」
ショートカットはF2
ステートメント
日本語では、「命令文」と訳されます。
Range("A2").Value = "VBA"
狭義のステートメント
ステートメント | 説明 |
Dim | 変数を宣言し、メモリ領域を割り当てます。 |
Do...Loop | 指定した条件が真 (True) である間、または条件が真 (True) になるまで、一連のステートメントを繰り返し実行するフロー制御ステートメントです。 |
For Each...Next | 配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行するフロー制御ステートメントです。 |
For...Next | 指定した回数だけ、一連のステートメントを繰り返すフロー制御ステートメントです。 |
If...Then...Else | 式の値に基づいて、条件付きの実行を行うフロー制御ステートメントです。 |
Select Case | 条件式の値に従って、複数のステートメント ブロックのいずれかを実行させるフロー制御ステートメントです。 |
With | オブジェクトやユーザー定義型に対して、一連のステートメントを実行するフロー制御ステートメントです。 |
End | プロシージャやブロック (一連のステートメントの集まり) を終了させるフロー制御ステートメントです。 |
Call | Sub プロシージャ、Function プロシージャ、ダイナミック リンク ライブラリ (DLL) プロシージャに制御を渡すフロー制御ステートメントです。 |
Sub | Sub プロシージャの名前、引数、およびプロシージャの本体を宣言します。 |
Function | Function プロシージャの名前、引数、および本体部分を構成するコードを宣言します。 |
公式テキストには書かれていない部分もありますが、VBAの基本として覚えておいてください。
しかし、1つの命令がとてもながくなり見づらくなってしまう場合もあり、これを改行して複数行に書くことが出来ます。
以下では、わかり易いように短い命令文の例を示します。
Range("A2").Value = "VBA"
= "MOS"
Range("A2").Value = _
"VBA"
括弧や演算子の前後で改行できます。
オブジェクト式の.(ピリオド)の前後も改行可能です。
1行に複数の命令文を記述
Range("A2").Value = "VBA"
コメント(注釈)の書き方
Range("A1").Value = "MOS" 'A1セルにMOS
Range("A2").Value = "VBA" 'A2セルにVBA
コメントは、マクロ実行に何の影響も及ぼしません。
関数(Right、Left、Mid、InStr、Now、Format、MsgBox、InputBox など)
関数の戻り値を使わない場合
関数は、全部で150程度あります。
簡単には、全てを覚えられるものではありません。
試験対策としては、以下を重点的に覚えて下さい。
試験範囲としては、最後に「など」と書かれていることもあり、
実際に出題される可能性のある関数がどれかは不明です。
念の為、以下のページは一通り目を通しておいてください。
第46回.VBA関数(日付,DateAdd)
ただし、いきなり50個を覚えるのではなく、
実際の使用例が出てきたとに、その関数と関連する関数を覚えるようにして下さい。
演算子(「+」「-」「*」「/」「^」「\」「Mod」「And」「Or」「Not」
比較演算子
文字列連結演算子
論理演算子
代入演算子
演算子 | 説明 |
+ | 足し算 |
- | 引き算 |
* | 掛け算 |
/ | 割り算 |
\ | 割り算の商 |
Mod | 割り算の余り |
^ | べき乗 |
比較演算子 | 意味 |
= | 等しい |
<> | 等しくない |
> | より大きい |
>= | 以上 |
< | より小さい |
<= | 以下 |
等価演算子Isと文字列比較演算子Likeも比較演算子に含まれます。
比較演算子 | 意味 |
Is | 2つのオブジェクト変数を比較します。 |
Like | パターン マッチング機能で2つの文字列の比較を行います。 |
文字列連結演算子 | 意味 |
& | 2つの式に対して文字列連結を行います。 |
+ | 数値同市の場合は、2つの数値の和を求めます。 文字列の場合は、文字列連結を行います。 |
※文字列結合として+演算子は使うべきではありません。
論理演算子 | 意味 |
And | 論理積 |
Or | 論理和 |
Xor | 排他論理和 |
Eqv | 論理等価 |
Imp | 論理包含 |
Not | 論理否定 |
Xor、Eqv、Imp、これらは実務では使うべきではありません。
結果の判断が難しく動作を把握しづらいからです。
そして、And、Or、Notの組み合わせ方で同じことが出来るからです。
MOS試験にも出ることはないと思います。
代入演算子 | 意味 |
= | 変数またはプロパティに値を代入します。 |
算術演算子 | 比較演算子 | 論理演算子 |
指数演算 (^) | 等しい (=) | Not |
マイナス符号 (-) | 等しくない (<>) | And |
乗算と除算 (*、/) | より小さい (<) | Or |
整数除算 (\) | より大きい (>) | Xor |
剰余演算 (Mod) | 以下 (<=) | Eqv |
加算と減算 (+、-) | 以上 (>=) | Imp |
文字列連結 (&) | Like Is |
かっこ () を使用すると、優先順序を入れ替えたり、式のある部分を他の部分よりも先に評価することができます。
文字列連結演算子 (&) は算術演算子ではありませんが、
その優先順位は、どの算術演算子よりも低く、どの比較演算子よりも高くなります。
モジュールとプロシージャ
・標準モジュール
・クラス モジュール
・シート(ワークシート、グラフシート)
・ユーザーフォーム
イベントを利用するマクロは、そのオブジェクトのモジュールに記述します。
イベントは、VBAスタンダードの範囲になります。
標準モジュール
クラス モジュール
そういうものがあるのだとい程度で覚えておけば良いです。
モジュールによる違い
標準モジュールに記述しなければなりません。
これらは、標準モジュールに記述しなければなりません。
オブジェクト モジュールにPublicで定義した変数を、他のモジュールで使用する方法もあります。
オブジェクト.変数
と記述することで、他のモジュールでも使う事は可能です。
ただし、このような使い方はするべきではありません。
プロシージャーの種類
Subステートメントを使用して書かれるプロシージャーです。
Functionステートメントを使用して書かれるプロシージャーです。
つまり、独自の関数を作成する為に使用します。
関数なので、結果の値を返します。
Functionプロシージャーは関数であり値を返すものだと覚えておいてください。
クラスは独自のオブジェクトを作成するものです。
つまり、オブジェクトのプロパティを作成するものです。
別のプロシージャーを実行する
Callを書いたときには、引数をかっこで囲む必要があります。
Call MyProc("引数")
Call MyProc
【業務改善の実務】
イベントは、オブジェクト モジュールに書く。
プロパティは、値の取得と設定がある。
メソッドは、引数を:=で指定する。
ステートメントや関数は、良く使うものだけしっかり覚える。
理屈より、まずは書いて動かす。
エラーが出たら、原因を調べて、そして修正する。
そして、また動かす。
この繰り返しでVBAスキルはアップしていきます。
エラーの原因を調べる時に、それに関する文法を自然と学んで行くことになります。
【本サイト内の関連ページ】
第105回.Callステートメント
オブジェクトとプロパティの真実
VBAエキスパート公式テキスト
こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。
同じテーマ「VBAエキスパート対策」の記事
マクロとVBAの概念
マクロの記録
VBAの構文
変数と定数
セルの操作
ステートメント
ブックの操作
シートの操作
デバッグデの基礎
マクロの実行
VBAベーシック試験対策まとめ
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA入門編
- VBAエキスパート対策
- VBAの構文
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。