ExcelVBA入門第3回 変数の宣言
○○に××を入れる、だけの簡単なプログラムだけでは、便利なものは作れません。今回は、プログラムを書く上で非常に重要な、変数について書いてみます。
変数って?
wikipediaにはこう書いてあります。
プログラミングにおいて、変数(へんすう、variable)とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。
これを私は、「決まっていないモノをとりあえず入れておく箱」だと捉えています。
今まではA1セルに100を入れよう、など「決まっているモノ」しか扱ってきませんでしたが、「計算して値が変化するモノ」や「プログラムを使う人に入力してもらうモノ」など、いろんなモノが必要になってきますよね。そんな曖昧なモノを入れておく箱を用意しよう!それが変数宣言です。
例として
A1セルに○月という文字を入れるプログラムを考えてみましょう。○は、ユーザー(使う人)に入力してもらう形とします。
値を入力してもらう前に、入れておく箱を用意しなければなりません。ここでは、「userMonth」という名前の変数にしてみようと思うので、
Dim userMonth as Integer
と記述します。Dimは「宣言」、integerは「整数型」という意味で、「userMonth」という整数型の変数を宣言します(「userMonth」という箱を用意します!)という意味になります。(「userMonth」は文字列はでなく変数なので、「”」で括る必要はありません)
これから覚える方は、整数型は「Long」で!
むかしは容量を抑えるために「Integer」という整数型が多用されましたが、現在はIntegerで宣言してもLong(長整数型)へ変換されるようなので、VBAの整数型は最初からLongにしておいたほうがよいそうです。この記事ではIntegerの記述をしてありますが、整数はLongをお使いくださいませ!
次に、ユーザーに入力してもらう準備です。方法はいろいろありますが、ここでは、一番簡単なInputBoxを使います。InputBoxは
変数 = InputBox("文字列")
のように書き、実行すると以下のようなウインドウが表示されます。
プログラムの全容
これを使って、今回の目的のプログラムを書いてみると、以下のようになります。
Sub Test() Dim userMonth As Integer userMonth = InputBox("何を入れますか?") Range("A1") = userMonth & "月" End Sub
第1回の記事を参考に、コピペして試してみて下さい!どうでしょう、うまくいきましたか?
イメージとしては、こんな感じで動いています。
でもこのままだとエラーが…
上記のプログラム、数値以外のものを入力、又はキャンセルすると「型が一致しません」というエラーが出るのはお気づきでしょうか?これは、変数「userMonth」は「Integer(整数)」だよ!と最初に宣言しているからなんです。
変数にはいろんな型があり、それぞれ宣言した型に当てはまるモノを入れないと「カタチが違うから箱に入らないよ!」と言われてしまいます。ではなぜ「キャンセル」ではエラーが?と思いますよね。InputBoxは、キャンセルを「””(文字数0の文字列)」と捉えるという性質があります。ですので、キャンセルを押すと「この箱はInteger(整数)専用だから、String(文字列)は入らないよ!」と言われてしまうのです。
そのため、こういったエラーが起こらないように、エラー処理を含めてプログラミングをする、ということも大事になってきます。
上記のコードをエラー処理を含めて書いてみると、という例を以下の記事の最後に書いてありますので、読み進めてみてください(・ω・)ノ
よく使う変数のデータ型
- Boolean … True/False のどちらかしか入らないが容量が軽いので条件分岐などに。
Integer … -32,768~32,767の範囲内の整数。- Long … -2,147,483,648~2,147,483,647の整数。
- String … 文字列を扱う。「”」で括るのを忘れずに!
- Date … 日付の他、時間も扱えます。
データ型とは変数に格納できるデータの種類で、こんな感じです。「Dim 変数 as データ型」 のように記述します。他にもたくさんありますので、調べてみてくださいね。
「なんでもOK」なデータ型
ちょっと融通が効かない印象ですが、どんな型にも対応できるバリアント型という便利なデータ型も存在します。宣言そのものを省略して(忘れて)しまった場合でも自動的にバリアント型になるという親切設計です。でもこれ、どんなものでも入れてしまえる懐の広さを持っている分、容量を食うのです。
この型が必要なときももちろんあると思いますが、なんでもバリアント型にしてしまうとそれだけファイル容量も大きくなり、プログラムの速度も遅くなります。また、変数が多くなった時にエラーが見つけにくくなるというデメリットもあります。
宣言の仕方で使える範囲が違う
今まで、例としてDim ○ As Integer
のように、Dim
で宣言していましたが、他にもPrivate
やPublic
というものがあります。
- Dim ・・・ そのプロシージャ内のみ使える
- Private ・・・ そのモジュール内のみ使える
- Public ・・・ 全てのモジュールで使える
このように宣言の形で使える範囲が変わるので、違うプロシージャやモジュールを跨いで使ったり、ユーザーフォームなどを使うときには、その使い方に合った宣言方法をとるようにします。
こちらにもうちょっと詳しく書いています
こまめな変数宣言を心がける
変数は、使うモノに合ったカタチで宣言することによって、プログラムの速度も早くなるし、後々見たときに分かりやすくなります。自分が作ったプログラムを誰かが見るときもあるはずです。そんな時のために、是非きちんと変数宣言を行いましょう。
ほかの入門記事はこちら
- ExcelVBA入門第0回 始める前に
- ExcelVBA入門第1回 動かしてみる
- ExcelVBA入門第2回 とりあえず覚えておくべきこと
- ExcelVBA入門第3回 変数の宣言
- ExcelVBA入門第4回 RangeとCells
- ExcelVBA入門第5回 ステップ実行
- ExcelVBA入門第6回 If ~ End Ifステートメント
- ExcelVBA入門第7回 インデントとコメントアウト
- ExcelVBA入門第8回 繰り返し処理
- ExcelVBA入門第9回 5種類のモジュールの違い
- ExcelVBA入門第10回 3種類のプロシージャと命名規則
- ExcelVBA入門第11回 スコープ(適用範囲)
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。