Excelマクロ入門:変数の型とスコープを理解しよう!

ようこそ♪ささぽんのExcel教室へ。
前回の記事では、Excelマクロで変数を使う「基本の形」を学びました。
今回はそこから一歩進んで、「変数に入れる値の種類」と「変数が使える範囲」について説明します!
この記事を読んで、変数の使い方をマスターしていきましょう♪

この記事は以下のような方におすすめです!
・変数の基本的な使い方を押さえられた方
・変数の正しい使い方をマスターしたい方
・変数の「型」や「使える範囲」がよく分からない方
このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。
読み終わるころにはきっと、
「Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。
一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!
![]() | よくわかる Microsoft® Excel® マクロ/VBA Office 2021/2019/2016/Microsoft 365対応 [ 富士通ラーニングメディア ] 価格:2860円 |
![]() | Excel自動化[最強]時短仕事術 マクロ/VBAの基本&業務効率化の即効サンプル【電子書籍】[ 守屋 恵一【著】 ] 価格:1518円 |
目次
1. 変数のデータ型とは?
変数の基本を使えるようになった方へ、次に知っておきたいのが「データ型」の考え方です。
これはマクロを書いていくうえで、見やすさや安定性をぐっと高める重要なポイントです!
■変数の箱には「入れられるもの」が決まっている
Excelマクロの変数は、実は「なんでも入れられる箱」ではありません。
変数は、「この箱には数字を入れるよ」「この箱には文字を入れるよ」と、あらかじめ中に入れるものの種類を決めておくことができます。
この入れる値の種類のことを「データ型」と呼びます。
身近な例で考えてみましょう。
スーパーで卵を買ったとき、卵パックがついてきますよね。
卵パックは、卵の形にぴったり合うように作られていて、ミカンやペン等の他のものを入れようとしてもうまく収まりませんし、入っても安定しません。
変数のデータ型も、同じイメージです。
「この変数には数字を入れる」「この変数は日付専用」など、入れる値に合った形のケースを用意して使ってあげることで、正しくスムーズに動作するようになります。
例えば、次のような場面を考えてみてください:
- 商品の単価 → 数字(例:1200円)
- 顧客の名前 → 文字列(例:“田中さん”)
- 注文が確定しているかどうか → True / False(はい・いいえ)
- 納品日 → 日付(例:2025/6/1)
これらは一見どれも「値」ですが、性質はまったく違いますよね。
数値を文字列のように扱ってしまうと計算ができませんし、日付を文字として入れてしまうと、並べ替えがうまくいかなくなります。
こうしたトラブルを防ぐために、変数には「どんな値を入れるか」を最初に決めておくことがとても大切です。
たとえば「この箱は日付専用!」と決めておけば、誤って文字列を入れてしまうこともありません。
型の入れ違いを防ぐことで、マクロのエラーも減り、動作もぐっと安定します。
まるで卵パックに卵を入れるように、ぴったり合った「型」を使うことが、安全でスマートなマクロへの第一歩です。
それが、「データ型を指定する」ということ。
ミスを減らし、処理を安定させ、コードもすっきり整理できるようになります!

