変数について

スポンサーリンク
変数とは

倉庫の乱雑におかれた商品。整理するには、収納する箱を用意し、そこへ商品別に入れてラベルを貼り棚に収めます。VBAでこの「箱」の役割をするのが変数です。変数には文字列、数値などのデータを一時的に入れ、名前を書いたラベルを貼ります。このラベルを変数名といいます。

変数の宣言を強制する意味

VBAの初期設定では変数を宣言しなくても使えます。この状態では入力ミスをしてもマクロがエラーにならず、マクロ的には正常に終了してしまいます。つまり、宣言していない変数に代入した数値などが誤って認識され、正しい計算結果を得ることができません。
それを回避するには「変数の宣言を強制する」ことです。
VBAの初期状態では「変数の宣言を強制する」がオフになっているので「Option Explicit」が入力されていません。

「変数の宣言を強制する」をオンにする

では「変数の宣言を強制する」をオンにします。
VBEの[ツール]〜[オプション]をクリック。

[編集]タブの[変数の宣言を強制する]チェックボックスをオンにしたら[OK]をクリック。

これでモジュールの先頭にOption Explicitが自動的に入力されます。

これで宣言していない変数を使用していると、実行時に「コンパイルエラー 変数が定義されていません」とアラートがでて、コードの修正がもとめられます。

変数の宣言方法

変数を宣言するときは
Dim 変数名 As 変数の型名  → (例)Dim buf As String
1列にまとめて宣言することもできます
Dim 変数名 As 変数の型名, 変数名 As 変数の型名 → (例)Dim a As String, b As String
というように書きます。宣言の仕方や場所によって変数の適用範囲が限定されます。
変数はプロシージャごとに違うため、各プロシージャ内でしか使えません。

同名の変数でも各プロシージャ内でしか適用されない

メニューという変数はプロシージャA内では「とんかつ」、プロシージャB内では「ビール」と、全く別物として扱われます。

sub プロシージャA()
Dim メニュー As String
メニュー = “とんかつ”
       MsgBox “プロシージャAで私が注文したのは” & メニュー & “です。”
プロシージャB
MsgBox “プロシージャAでの注文は” & メニュー & “です。”
End Sub


sub プロシージャB()
Dim メニュー As String
メニュー = “ビール”
       MsgBox “プロシージャBで私が注文したのは” & メニュー & “です。”
End Sub

変数「メニュー」の適用範囲(スコープ)がプロシージャ内であることがわかります。

このように各プロシージャ内で使用する変数は、たとえ同名でも別なものです。一方「モジュール変数」といって複数のプロシージャで共有できる変数もあります。変数の適用範囲はモジュール内で有効になります。

共有できる変数

共有できる変数を使用する場合モジュールシートの一番上の部分に入力する。

Dim 共有変数 As Integer

sub プロシージャA()
共有変数 = 1000
プロシージャB
End Sub


sub プロシージャB()
       MsgBox 共有変数
End Sub

変数宣言のDimとデータ型

変数はデータを収納する「箱」といわれます。箱はどんな種類のデータを入れるかによって使い分けます。最初に何を収納する箱なのかを決めておくことにより効率良くデータを管理できます。これを行うのが「変数の型宣言」です。自作ソフトFactorXで使った主な変数の型を挙げておきます。

データ型名 称中に入る値
Byteバイト型0〜255の範囲の小さな正の整数値
Integer整数型-32,768〜32,767 負の数も含む整数
Long長整数型-2,147,483,648〜2,147,483,647 Integerには入らないような大きな数を入れる
Single単精度浮動小数点数値-3.402823E38 ~ -1.401298E-45(負の値)
1.401298E-45 ~ 3.402823E38(正の値)
Double倍精度浮動小数点数型-1.79769313486232E308 ~ -4.94065645841247E-324(負の値)
4.94065645841247E-324 ~ 1.79769313486232E308(正の値)
String文字列型最大約20億文字まで
Date日付型西暦100 年1月1日~西暦9999年12月31日までの日付と時刻
Booleanブール型真 (True) または偽 (False)を入れる
Objectオブジェクト型オブジェクトへの参照
Variantバリアント型あらゆる種類の値 数値はDoubleで格納できる値。文字列はStringで格納できる文字列

コメント

タイトルとURLをコピーしました