ExcelマクロVBA 変数を使ってみよう(初心者向け10)

スポンサーリンク
くるみこ
くるみこ

それでは今回はいよいよ「変数」の使い方を勉強してみましょう!
変数は「マクロの記録」では使われないんだよ(^^)/

はい!それは自分で書かないといけないということですね(^^)
今回もよろしくお願いしますm(_ _)m

前回のおさらいはこちらの記事です(^^)/ 下のカードをクリックすれば開きます

くるみこ
くるみこ

前回記事でわかったこと
・VBEオプション設定で「Option Explicit」を設定
・標準モジュールを作成する方法
・プロシージャの基本的な記述方法
・MsgBox関数でメッセージを表示する方法

【この記事でわかること】
・変数とは何かがわかります
変数を使う基本的な方法がわかります
・変数の命名規則について調べてみたことがわかります

スポンサーリンク

変数とは何か?

「変数」とは、データの入れ物のことです。データを入れ物(変数)に入れておいてから必要な時に入れ物(変数)からデータ取り出して使います
・データは代表的には数値や文字列などのことですが色々な種類のデータがあります
・色々な種類のデータについてはこの先で必要になった都度別途説明していきます

変数を使う基本的な方法

変数の宣言を強制しましょう

前回記事でVBEのオプション設定から「Option Explicit」を設定する方法を解説しています。これが書かれているモジュールでは宣言していない変数を使えないようにするという命令です。宣言していない変数を使うとエラー表示します←これが大事
・このオプションは必ず設定しておきましょう

宣言のしかた

Dimを使って変数を宣言します

・「型」を指定する場合       Dim 変数名 As データ型
・「型」を指定しない場合    Dim 変数名

「型」を指定しない場合は、Variant(バリアント)型が指定されたものとされます
Variant型の場合、変数に入っている値の種類をチェックするロスが発生します
・データ型を指定したほうが処理速度が向上するので必ず指定しましょう!
【主なデータ型一覧】

表記データ型の種類サイズ格納できるデータ
String文字列型1文字あたり
1~2バイト
0 〜 約 20 億
Long長整数型4バイト-2,147, 483,648 〜 2,147, 483,647
Variantバリアント型16バイト
+1字1バイト
数値は倍精度浮動小数点型と同じ
文字列は文字列型と同じ
Booleanブール型2バイトTrue または False
Date日付型6バイト100年1月1日~9999年12月31日
Objectオブジェクト型4バイト任意の Object 参照
Integer整数型2バイト-32,768 〜 32,767
Single単精度浮動小数点型4バイト-3.402823E38 から -1.401298E-45 (負の値)
1.401298E-45 から 3.402823E38 (正の値)
Double倍精度浮動小数点型8バイト-1.79769313486231E308 から -4.94065645841247E-324 (負の値)
4.94065645841247E-324 から 1.79769313486232E308 (正の値)
Currency通貨型8バイト-922,337,203,685,477.5808 ~922,337,203,685,477.5807

・太字はよく使うデータ型です

複数の変数を宣言する時の注意点

複数の変数を一行で宣言するときは注意が必要です
「Dim 変数名 As データ型」をカンマで区切ってつなげます
「Dim 変数名A As データ型」,変数名B As データ型」Dimは最初だけでOK

【注意しなければならないのは】
「Dim 変数名A, 変数名B, 変数名C As データ型」のように指定してはいけません
・この場合、指定データ型になるのは「変数名C」だけです
・「変数名A」と「変数名B」は型が省略されたVariant(バリアント)型とされます

Dim以外の宣言

変数の種類によって、Dim以外の別の命令語を使う場合もあります

例1: Public変数名 As データ型(パブリック変数)
    パブリック変数は、プロジェクトレベルで使用できる変数の宣言です

例2: Private 変数名 As データ型(プライベート変数)
    プライベート変数は、モジュールレベルで使用できる変数の宣言です
    PrivateDimでもOKです

例3: Static変数名 As データ型(静的変数)
    静的変数は、プロシージャが終了しても変数の値を保持しています
    同プロシージャ再実行でも直前の値が格納されたままとする宣言です

変数を使ってみる

変数にデータ(値)を格納する

変数に値を入れるには「=」記号を使います。次のマクロは、文字列型の変数msg
“コードを初めて書いてみたよ!”という文字列を格納しています
・実行結果は前回記事と全く同じです