■具体例で見る「データ型の書き方」
変数に値を入れるときは、「どんな種類の値を入れるか」に合わせて、データ型を指定するのが基本です。
例えば、商品の価格を入れるならこのように書きます:
Dim price As Integer
price = 1200
MsgBox "価格は" & price & "円です"
このコードでは、「price」という変数に 整数(Integer) を入れると宣言しています。
こうすることで、計算や表示の処理が正しく行われ、変数の役割もはっきりします。
同じように、日付を扱うときはこう書きます:
Dim shipDate As Date
shipDate = 2025/6/1
Cells(1, 1).Value = shipDate
ここでは Date というデータ型を使うことで、「この変数には日付を入れる」というルールが明確になります。
■型を指定しないと「なんでも入る箱」になる?
実は、変数の型を指定せずに宣言しても、マクロは動きます。
その場合、VBAは自動的に「Variant(バリアント)」という特別な型を使います。
このVariant型、ちょっと不思議な存在で、数字でも文字でも日付でも、何でも入る「自由な箱」です。
なんでも入るならそれでいい!
と思うかもしれませんが、実はちょっとした落とし穴があります。
さきほど、変数のデータ型は「卵パック」のような専用ケースだとお話しましたよね。
Variantは、言ってみれば「なんでも詰め込める袋」のようなもの。
卵もミカンもペンも全部入っちゃうけど、中身がぐちゃぐちゃになったり、何が入ってるか分かりにくくなったりします。
その結果:
- 数字だと思っていたのに文字列として処理されてしまう
- VBAが中身を判別するのに時間がかかって、マクロが遅くなる
- 後からコードを見たとき、「この変数って何用?」と迷いやすい
だからこそ、データの種類に合った「ぴったりの箱=データ型」を選んで使うようにしましょう!
2. よく使うデータ型と選び方のコツ
前の章では「値の種類に合った箱を使うことが大切」というお話をしました。
では実際に、箱(=データ型)にはどんな種類があるのでしょうか?
ここでよく使う代表的な型を見ていきましょう!
■基本の5種類をおさえよう
VBAでよく使うデータ型は、主に次の5つです。
最初はこの5つを覚えておくだけでも、マクロで色々な変数を操れるようになりますよ!
データ型 | 説明 | 使用例 |
Integer | 整数(小数なし) | 100, -3 |
Double | 実数(小数あり) | 3.14, -0.5 |
String | 文字列(テキスト) | こんにちは |
Boolean | 真偽値(はい/いいえ) | True, False |
Date | 日付や時刻 | 2025/6/1 |
この先の実例でも何度も登場しますので、「この型はこんな時に使うんだな」とざっくりイメージしておくだけで大丈夫です!
■型の選び方とよくある失敗例
マクロで変数を使うとき、「どのデータ型にするか」はとても重要です。
型を間違えてもエラーは出ませんが、結果がズレてしまうパターンがよくあるためです。
ここでは、ありがちな失敗例を見ながら、型の選び方を少しずつ身につけていきましょう!
【例1】小数を整数型(Integer)に入れてしまった場合
Sub WrongIntegerType()
Dim discountRate As Integer
discountRate = 0.1 '小数を代入
MsgBox "割引率:" & discountRate * 100 & "%"
End Sub
このコードでは、「0.1」を「割引率(10%)」として扱うつもりでした。
しかしマクロを実行すると、画面には「割引率:0%」と表示されてしまいます。

これは、Integer 型が「整数だけを入れる箱」だからです。
小数を入れようとしても、小数点以下が切り捨てられて「0」だけが残ってしまいます!
【正しい書き方:Double型を使う】
Sub CorrectDoubleType()
Dim discountRate As Double
discountRate = 0.1
MsgBox "割引率:" & discountRate * 100 & "%"
End Sub
Double 型なら、小数も正しく扱えるので、「割引率:10%」と表示されます!

数値に小数が含まれる可能性があるときは、Double を選ぶのが基本です。
【例2】日付を文字列(String)で扱ってしまった場合
Sub DateAsString()
Dim date1 As String
Dim date2 As String
date1 = "2025/06/01"
date2 = "2025/5/1"
If date1 < date2 Then
MsgBox date1 & "は" & date2 & "より前です"
Else
MsgBox date1 & "は" & date2 & "より後です"
End If
End Sub
このコードでは、date1 が 2025年6月1日、date2 が 2025年5月1日を入れたつもりです。
しかしマクロを実行すると、「2025/06/01は2025/5/1より前です」と表示されてしまいます。

これは、変数の型がString になっており、見た目は日付の形式でも文字の並び順だけで大小が判断されてしまったためです。
「2025/06/01」と「2025/5/1」では、文字の順番としては「2025/06/01」の方が先なので、このような処理結果になったということですね。
【正しい書き方:Date型を使って比較】
Dim date1 As Date
Dim date2 As Date
date1 = "2025/06/01"
date2 = "2025/5/1"
If date1 < date2 Then
MsgBox date1 & "は" & date2 & "より前です"
Else
MsgBox date1 & "は" & date2 & "より後です"
End If
こちらは、Date 型として変数を宣言し、日付を代入しています。
このようにすれば、文字ではなく「日付」として正しく比較されるため、マクロを実行すると意図通りの結果が得られます!

ちなみにVBAでは、「2025/05/01」でも「2025/5/1」でも、どちらも自動的に「2025年5月1日」として認識され、Date 型に正しく格納されるようになっています。便利ですね!
このように、文字列で日付を扱うと、見た目では正しそうに見えても、実際には思わぬ順番になることがあります。
日付を比較したり処理したりする場合は、必ず Date 型を使うのが安心です。
■型選びのまとめ:まずは「合う型」を使おう!
ここまでの例で見てきたように、変数にどの型を使うかは、マクロの動作に大きく関わってきます。
とはいえ、最初からすべての型を覚える必要はありません。
まずは基本の5つの型だけでも押さえておけば、実務で困ることはほとんどありません!
最後に、それぞれの型の主な使い道を整理しておきましょう。
データ型 | 主な使い道 |
Integer | 個数・在庫数など整数 |
Double | 価格・割合などの小数 |
String | 名前・コードなどの文字列 |
Boolean | 処理済/未処理などのYes/No判定 |
Date | 納品日や作成時間などの日時 |
どの型を使えばいいか迷ったときは、その値の「性質」を意識してみることが大切です。
「何を入れる変数か?」がわかれば、型選びも自然と身についていきますよ!
3. 変数のスコープ(有効範囲)とは?
ここでは、変数を「どこからどこまで使えるのか?」を決める「スコープ(有効範囲)」について解説していきます!
■変数のスコープとは?
これまでの章では、「変数に何を入れるか(=データ型)」について学んできました。
ここからは、変数が「どこで使えるのか?」というスコープ(有効範囲)の考え方に進んでいきます。
例えば、次のような経験はありませんか?:
- 変数を正しく宣言したはずなのに「変数が定義されていません」とエラーになった
- 変数に入れておいたはず値が、いつの間にか空になっていた
こうした現象の多くは、スコープの違いが原因です。
変数のスコープとは、「その変数が有効な範囲」のこと。
イメージしやすいのは、道路の速度制限のルールです。
例えば、高速道路で速度制限=100kmとされていたとします。
そのルールはあくまで高速道路上の話なので、一般道路に降りてからも100kmで走っていたら違反になりますよね。
「さっきは100kmでした!」と言っても、それは「別の範囲のルール」なので通用しません。
変数もこれと同じで、「この中では使えるけど、外では使えない」といった有効な範囲=スコープがあります。
次は、そんなスコープの種類を具体的に見ていきましょう!
■3つのスコープの種類を知ろう
VBAで変数を使うとき、その「スコープ(有効範囲)」には主に3種類があります。
ここでは、それぞれのスコープの違いをしっかり押さえておきましょう。
スコープの種類 | 有効な範囲 | 特徴 |
プロシージャレベル | 宣言したプロシージャの中だけ | 一番限定的で基本のスコープ |
モジュールレベル | 同じモジュール内の全てのプロシージャ | 他のモジュールからは見えない |
パブリックレベル | 全てのモジュール | 全体で共有される変数になる |
スコープとは、先ほど高速道路の例で紹介したように、その変数がどこで使えるか(有効か)を決めるルールです。
- プロシージャレベル:そのSubやFunctionの中だけで使える
- モジュールレベル:1つのモジュールの中で、どのプロシージャからでも使える
- パブリックレベル:他のモジュールからもアクセスできる、ファイル全体で共通の変数
まずは変数の有効範囲としてこの3種類があること、それぞれの違いについてしっかり理解しておきましょう!

