エクセルVBA のコード組立ての中で、変数の宣言は軽視されている部分でもあります。
実は、この宣言一つで変数の適用範囲をコントロール出来ます。
変数を柔軟に使うことが出来るようになります。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルVBAのコード組み立てで使う変数。「この変数を使いますよ!」というのが「変数の宣言」です。
今回は、この変数の宣言についてです。
コンテンツ
変数の宣言方法で適用範囲をコントロール
エクセルVBAは、変数の宣言についても柔軟な設計になっています。
VBAルール的には、何も宣言しなくても動作OKになっています。
では、変数の宣言はしなくてもいいのかと言えば、全くそうではありません。
この記事では、宣言する理由、宣言の仕方、宣言場所で違う変数の有効範囲について解説します。
宣言することには必要性があります
宣言なしでも変数は、自動的にデータ型が「Variant型」という ”何でもありですよ!型” と想定して動いてくれます。
「ではこれでいいですね。バンザイ!!」とは、なりません。これでは、変数によるコードエラーが分からなくなってしまいます。
VBAプログラムエラーの中では、大きな割合として「変数によるエラー」があります。それが見えなくなってしまうということです。
例えば、「合計の計算で、”何でもありですよ!型”変数が、300+250+150円を計算しようとしました。」
人が計算したら想像を加えて「700円」となりますが、VBAプログラムでは、「計算不能」になります。つまりエラーです。
最後の150円は、エクセルでは数値とは認識されないのでエラーとなります。
これはVBAルール的には、「変数は”何でもありですよ!型”」なので、変数に代入するの値としては受け入れてしまうからです。
他にも、変数として名付けた変数名のスペルミスによるエラーの発見にも手こずってしまいます。
「変数の宣言文」は無くてもいい、「変数の宣言文」は、プログラムの動きに直接関係ないと言われますが、実は
記述された変数が、「どこか間違っていないか」かをチェックしてくれる「お目付け役」の役割をしているのです。
変数のデータ型を宣言する
変数のデータ型を宣言する構文は、
Dim 変数 As データ型
になります。
複数の変数を同時に宣言することも出来ます。
Dim 変数 As データ型, 変数 As データ型, 変数 As データ型, 変数 As データ型, ・・・, 変数 As データ型
データ型を省略することも出来ます。この場合は、データ型がVariant型の指定になります。
Dim 変数
Dim 変数, 変数, 変数,・・・, 変数
主なデータ型の紹介します
データ型 | データ型表記 | 値の範囲 |
---|---|---|
バイト型 | Byte | 0 から 255 の正の整数値 |
ブール型 | Boolean | True または Falseを保存する |
整数型 | Integer | -32,768 から 32,767 の整数値 |
長整数型 | Long | -2,147,483,648 から 2,147,483,647の整数値 |
通貨型 | Currency | -922,337,203,685,477.5808 から 922,337,203,685,477.5807の数値 |
単精度浮動小数点型 | Single | -3.402823E38から-1.401298E-45 1.401298E-45から3.402823E38 |
倍精度浮動小数点型 | Double | -1.79769313486231E308から-4.94065645841247E-324 4.94065645841247E-324から1.79769313486232E308 |
日付型 | Date | 日付と時刻を保存する |
文字列型 | String | 文字列を保存する |
オブジェクト型 | Object | オブジェクトへの参照を保存する |
バリアント型 | Variant | あらゆる種類の値を保存する |
コード編成で、よく使うデータ型としては、
- 数値を表す「バイト型」、「整数型」、「長整数型」、「単精度浮動小数点型」、「倍精度浮動小数点型」がありますが、その中で、
整数値は「長整数型」、実数(小数点を扱う)は「倍精度浮動小数点型」を指定していればOKです。あまり細かく考えなくていいと思います。 - 文字列の「文字列型」
- 日付の「日付型」
- オブジェクトの「オブジェクト型」
この「オブジェクト型」は「固有オブジェクト型」と「総称オブジェクト型」に分かれます。
「固有オブジェクト型」は「Workboook」「Worksheet」「Range」
「総称オブジェクト型」は「Object」
エラーの発見の面からも、出来るだけ固有オブジェクト型を使う方がいいです。
変数の宣言は強制できます
「ツール」から「オプション」を選択します。
表示されるオプションウインドウの「編集」タブで、「変数の宣言を強制する」チェックボックスをオンにします。
標準モジュールを挿入すると「Option Explicit」と表示されています。
これで、「変数宣言が強制」になりました。(解除する時は、この文字を削除してください。)
変数の適用範囲を変更する宣言文
プロシージャーの中で変数の宣言を行うと、そのプロシージャーだけで有効な変数となります。
一方で、
「宣言セクション」で変数の宣言を行うと、プロシージャーを超えて、変数が有効となります。こちらの方は結構使える機能になっています。
例えば
「Dim 変数 As データ型」をこの「宣言セクション」で記述すると、その宣言したモジュール内で変数が有効になります。
「Public 変数 As データ型」をこの「宣言セクション」で記述すると、
全モジュールの全プロシージャー内で変数が有効になります。
ただし
このPubulicステートメントを使う場合は、変数名に注意してください。
いかなる場所での変数宣言であっても、違う用途の変数を同名にしてはいけません。
同一モジュール内で変数が有効になっている場合です。
何がメリットかというと、同一モジュール内でプロシージャーで利用する変数を代入したデータごと共有できるということです。
プロシージャーをパーツ化して、親と子の関係(子を親に入れ込む関係)にする時に、「Callステートメント」を使います。
この方法ですと、子プロシージャーから一旦取り出した変数は、モジュール内全プロシージャーで即座に有効になります。
どこから来た変数なのか読み解きにくくなる場合は「コメント」を入れておきましょう。
基本、「Callステートメント」は「Call プロシージャー名 (引数)」という構文になります。
取り出した引数を何回か利用したい場合、他の親プロシージャーで使いたい場合、
その度「Call プロシージャー名 (引数)」で呼び出すのはいかにも面倒です。
部品化プロシージャーでCallステートメントは必須 Round関数の罠。VBAで数値を四捨五入する時の注意点Option Explicit
Dim oP As Long, oPt As Long
Sub 消費税10込()
Dim nPt As Long
'最初に変数をリセットします
oP = 0
oPt = 0
nPt = 0
'旧消費税の税込価格のセット
oPt = 650
'旧消費税の税込価格から本体価格を分離
Module1.旧消費税
'本体価格oPに消費税10%を加算する
nPt = WorksheetFunction.Round(oP * 1.1, 0)
Debug.Print "消費税10%税込価格" & nPt & vbCrLf & "本体価格" & oP
End Sub
Sub 旧消費税()
'旧消費税込から本体価格を算出
oP = WorksheetFunction.Round(oPt / 1.08, 0)
End Sub
変数の適用範囲のまとめ
「変数を宣言する」ことの意味は、
VBAコードの組み上げの中で、変数によるエラーの監視をしてくれる。
プロシージャーを超えて変数を有効に使えるようにする。
この2点にあります。
軽視されがちな変数宣言ですが、動くプログラムを組めるのも、この正に「裏方さん」の力そのものだと思います。
変数は、プロシージャーの中で主役級の役割を担っています。
その変数が、ほかのプロシージャーでも使うことができて、別のモジュールへ行っても使うことが出来る。
変数について、そのような便利な使い方が出来るようになるということです。
エクセルVBAの学習の最初の方で、変数の宣言についての内容があります。
非常に基本的な部分ですが、非常に重要な部分でもあります。少し深堀をすると面白い部分でもあります。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。