Option Explicit
Sub msgTest2()
    Dim msg As String   '文字列型の変数を宣言
    
    msg = "コードを初めて書いてみたよ!"
    MsgBox msg, vbInformation, "メッセージ"

End Sub
'前回記事のコード
Sub メッセージテスト()
    MsgBox "コードを初めて書いてみたよ!", vbInformation, "メッセージ"
End Sub

・「変数 = 値」の「=」は、変数イコール値ではなく、変数に値を「代入する」という意味あいです

Setでオブジェクト変数をセットする

・ワークブック、ワークシートやセルなどのオブジェクトを格納する「オブジェクト変数」は、先ほどのような「=」だけでは変数を格納することはできません
オブジェクト型で宣言したオブジェクト変数に、オブジェクトを格納するときは、Setを使わなければなりません

'オブジェクト型変数の例
Sub msgTest3()
    Dim wb As Workbook  'ワークブックオブジェクトを宣言
    Dim ws As Worksheet 'ワークシートオブジェクトを宣言
    Set wb = ThisWorkbook
    Set ws = ActiveSheet
    MsgBox "ブック名=" & wb.Name
    MsgBox "シート名=" & ws.Name
End Sub

・その手順は

  1. オブジェクト変数を宣言します
  2. オブジェクト変数をオブジェクトに割り当てます

・変数への割り当ては「Set 変数名 = オブジェクト
 「Set wb = Workbook」「Set ws = Worksheet」 のように記述します

・また、すべてのタイプのオブジェクトを表す「Object」を使った宣言「As Object」は、どんなオブジェクトでも格納できるオブジェクト変数の宣言です

変数の適用範囲について

・変数の適用範囲(使える場所)は、宣言のしかたで変わります
・プロシージャの種類やモジュール構成について理解しておく必要があります

プロシージャの種類

プロシージャとは、Sub ○○~End SubまたはFunction ○○~End Functionなど、マクロの最小実行単位です

プロシージャ名説明
Subプロシージャ・最も基本的なプロシージャ
・「マクロの記録」で自動記録された場合もこのSubプロシージャに記録されます
・戻り値を返せませんが、引数で渡すことはできます
Functionプロシージャ・主にユーザー定義関数の作成に使用します
・処理した結果を引数として返すことが出来ます
・また、ワークシート関数と同じようにセルへ記入して利用することが出来ます
イベントプロシージャ・「オブジェクトモジュール」と呼ばれる特別な場所に書きます
・各種(例:Changeなど)のイベントが発生したときに実行されるプロシージャです
Propertyプロシージャクラスモジュールのメソッドやプロパティを作成する場合に使用するプロシージャです

モジュール構成

・モジュールとは、こうしたプロシージャを記述する場所です
・VBEの左側に表示されている[プロジェクトエクスプローラ]に表示される「Sheet1」や「ThisWorkbook」などイベントを記述するモジュールをまとめてDocumentモジュールと呼びます
・また、「Sheet1」や「Sheet2」などワークシートのイベントを記述するところをシートモジュール、ブックのイベントを記述する「ThisWorkbook」をブックモジュールと個別に呼ぶこともあります
・UserFormを挿入するとFormモジュールが使えるようになります

適用範囲

変数の適用範囲をわかりやすく図にしてみるとこんな感じです

・パブリック変数 「pall」は、すべてのモジュールに対して有効
・モジュ-ル変数 「modall」「moda」は、Modele1 内のすべてに対し有効
・モジュ-ル変数 「modbb」「modb」は、Modele2 内のすべてに対し有効
・ローカル変数 「a~d」は、各subプロシージャ内で有効
モジュール変数の宣言は「Dim」「Private」どちらも同じです
パブリック変数とモジュール変数は、必ず宣言セクション(モジュールの先頭)で宣言します

変数の命名規則について

変数名の付け方の制限について

・変数名の付け方には次のような制限があります

・変数名に半角の英数字や日本語(漢字やひらがなカタカナ)を使用できます
・使える記号はアンダーバー(_)だけでそのほかの記号やスペースは使えません
・VBA関数、メソッド、プロパティで使用している表記は使用できません
・同じ適用範囲で同じ名前は使えません
・変数名の字数制限は半角で255文字以内です
・変数名の先頭に数字やアンダーバー(_)は使えません

・この制限を守れば変数名の付け方は自由です
・日本語も使えますが、他のプログラミング言語では普通は日本語の変数は使用できませんので、変数は英文字で付けるようにしたほうがよいと思います
・制限違反している場合はVBEがエラー表示して教えてくれますので安心です
変数名を見ただけで「何を表している」のかがわかるのがいい名前だと思います
・VBAだけを使うのであれば、大規模なシステムを組むことは無いと思いますので、大げさに変数の命名規則について考える必要は無いと思っています

変数の命名規則についての参考を次に紹介します
ただ、結論はありませんので参考として知っておいてください

変数の命名規則について

ちなみに、私は変数名をあまり考えずに思い付きで適当に付けています。今までのサンプルを見ていただければわかるように、かなりいい加減です

一時期、変数名を規則的につけようと思ったこともありましたが結論の出ないままにしていました。改めて調べてみて「こんなことになっていたんだ!」と驚いています
今後は、今回調べてみたことを参考に改善していきたいと思っています

ハンガリアン記法(現在は非主流)

「システムハンガリアン」と「アプリケーションハンガリアン」の2種類あります
単に「ハンガリアン記法」という場合は「システムハンガリアン」の意味で用いられることが多いそうです

アプリケーションハンガリアン

本来は型に現れない情報(絶対/相対座標、ドル/円など)を接頭語や接尾後として付与することで、コード上の意味的な間違いをなくすためにこの記法が使われていました。これをアプリケーションハンガリアンと呼びます

システムハンガリアン

アプリケーションハンガリアンに対して、型やスコープの識別子を付与する記法をシステムハンガリアンと呼びます

システムハンガリアンは、先頭に型の接続語を入れる記法です。変数名の前にその変数の属性や型を示すプレフィックスをつける命名規則です

例えば、文字列(string)の場合だと先頭に「s」や「str」付ける記法です

変数名を見れば型がわかるというメリットはあります。しかしプログラミング中に変数の型を変更する場合、同じ変数の名前をすべて変更する必要があり修正がつらくなるデメリットがあります

Microsoft自身は、(.NET Frameworkで)システムハンガリアンを廃止しています

キャメルケース記法

名前のとおりラクダのコブのように見えることからこの名前が付けられているようです。
次の2種類があります

アッパーキャメルケース(別名:パスカルケース)

単語の先頭文字を大文字で表記する記法です

ローワーキャメルケース(別名:キャメルケース)

(現在の主流はこれ!だそうです)
最初の単語のみ小文字で表記し、以降の先頭文字のみ大文字で表記する記法です
「動詞+目的語」とするのが一般的です

アンダースコア記法(別名:スネークケース)

(現在はあまり使用されなくなっています)
単語の間にアンダースコアを入れる記法です


まとめ(おわりに)

くるみこ
くるみこ

今回はここまでで終了です!
変数名は奥が深いでしょ! 理解できましたか?

はい! 何となくですが、わかったような気がします!
でも、最後の命名規則の部分はあまりよくわかりませんでした(^^ゞ

くるみこ
くるみこ

最初から完璧に全部わかることは100%無いので心配無用です(^^)

継続してやっていくうちに、自然と身についていくから心配しなくて大丈夫ですよ(^^)
では、この続きは只今準備中ですのでしばしお待ちください・・・・
ご期待くださ~い(^^)/

まとめと感想など

・変数とはデータの入れ物のことで、その使い方の基本がわかりました
・変数の種類や適用範囲について理解することが出来ました
・変数名の付け方の制限と変数の命名規則について知ることが出来ました

マクロ(VBA)を実行する際は必ずバックアップを取ってから行ってください
・マクロ(VBA)は実行後にファイルを保存すると元に戻すことはできません!
・実行後にファイルを保存せず終了すれば、実行前に戻すことができます!


ブログランキングに参加しています(^^)応援よろしくお願いしますm(_ _)m
にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

Visual Basicランキング

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
当面は「初心者向けマクロ」の記事を継続して書いていきます

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう現在検討中です
・その他雑記的に「小ネタなどいろいろ」・・・・・
・今後の記事にご期待ください(^^)/

過去記事のサンプルファイルをダウンロードできます

今回の記事のサンプルはありません!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください