ExcelVBA 変数

初級VBA

変数

変数はプログラム中で値を保持するための「入れ物」として機能します。

   Dim As Long

のように書きます。

   Dim  これから変数を宣言しますよというステートメントです。
   i    変数名です。
   As   「~として」というような接続詞のような役割です。
   Long  変数型です。Longは整数型になります。
        変数型には、整数型、文字列型など決められた語句があります。

変数の宣言

 ExcelVBAでは変数の宣言をしなくても、いきなり変数として使うことができます。
この場合、バリアント型という特殊な型として定義されます。バリアント型は代入されてから型が決まります。
 ただ、変数は宣言してから使うのが一般的です。先に宣言しておくことで、プログラムの意図する事が捉えやすくなり、間違った代入をするとエラーとなるためバグの発見にも役立ちます。
 プロシージャ内では、冒頭にまとめて書くことが多いのですが、特にそうしなくていけないという事はなく、使用する前であれば問題ありません。

 バリアント型は宣言の必要が無く、便利そうに思えますがバグの温床となることもあるため、初心者のうちから変数の宣言は忘れずに行うようにしましょう。
 
ただし、バリアント型が不要という事ではなく、バリアント型でないといけないケースもあるという事を覚えておきましょう。

一行で2つ以上宣言するときの注意

変数の宣言は次のようにカンマ(,)につづけて2つ以上同時に宣言することができます。

Dim i As Long, j As Long

但し以下の様な書き方をしないように注意してください。

Dim i , j As Long   'i はバリアント型で宣言されたことになる

 VBAでは、変数型を省略した場合、バリアント型になってしまいます。
プログラム中では問題なく動作してしまう事が多いのですが、予期しないエラーの原因となりますので注意してください。
(経験者でも間違って使っている人も結構います。)

変数名

 変数名は禁止されている語句や記号以外なら自由に決めることができます。
 ただし、プロシージャ内など同じスコープ内で同じ名前の変数の定義はできません。
 スコープとは初心者には難しいかもしれませんが、プログラムが認識する範囲の事です。
 まずは、一つのプロシージャ内で同じ変数名は使えないけど、別のプロシージャと同じ名前になっても問題ないと覚えておいてください。

その他具体的な決まりは以下の通りです。

一文字目に数字、(_)アンダーバー、記号を使えません

Dim 222a As Long ' NG
Dim _a As Long  ' NG
Dim %a As Long  ' NG

VBAが使用している予約語は使えません

Dim For As Long' NG

大文字、小文字は区別しません

大文字小文字は区別されず、同じ変数名として扱われます

全角、半角、英数字、日本語も使えます

Dim 行数 As Long  ' OK

変数名の長さは255文字以内です。(全角の場合はこの半分)

あまり長い変数名ではわかりずらくなってしまいます、、、

変数名の途中で(_)アンダーバー記号は使えます

Dim _a As Long      ' NG アンダーバーから始まっている
Dim Num_a As Long   ' OK
Dim Num-a As Long   ' NG アンダーバー以外の記号はダメです

 変数名を決める時に中に入れるデータを想像しやすいものにするとプログラムの見通しが良くなります。色々なサンプルコードを参照して良いと思ったものは真似るようにしてみましょう。

変数の型

 変数型はたくさん種類がありますが、よく使うものは限られています。ここでは主だったものを紹介します。必要に応じて色々な型を覚えれば良いでしょう。

数値型

 数値の変数型の代表的なものを示します。
 以前は小さな整数を扱うときは、Integer型を使用していましたが、最近では、Integer型よりもLong型の方が早いとの噂もあり、筆者はInteger型を使わなくなりました。整数型はLong型、少数に関してDouble型を使う事が多いです。

 速度やメモリの消費量などシビアな設計が求められるのでなければ、代表的なものを使っておけば問題ないと思います。

変数型解 説
Integer整数型 -32,768 ~ 32,767
Long長整数型 -2,147,483,648 ~ 2,147,483,647
Single単精度浮動小数点数型
±3.4×10^38
~±1.4×10^-45
Double倍精度浮動小数点数型
±1,8×10^308
~±4.9×10^-324

文字列 定数

