宣言方法で変数の適用範囲を変える エクセルVBA

vbasengeneyecatch

エクセルVBA のコード組立ての中で、変数の宣言は軽視されている部分でもあります。

実は、この宣言一つで変数の適用範囲をコントロール出来ます。

変数を柔軟に使うことが出来るようになります。

エクセルVBAのコード組み立てで使う変数。「この変数を使いますよ!」というのが「変数の宣言」です。

今回は、この変数の宣言についてです。

こんにちは、じゅんぱ店長(@junpa33)です。

変数の宣言方法で適用範囲をコントロール

エクセルVBAは、変数の宣言についても柔軟な設計になっています。

VBAルール的には、何も宣言しなくても動作OKになっています。

では、変数の宣言はしなくてもいいのかと言えば、全くそうではありません。

この記事では、宣言する理由、宣言の仕方、宣言場所で違う変数の有効範囲について解説します。

宣言することには必要性があります

宣言なしでも変数は、自動的にデータ型が「Variant型」という ”何でもありですよ!型” と想定して動いてくれます。

「ではこれでいいですね。バンザイ!!」とは、なりません。これでは、変数によるコードエラーが分からなくなってしまいます。

VBAプログラムエラーの中では、大きな割合として「変数によるエラー」があります。それが見えなくなってしまうということです。

例えば、「合計の計算で、”何でもありですよ!型”変数が、300+250+150円を計算しようとしました。」

人が計算したら想像を加えて「700円」となりますが、VBAプログラムでは、「計算不能」になります。つまりエラーです。

これはVBAルール的には、「変数は”何でもありですよ!型”」なので、変数に代入するの値としては受け入れてしまうからです。

他にも、変数として名付けた変数名のスペルミスによるエラーの発見にも手こずってしまいます。

「変数の宣言文」は無くてもいい、「変数の宣言文」は、プログラムの動きに直接関係ないと言われますが、実は

記述された変数が、「どこか間違っていないか」かをチェックしてくれる「お目付け役」の役割をしているのです。

変数のデータ型を宣言する

変数のデータ型を宣言する構文は、

Dim 変数 As データ型

になります。

複数の変数を同時に宣言することも出来ます。

Dim 変数 As データ型, 変数 As データ型, 変数 As データ型, 変数 As データ型, ・・・, 変数 As データ型

データ型を省略することも出来ます。この場合は、データ型がVariant型の指定になります。

Dim 変数

Dim 変数, 変数, 変数,・・・, 変数

主なデータ型の紹介します

データ型データ型表記値の範囲
バイト型Byte0 から 255 の正の整数値
ブール型BooleanTrue または 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あらゆる種類の値を保存する

コード編成で、よく使うデータ型としては、

  1. 数値を表す「バイト型」、「整数型」、「長整数型」、「単精度浮動小数点型」、「倍精度浮動小数点型」がありますが、その中で、
    整数値は「長整数型」、実数(小数点を扱う)は「倍精度浮動小数点型」を指定していればOKです。あまり細かく考えなくていいと思います。
  2. 文字列の「文字列型」
  3. 日付の「日付型」
  4. オブジェクトの「オブジェクト型」
    この「オブジェクト型」は「固有オブジェクト型」と「総称オブジェクト型」に分かれます。
    「固有オブジェクト型」は「Workboook」「Worksheet」「Range」
    「総称オブジェクト型」は「Object」
    エラーの発見の面からも、出来るだけ固有オブジェクト型を使う方がいいです。

変数の宣言は強制できます

「ツール」から「オプション」を選択します。

表示されるオプションウインドウの「編集」タブで、「変数の宣言を強制する」チェックボックスをオンにします。

vbasengen001vbasengen002

標準モジュールを挿入すると「Option Explicit」と表示されています。

vbasengen003

これで、「変数宣言が強制」になりました。(解除する時は、この文字を削除してください。)

参考記事

Option Explicitについて桑木区はこちらを参考にしてください。

vbaopexplieyecatchOption Explicitとは何、必要? VBA記述で不注意なエラーを防止する

変数の適用範囲を変更する宣言文

プロシージャーの中で変数の宣言を行うと、そのプロシージャーだけで有効な変数となります。

一方で、

「宣言セクション」で変数の宣言を行うと、プロシージャーを超えて、変数が有効となります。こちらの方は結構使える機能になっています。

例えば

「Dim 変数 As データ型」をこの「宣言セクション」で記述すると、その宣言したモジュール内で変数が有効になります。

「Public 変数 As データ型」をこの「宣言セクション」で記述すると、

全モジュールの全プロシージャー内で変数が有効になります。

ただし

このPubulicステートメントを使う場合は、変数名に注意してください。

いかなる場所での変数宣言であっても、違う用途の変数を同名にしてはいけません。

宣言セクション例題

同一モジュール内で変数が有効になっている場合です。

vbasengen004

何がメリットかというと、同一モジュール内でプロシージャーで利用する変数を代入したデータごと共有できるということです。

プロシージャーをパーツ化して、親と子の関係(子を親に入れ込む関係)にする時に、「Callステートメント」を使います。

この方法ですと、子プロシージャーから一旦取り出した変数は、モジュール内全プロシージャーで即座に有効になります。

どこから来た変数なのか読み解きにくくなる場合は「コメント」を入れておきましょう。

基本、「Callステートメント」は「Call プロシージャー名 (引数)」という構文になります。

取り出した引数を何回か利用したい場合、他の親プロシージャーで使いたい場合、

その度「Call プロシージャー名 (引数)」で呼び出すのはいかにも面倒です。

MEMO

Callステート年とについてはこちらを参考にしてください。

vbacalleyecatch部品化プロシージャーでCallステートメントは必須

Round関数の使い方についてはこの記事を参考にしてください。

vbaroundeyecatchRound関数の罠。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のはじめの1歩「変数の宣言」を覚える

変数は、プロシージャーの中で主役級の役割を担っています。

その変数が、ほかのプロシージャーでも使うことができて、別のモジュールへ行っても使うことが出来る。

変数について、そのような便利な使い方が出来るようになるということです。

エクセルVBAの学習の最初の方で、変数の宣言についての内容があります。

非常に基本的な部分ですが、非常に重要な部分でもあります。少し深堀をすると面白い部分でもあります。

短期間でエクセルVBAの独学習得を目指したいなら

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

このサイトでよく使うVBAのコードのトピックを纏めています。

「エクセルVBA最速理解」の記事一覧を開く

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません