MOS VBAエキスパート対策 | 変数と定数 | MOS Excel VBAエキスパート対策です



最終更新日:2018-02-25

変数と定数


・変数の意味
・変数の宣言
・変数の代入と取得
・スコープ
・定数の意味と使い方


【ここでのポイント】

変数・定数の宣言とその適用範囲(スコープ)をしっかり覚えて下さい。

試験対策としては、
・データ型
・スコープ

このあたりは、問題が作りやすいと思われます。

むしろ、ここさえ押さえておけば十分だという事です。

ただし、
公式テキストには書かれていない事や、少々説明が不正確な部分があります。
出題する側からすると、ひっかけ問題を出しやすい部分でもあります。
※ひっかけ問題が出されるかどうかについては、何とも言えませんが。
これについては、最後に説明します。


変数の意味

データを格納するための名前を付けたメモリ上の場所。
値を一時的に記憶しておける名前の付けられた一時記憶領域。

要は、変数とは、数値や文字列などを一時的に格納する入れ物です。

入れ物には、いろいろな種類があります。
入れるものによって、その形状が変わります。
形状に合わないものは入れられません。
これがデータ型です。

変数は、使う前に宣言します。
VBAに対して、この変数を使いますという事を宣言します。


変数の宣言

変数の宣言は、Dimステートメントを使用します。

Dim 変数名 As 型

複数の変数を宣言する場合は、

Dim 変数名1 As 型
Dim 変数名2 As 型


または、

Dim 変数名1 As 型, Dim 変数名2 As 型


変数名
・文字 (英数字、漢字、ひらがな、カタカナ) とアンダスコア (_) を使うことができます。
・スペースや記号は使えません。
・変数名の先頭の文字は、英字、漢字、ひらがな、カタカナのいずれかでなければなりません。
・同一適用範囲 (スコープ) 内で同じ変数名を複数使うことはできません。
・変数名の長さは、半角で 255 文字以内でなければなりません。
・大文字、小文字の区別がなく、同様に扱われます。


要は普通に書けば問題ありません
・使える記号は、アンダスコア (_) のみ
・先頭文字には、数字、アンダスコア (_) は使えない。

これだけ覚えれば大丈夫なはずです。

変数名の命名は、わかり易ければそれで良いものです。
とはいえ、慣習的な使われ方もありますので、サンプルコードで慣れておくと良いでしょう。
慣習的に使われている変数名を理解すると、他人のVBAコードを読む時の手助けになります。

データ型 名称 格納できる範囲
Integer 整数型 -32,768 〜 32,767
Long 長整数型 -2,147,483,648 〜 2,147,483,647
Single 単精度浮動小数点数型 -3.402823E38 〜 -1.401298E-45(負の値)
1.401298E-45 〜 3.402823E38(正の値)
Double 倍精度浮動小数点数型 -1.79769313486232E308 〜 -4.94065645841247E-324(負の値)
4.94065645841247E-324 〜 1.79769313486232E308(正の値)
Currency 通貨型 -922,337,203,685,477.5808 〜 922,337,203,685,477.00
String 文字列型 最大約20億文字まで
Date 日付型 西暦100 年1月1日〜西暦9999年12月31日までの日付と時刻
Boolean ブール型 真 (True) または偽 (False)
Object オブジェクト型 オブジェクト
Variant バリアント型 すべてのデータ
※実際にも、はるかに多くの型がありますが、上記を覚えておけば十分です。

格納できる範囲については、完全に覚える必要はありません。
(この数値を覚えようとはしないとは思いますが)

ただし、
Integerは3万ちょっとしか入らないことは覚えて下さい。
つまり、シートの行数は入りきらないという事です。

型に格納できる範囲外の値を入れた場合

型の違うデータを入れた場合


型の省略
Dim 変数名

型を書かずに、これだけの記述も許されています。

このように型を省略した場合は、省略時の型として、
Variant
の変数になります。

複数の変数宣言における注意点
Dim a, b, c As Long

これは、a,bには型が指定されていないので、Variantになります。

変数の宣言を強制する
VBE→ツール→オプション→変数の宣言を強制する

ここにチェックを入れた後に挿入したモジュールの先頭には、

Option Explicit

この一文が自動的に追加されます。

この一文があると、
変数は宣言しないと使えなくなります。



逆に言えば、Option Explicitが無ければ、変数を宣言することなく使用することが出来ます。

ただし、
変数の宣言を強制する」これにチェックを入れて、必ず変数宣言をすることが推奨されます。


変数の代入と取得

変数に値(文字列や数値)を入れる事を代入といいます。
代入した後は、
変数名を書けばその値を書いたことと同じになります。
つまりその時点で変数から値を取得している事になります。

Range("A1") = 123
Range("B1") = 123