文字列型はStringを使用します。半角・全角の区別はありません。また、数値を文字列型として定義することもできます。
また実際のデータ(リテラル文字)を示す時はダブルクォーテーションで囲みます。

メッセージボックスに文字列を出力させる例です。

Sub macro()
    Dim car As String
    car = "トラック"
    MsgBox car
End Sub

その他よく使うデータ型

 よく使うデータ型として、2つ紹介しておきます。

変数型解 説
Date日付型 西暦100 年1月1日~西暦9999年12月31日までの日付と時刻
Objectオブジェクト型 ブック、シートなど

 日付型(Date)は、空白を定義できません。また、0を代入しても日付や時刻となります。
 オブジェクト型は、Excelの部品のひな形のようなものです。値を代入する時は Set を付ける事になっていますので注意してください。

    Dim ws As Worksheet     'オブジェクト変数(ワークシート型)
    Set ws = Worksheets("Sheet1")

バリアント型

 バリアント型(Variant)は何でも入れてよい特別な型です。
 変数型の宣言を行わない時はバリアント型となります。
 便利に思えますが、以下のような欠点があります。

  • 何が入っているか把握しずらい
  • 間違った使い方をしてエラーを起こしやすくなってしまう
  • 他の変数よりメモリーを消費する

 ただバリアント型でないと都合が悪いケースもあります。例えばSplit関数(1つの文字列を区切り文字で分けて配列を返す)などは、バリアント型で受ける必要があります。
(配列の数がいくつになるかわからないからです)
 この例は初心者の方には難しいかもしれませんが、出来るだけ目的に合った型を選択して使うのがプログラミングのコツと言えます。

変数宣言を強制的にするオプション

 VBAではモジュール(プログラムコードを書く場所)の先頭に、
   Option Explicit
と書くことで変数の宣言がないとエラーになるように設定できます。
これは直接記述しても構いませんが、オプションで設定する事もできます。
やり方は、VBEの「ツール」「オプション」から「編集」タブの「変数の宣言を強制する」にチェックをいれます。

配列

 配列は複数の同じデータ型を1つにまとめたものです。配列の使い方は初心者の方にはハードルが高いのでここでは基本的な事と注意点などを挙げておきます。
 配列を宣言するときは、通常の宣言した変数名の後にカッコを付け、カッコ内には要素数を入れます。以下に例を挙げます。

 まず最初の例ではカッコ内に一つ数値を入れていますが、これば3が最大要素の最大となる配列を宣言しています。配列には要素を指すインデックス番号があるのですが、通常は0番目が最初の要素となります。
なので、a(3)と宣言すると要素は4つ持つことができます。(わかりずらいですね、、)

    Dim a(3) As Long
    a(0) = 1
    a(1) = 2
    a(2) = 3
    a(3) = 4

また、要素番号(インデックス)は何番目から何番目と指定して宣言する方法もあります。

    Dim a(1 To 4) As Long
    a(1) = 1
    a(2) = 2
    a(3) = 3
    a(4) = 4

ただ、この書き方はあまり見かけません。

さらに配列は、二次配列や動的配列など、色々あります。

コレクション

 コレクションは、いくつかの関連するデータを1つにまとめて管理する配列のようなものです。
 コレクションの宣言はNewを付けて、
Dim myItems as New Collection
などとします。
 値を追加するときは Item と Key をセットすることが出来ます。 Itemは値で、Key は配列のインデックスの代わりに使えるラベルのようなものです。


まとめ

 色々な変数を紹介しましたが、配列やコレクションは少々扱いが厄介なので初心者のうちは扱わず、慣れてきてから取り組むようにしましょう。
 この章では以下の変数型を覚えておきましょう。

・Long型 整数型
・String型 文字列型
・Double型 少数型
・バリアント型 何でもOK

ミスしやすい点

以下は、エラーに気づきずらいので注意しましょう。
・2つ以上の変数を宣言する時は、全て変数型を指定する
・変数名は、大文字小文字を区別せず、記号はアンダーバーのみ使える
・オブジェクト型の変数に値を代入する時は Set が必要

(☞゚ヮ゚)☞ 次は、演算子について学びましょう!

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