次の章では、それぞれのスコープをどのように宣言し、どう使うか?を具体的なコードと合わせて紹介していきます!
4. スコープの指定方法と実例
3章では、変数のスコープ(=どこまで使えるか)には「プロシージャレベル」「モジュールレベル」「パブリックレベル」の3種類があると紹介しました。
ここからは、それぞれのスコープを実際にどのように宣言し、どう使うのか?を具体的に見ていきましょう!
■スコープの使い方と注意点
スコープをどうしたいかによって、変数を「どこで」「どのように」宣言するかが変わってきます。
ここでは、それぞれのスコープに対応する宣言方法と、使い方のポイントを紹介します!
①プロシージャレベル:処理の中だけで使いたいとき
プロシージャレベルの変数を使う場合には、プロシージャ内で「Dim」を使って宣言します。
Sub Sample()
Dim count As Integer
count = 10
MsgBox count
End Sub
例ではSub〜End Sub(=プロシージャ)の中で「Dim count」と宣言していますね。
この変数 count は Sample の中だけで使えるもので、他のプロシージャでは認識されません。
そのため、同じ名前の変数を別のプロシージャで宣言しても、別の変数として扱われます。
一時的な計算やフラグなど、その処理の中だけで完結する値の保持にぴったりです。
②モジュールレベル:同じモジュール内で共有したいとき
モジュールレベルの変数を使いたいときは、モジュールのいちばん上で Dim または Private を使って宣言します。
Option Explicit
Private total As Integer
Sub testA()
total = 100
End Sub
Sub testB()
MsgBox total
End Sub
Option Explicit
Dim message As String
Sub testC()
message="こんにちは"
End Sub
Sub testD()
MsgBox message
End Sub
ここで宣言された total や message は、同じモジュール内のすべてのプロシージャから共通で使える変数です。
そのため、testA や testC で代入した値を、testB や testD でそのまま取り出すことができます。
ただし、別のモジュールからアクセスしようとするとスコープ外となり、エラーが出たり空の値になったりします。
③パブリックレベル:すべてのモジュールで共有したいとき
パブリックレベルの変数は、モジュールのいちばん上に Public を使って宣言します。
'Module1
Public userName As String
Sub SetName()
userName = "ささぽん"
End Sub
'Module2
Sub ShowName()
MsgBox userName
End Sub
このように userName は、すべてのモジュール・プロシージャからアクセスできる変数になります。
Module1で設定した値を、Module2からそのまま参照できるため、値を保持したまま使い回せる便利さがあります。
ただし、どこからでも値が書き換えられてしまうリスクもあるため、重要な情報を保持する場合には使い方に注意が必要です!
このように、スコープごとに宣言の場所や使える範囲が大きく変わります。
それぞれの特性を活かして、安全でわかりやすいマクロを目指しましょう!
■︎変数のスコープを使いこなすための5つのポイント
スコープの種類は理解したので、次は使いこなすためのポイントを押さえましょう。
ここでは、私自身の体験も交えながら、スコープ運用で意識しておきたい5つのポイントを紹介します!
① 同じ名前の変数を複数の場所で使わない
例えば、モジュール先頭に 「Private total」 を宣言しているのに、プロシージャ内でも 「Dim total」 を使ってしまうと、どちらが使われているか分かりにくくなり、バグの原因になることがあります。
→ スコープごとに、変数名がかぶらないように気をつけるのが基本です。
②モジュール変数は Privateにして明確に
ちなみに私は、モジュールレベルの変数はすべて Private で宣言するようにしています。
Dim と動作は同じですが、パッと見でプロシージャレベル変数かモジュールレベル変数かを見分けられるため便利です。
→ こうしたコード上の「意図の見える化」が、後からコードを見直す際の時間短縮になることもあります!
③グローバル変数(Public)の使いすぎに注意
Public で宣言された変数は、どこからでもアクセス・変更できるため、非常に便利です。
ただし、どこでどう上書きされるかが見えづらくなるリスクもあるため、使いどころは慎重に選ぶ必要があります。
→ モジュールを超えて共有すべき明確な理由があるときだけに限定しましょう!
④Public変数には「パブリックとわかる名前」をつける
やむを得ず Public を使う場合は、変数名でスコープが分かるようにしておくと管理が楽になります。
例えば:
Public pubTotal As Integer
Public gblUserName As String
→ pub や gbl などのプレフィックスをつけておくと、他の変数と見分けがついて分かりやすいです。
⑤ Option Explicit を有効にしてミスを防ぐ
「変数を宣言せずに使ってしまう」というミスを防ぐには、Option Explicit を常に有効にしておきましょう。
→ VBEの設定で一度オンにしておけば、すべての新しいモジュールに自動で適用されるのでおすすめです!
※詳しい設定方法は以下の記事をご覧ください♪
5. まとめ
今回は、Excelマクロの中でも「変数の使い方」をもう一歩深く理解するために、データ型とスコープについて取り上げて解説しました。
■データ型の基本をおさらい!
変数には「何を入れるか?」を決める「型」があります。
適切な型を使えば、マクロの安定性が上がり、コードの見通しもよくなります!
次の5つは特によく使う基本型です:
データ型 | 扱う値の特徴 | 主な使い道 |
Integer | 整数(小数なし) | 個数・在庫数など整数 |
Double | 実数(小数あり) | 価格・割合などの小数 |
String | 文字列(テキスト) | 名前・コードなどの文字列 |
Boolean | 真偽値(はい/いいえ) | 処理済/未処理などのYes/No判定 |
Date | 日付や時刻 | 納品日や作成時間などの日時 |
→ 値の性質に合った箱を使うことで、処理がスムーズに動き、バグの予防にもつながります!
■スコープの基本をおさらい!
スコープとは、「変数がどこまで使えるか?」を決めるルールのこと。
次の3種類を押さえましょう:
スコープ | 有効範囲 | 宣言例 |
プロシージャレベル | 処理の中だけ | プロシージャの中でDim |
モジュールレベル | 同じモジュール内 | モジュール先頭でDimまたは Private |
パブリックレベル | ファイル全体 | モジュール先頭で Public |
→ スコープまで意識して変数を使えるようになれば、もう「マクロ初心者」は卒業と言っても過言ではありません。
あとは実際に書きながら、少しずつ慣れていくだけです。
自信を持って次のステップに進んでいきましょう!
変数については、さらに踏み込んだ内容を別の記事でも紹介する予定です。
興味のある方はぜひ合わせて読んでみてください♪
\ Excelマクロ制作も承っています /
各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!