Dim i As Long
i = 123
Range("A1") = i
Range("B1") = i

この2つの結果は同じです。

上記では数値ですが、
文字列を変数に入れる場合は、文字列を"(ダブルクォーテーション)で囲みます。

Dim tmp As String
tmp = "VBA"


スコープ

変数には適用範囲(スコープと言います)があります、
適用範囲とは、宣言した変数を使う事のできる範囲という事です。

変数を宣言した場所と宣言方法によって、その変数を使える場所が限定されます。


まずVBAの書く場所ですが、

・シートモジュール ・・・ シート毎に存在します
・ブックモジュール ・・・ ブックで1つだけ
・フォームモジュール ・・・ 作ったフォームの数だけ
・標準モジュール ・・・ 好きなだけ作れます
・クラス ・・・ ここでは説明を割愛します

それぞれの中に、複数のプロシージャーが入ります。

以下では、標準モジュールを例に説明します。
ブックやシートのモジュールでも、適用範囲(スコープ)は同じ規則になります。


プロシージャーレベル変数 ・・・ プロシージャー内でのみ使用可能
Sub sample1()
  Dim i
  ・・・
End Sub
Sub sample2()
  Dim i
  ・・・
End Sub

この場合、

変数iは、それぞれのプロシージャーの中でのみ有効です。

これが最も良く使われます。

1つのプロシージャーの中では、変数名は重複できません。


モジュールレベル変数 ・・・ モジュール内でのみ使用可能

Dim i
Sub sample1()
  Dim j
  ・・・
End Sub
Sub sample2()
  Dim j
  ・・・
End Sub

モジュールの先頭(最初のSubまたはFunctionより前)
この部分を宣言セクションと呼びます。

変数宣言を、モジュールの宣言セクションに書くと、
モジュール全体で使用できる変数になります。

宣言セクションで宣言した変数は、そのモジュール内のすべてのプロシージャで使用できます。

このような変数を「モジュールレベル変数」と呼びます。

上記の場合、変数iは、sample1でもsample2でも使用できます。

この、Dim は、Private と書いても同じです。


パブリック変数 ・・・ 全てのモジュールの全てのプロシージャーで使用可能

グローバル変数とも言います。

宣言セクションに書いた変数でも、
DimやPrivateで宣言した変数は、他のモジュールでは使用できません。

他のモジュールで使用できるようにするためには、

Public i Sub sample1()
  Dim j
  ・・・
End Sub
Sub sample2()
  Dim j
  ・・・
End Sub

上記のように、Publicで宣言します。

この変数iは、他のモジュールでも使用できる、パブリック変数です。



簡単にまとめてると

プロシージャー内で宣言した変数は、そのプロシージャー内のみ使用可能

モジュールの宣言セクションでDimまたはPrivateで宣言した変数は、そのモジュール内でのみ使用可能

モジュールの宣言セクションでPublicで宣言した変数は、全てのモジュールで使用可能


定数の意味と使い方

定数とは、数値や文字列の代わりに使用される、意味を持たせた名前のことです。

定数は、値を代入することはできません。

VBAプログラムの中で同じ値を何度も使うことがあります。
また、
覚えておくことが困難な数値や、使い方が分かりにくい値をVBAで使う必要になることもあります。

このような場合には定数を使います。
定数を使用すると、コードが読みやすくなり、保守も容易になります。

定数を大別すると、以下の3つになります。

・組み込み定数
・ユーザー定義の定数
・条件コンパイル定数 ・・・ これは試験範囲には有りませんので割愛します。

・組み込み定数
VBAによって提供される定数。
VBAの定数は、無効にすることはできないので、同じ名前のユーザー定義の定数を作成することはできません。

A1セルの文字色を自動にするには、
Range("A1").Font.ColorIndex = xlAutomatic
xlAutomaticの値は、-4105になります。

また、
A1セルの塗りつぶしを「なし」にするには、
Range("A1").Interior.ColorIndex = xlColorIndexNone
このように書きます。
xlColorIndexNoneの値は、-4142 です。

xlNoneという定数もあります。
この値も、-4142 です。
従って、以下でも同じになります。
Range("A1").Interior.ColorIndex = xlNone
同じ値でも、使用する場面に応じて使いやすい名前で定義してあります。

この定数の数値を覚える必要は全くありません。
この数値を覚えなくて良いように定数が用意されているという事です。


組み込み定数の名前について
VBA共通の組み込み定数は、
vb○○○
このようにvbで始まります。

Office共通の列挙体は、
mso○○○
このようにmsoで始まります。

Excel独自の列挙体は、
xl○○○
このようにxlで始まります。

定数には、単独としての定数と列挙体があります。
列挙体は出題範囲にありませんので、詳細は割愛しますが、
複数の数値定数をひとまとめにしてグループ化したものになります。

VBAは、Office全般で使える共通のプログラミング言語です。
従って、VBA全体としての共通部分と、
ExcelVBA独自の部分があります。
・ユーザー定義の定数
ユーザー独自の定数を定義することが出来ます。

定数名の命名規則は、変数名と同じになります。

Constステートメントを使用します。

Const 定数名 As 型 = 値

Const 開始行 As Long = 2

数値の2を、開始行という定数名で定義しています。
これ以降は、2の代わりに開始行と書くことが出来ます。

プロシージャーレベル定数 ・・・ プロシージャー内でのみ使用可能
Const 定数名 As 型 = 値
または、
Private Const 定数名 As 型 = 値

この2つは同じ定義になります。
プロシージャー内のみ有効な定数となります。

パブリック定数 ・・・ 全てのモジュールの全てのプロシージャーで使用可能
Public Const 定数名 As 型 = 値

Publicを付けることで、全てのモジュールで有効な定数となります。

ただし、標準モジュールでのみ有効な宣言です。

定数のスコープ(適用範囲)
規則は変数と全く同じになります。

プロシージャー内で宣言した定数、そのプロシージャー内のみ使用可能

モジュールの宣言セクションでPrivateで宣言した定数は、そのモジュール内でのみ使用可能

モジュールの宣言セクションでPublicで宣言した定数は、全てのモジュールで使用可能


変数に関係する注意すべきVBAの仕様

VBAには、型を自動的に変換する仕様があります。
自動型変換暗黙の型変換
このように呼ばれます。

Dim i As String
i = 123
これは、全く問題ありません。
i = "123"
これと同じで、文字列として"123"が入ります。
結果として、上の2つに違いはありません。

Dim j As Long
j = "123"
これも、全く問題ありません。
j = 123
これと同じで、数値として123が入ります。
結果として、上の2つに違いはありません。

では、以下の場合はどうでしょう。
Dim i As String
Dim j As Long
i = 123
j = "234"
MsgBox i + j

この結果は、357、と表示されます。
何の問題もなく計算されます。

さらに、以下の場合はどうでしょう。
Dim i As String
Dim j As String
i = 123
j = "234"
MsgBox i + j

MsgBox i - j
この結果は、123234-111、と表示されます。
+は文字列として結合され、-は引き算されます。


代入の場合
代入先の型に自動的に変換して代入されます。

-演算子は、引き算なので2項とも数値に変換されます。

この時、代入先の型に変換できない時に型エラーとなります。
演算の中では
演算子によって自動的に型変換されます。

算術演算子であれば、数値に変換後に計算されます。
文字列結合の演算子(&,+)であれば、文字列として結合されます。

+演算子は、足し算の演算子であると同時に、文字列結合の演算子でもあるので、
2項とも数値なら足し算、片方でも文字列なら文字列結合が行われます。

VBAベーシックでここまで細かい問題は出ないとは思うのですが、
VBAには、
自動型変換暗黙の型変換
このような仕様があるという事だけは覚えておいた方が良いでしょう。


【業務改善の実務】

「変数の宣言を強制する」、これは推奨とかではなく、必ずそうすべきです。
これがないために、バグの原因が分からずに多大な時間を消費するといった事が実際にあります。

でたらめな変数名は、VBAコードの可読性を落とします。
変数名は、極力わかり易い名称にしてください。
変数名を見れば、何に使う変数かがわかるようにするのが理想です。
ただし、あまり長い変数名は、VBAコーディングの効率を落とします。
そこで、慣用的に使われている略称を使う事は非常に有意義です。
わざわざ慣用的な略称を覚えるというより、
良いVBAサンプルを読みながら、それを真似することで少しずつ覚えて行ってください。

スコープは非常に大切なのですが、
本質的な事を言えば、
モジュールレベル変数や、パプリック変数は極力少なくすべきものです。
プロシージャーレベルで良い変数をモジュールレベルで定義したり、
モジュールレベルで良い変数をパブリック定義するようなことは、
VBAの質として悪いものと言えますし、後々の変更時に苦労する原因にもなります。


【本サイト内の関連ページ】





同じテーマ「MOS VBAエキスパート対策」の記事

マクロとVBAの概念
マクロの記録
VBAの構文
変数と定数
セルの操作
ステートメント
ブックの操作
シートの操作
デバッグデの基礎
マクロの実行
VBAベーシック試験対策まとめ

新着記事 ・・・新着記事一覧を見る

エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.定数と型宣言文字(Const)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.とにかく書いて見よう(Sub,End Sub)|VBA入門
9.繰り返し処理(For Next)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。





このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

本文下部へ

↑ PAGE TOP