エクセルVBAの変数とは?マクロで変数を宣言する方法と使う方法

vba

【結論】エクセルVBAで変数の宣言方法

Dim 〇〇〇 As ■■■

〇〇〇は変数名を書き、■■■はデータの型を指定します。

こちらの記事では、エクセルVBAの変数とデータ型について紹介しています。

変数はVBAに限らず、他のプログラミング言語で必ず出てくるものです。
変数がどういったものかどのようにつかうのか。についてはどの言語でも共通していると言えます。

しかし、それぞれの言語で変数を使う時の文法が異なってきます。
ここではエクセルVBAにおける変数の基本的な書き方を中心に紹介します。

こちらの記事はこんな人におすすめです。

エクセル(Excel)VBA初心者

●エクセル(Excel)VBAでセルに文字を入力することができる人

●エクセル(Excel)VBAを事務作業などを自動化したいと考えている人

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

エクセル(Excel)VBAの変数とは何か

エクセル(Excel)VBAの変数について

はじめに変数とは何?といった疑問がありますが、Wikipediaによれば以下のとおりです。

プログラミングにおける変数(へんすう、英: variable)とは、高水準言語のプログラムのソースコードにおいて、扱うデータを読み書きする記憶域 (storage) のことであり、固有の名前(識別子)によって識別される[1]。変数を用いることで、データを一定期間記憶し必要なときに利用することができる。高水準言語において、変数は記憶装置(メモリ)を抽象化する役割を果たす。

一人一人の人間が異なる名前によって区別されるように、変数も個々の名前によって区別される。これにより、プログラム上で複数のデータを容易に識別・管理することができる。変数の識別子 (identifier) のことを変数名 (variable name) という。一般に、変数が表すデータをその変数の値(あたい、英: value)という。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

私にはこれで理解が難しかったので、書籍や他のネット記事を参考にした内容から多かった説明が

変数は値を入れておく箱

として例えられることが多く、中の値の読み書きや更新、破棄などの処理を自由にできる。

文章だけだと伝わりにくいので、以下イラストで紹介します。

ただし、VBAではこの箱を事前に何を代入する用の変数であるか明示的に予約しておく必要があります。
整数型や文字列型などのデータ型は後で触れますが、ここでは整数を入れる用の変数(箱)に文字列の”カレー”を代入しようとするとエラーになるという理解で大丈夫です。

Sub test()

    Dim A As Integer
    Dim B As String, C As String
    
    A = 1
    B = "カレー"
    C = "2022年"
    
    Debug.Print (A)
    Debug.Print (B)
    Debug.Print (C)

End Sub

実行結果

 1 
カレー
2022年

それぞれの変数に代入された値が表示される

整数型の変数に文字列を代入した例

Sub test()

    Dim A As Integer
    
    A = "カレー"

    Debug.Print (A)

End Sub

Dim A As Integer

上記では、変数の宣言で「 A 」という名前で、整数型にしています。
※Dim は Dimension(寸法)の略です。

A = “カレー”

文字列である”カレー”を変数「 A 」に代入するコードを書いています。
これを実行しようとすると。

実行時エラー'13':
型が一致しません。

このようなエラーが発生します。

VBAで変数を使用するときは、事前に変数名とその変数がどの型であるかを指定する必要があり、指定のものと異なるなる値を代入しようとするとエラーが発生する点に注意が必要です。

引越の荷造りなどで、ダンボール箱に「服」「アクセサリー」「本」「おもちゃ」などのラベルづけをイメージすると理解しやすいと思います。

エクセル(Excel)VBAにおける変数の型と種類

続いて変数のデータ型と種類について説明をしていきます。
VBAでは変数の宣言で指定した型と代入する値の型が一致していないとエラーが発生します。

ここでは、この型の種類とそれぞれがどういったものかを紹介していきます。

データ型の種類について

●Intger:整数型

●Long:長整数型

●Single:単精度浮動小数点数型

●Double:倍精度浮動小数点数型

●String:文字列型

●Date:日付型

●Boolean:ブーリアン型(真偽値)

●Object:オブジェクト型

●Variant:バリアント型

変数をたくさんつかうマクロが作りたい場合は、配列をつかう方法がおすすめです。配列は変数のかたまり(ブロック)のようなものなので、たくさんのデータや値をあつかうマクロをつくる上では覚えておきたいテクニックです。
配列の基本的なつかいかたなどをは、こちらの記事を参考にしてください。

それぞれの変数のデータ型に代入できるものは以下のとおり

型の種類代入可能な値
Intger-32,768~32,767の整数
Long-2,147,483,648~2,147,483,647の整数
Single負の値:約-3.4×10(38乗)~-1.4×10(-45乗)正の値:約1.4×10(-45乗)~1.8×10(38乗)
Double負の値:約-1.8×10(308乗)~-4.0×10(-324乗)正の値:約4.9×10(-324乗)~1.8×10(308乗)
String“カレー”、”東京”などの文字列
Date西暦100年1月1日~西暦9999年12月31日時刻:0:00:00 ~ 23:59:59
BooleanTrue または Falseの真偽値
Objectワークブック・ワークシート・セル範囲などのオブジェクトを代入可能
Variant万能型

バリアント(Variant)型は万能なので、どういったものでも代入できますが、その分メモリをたくさん使います。
なるべく準備した箱(変数)にどのような値を代入するものかを想定し、適切なデータ型を宣言することで無駄なメモリ消費を抑えたプログラムになります。

エクセル(Excel)VBAで変数をつかったマクロのつくりかた

エクセル(Excel)VBAでは変数を扱う場合に事前に宣言をする必要があります。
コードを書きこむ場所は、Sub〇〇()の直ぐ下の冒頭部分に宣言しておくことが一般的です。

エクセル(Excel)VBAで変数を宣言する

以下は、それぞれのデータ型で変数を宣言するコードとなります。

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
  '※〇〇は変数名
    
  Dim i As Integer
    Dim j As Long   
    Dim k As Single 
    Dim l As Double 
    Dim m As String 
    Dim n As Date       
    Dim o As Boolean
    Dim p As Object 
    Dim q As Variant

End Sub

続いて宣言した変数に値を代入する

整数(Integer)型への代入

整数(int)型の変数iに【 1 】を代入する

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
  '※〇〇は変数名
    Dim i As Integer

  '変数に値を代入する
    i = 1
    Debug.Print (i)

End Sub

実行結果

1
Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。

小数(Single)型への代入

小数点(single)型の変数kに【 0.5 】を代入する

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
  '※〇〇は変数名
    Dim k As Single

  '変数に値を代入する
    k = 0.5
    Debug.Print (k)

End Sub

実行結果

0.5
Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。

文字列(String)型への代入

文字列(string)型の変数mに【 カレー 】を代入する

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
  '※〇〇は変数名
    Dim m As String
    
  '変数に値を代入する
     m = "カレー"
    Debug.Print (m)

End Sub
文字列を代入するときは””(ダブルクォーテーション)で文字列を囲む

実行結果

カレー
Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。

日付(Date)型への代入

日付(Date)型の変数nに【 2022年10月20日 】を代入する

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
  '※〇〇は変数名
   Dim n As Date
    
     '変数に値を代入する
    n = "2022年10月20日"
    Debug.Print (n)

End Sub
日付を代入するときは””(ダブルクォーテーション)で文字列を囲む

実行結果

2022/10/20
Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。スラッシュで表記され日付と認識されています。

ブーリアン型(Boolean)型への代入

ブール・ブーリアン(Boolean)型の変数oに【 True 】を代入する
Boolean型変数の初期値はFalseとなります。

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
  '※〇〇は変数名
  Dim o as Boolean

  '変数に値を代入する
  o = True
  Debug.Print (o)

End Sub
ブール・ブーリアンの真偽値(True or False)は文字列ではないので、””はダブルクォーテーションは不要。

実行結果

True
Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。

オブジェクト型(Object)型への代入

オブジェクト(Object)型の変数qに【 ワークシート(”Sheet1”)のセル範囲(A1セルからA5セル) 】を代入する

セル範囲をデバッグプリントで表示することはできないため、変数に代入された確認方法としてA1セル、A5セルに入力されている値をデバッグプリントで表示することで確認しています。

緑色に着色した部分がオブジェクトとして変数に代入。
A1セルとA5セルの値をデバッグプリントで表示することで、指定のセル領域が変数に代入された確認とします。

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
  '※〇〇は変数名
    Dim q As Object
    
     '変数に値を代入する
    Set q = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
    
    Debug.Print (q.Range("A1").Value)
    Debug.Print (q.Range("A5").Value)

End Sub
オブジェクトを代入するときは、変数の前にSetをつける

実行結果

 1 
メッセージボックスでピカピカピカチュウ

A1セルに入力されている値「 1 」とA5セルに入力されている値「メッセージボックスでピカピカピカチュウ」が表示されていることから、指定領域が変数に代入されたことが確認できます。

変数に代入した値の更新(書き換え)

ここでは一度宣言した変数に値を代入した後で、同じ変数に改めて別の値を代入することができるかを検証しみます。

入力コード

Sub vartest()
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    
    Dim i As Integer
    
     '変数に値を代入する
    i = 1
    Debug.Print (i)
    
     '変数の値に数値を足す
    Debug.Print (i + 9999)
    Debug.Print (i)
    
    '変数の値を書き換える(更新する)
    i = 9999
    Debug.Print (i)

変数「 i 」には最初に「 1 」が代入されます。
Debug.Purit(i + 9999)で、合計値の10000が返ってきていますが、この場合は変数の値自体は書きかわっていないことが分かります。


しかし、その後の i = 9999 を実行することで 変数「 i 」の値は書きかえられています。

実行結果

1 
10000 
1 
9999
デバッグプリントで9999を足した値を出力しても、変数iの値を書き換えたことにはならない。

エクセル(Excel)VBAで変数をつかってマクロできること

変数をつかった計算や文字列結合

ここでは変数を使って出来ることを3つ紹介します。

1.変数と数値をつかった計算

2.変数と変数をつかった計算

3.変数で文字列結合

変数と数値をつかった計算

ここでは四則演算(足し算、引き算、掛け算、割り算)と余りを求めてみます。

入力コード

Sub vartest()
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    
    Dim i As Integer
    
     '変数に値を代入する
    i = 100
    Debug.Print (i)

     '変数の値に数値を足す
    Debug.Print (i + 10)
     
     '変数の値から数値を引く
    Debug.Print (i - 20)
    
     '変数の値に数値を掛ける
    Debug.Print (i * 3)
    
     '変数の値を数値で割る
    Debug.Print (i / 25)
     
     '変数の値を数値で割った後の余りを求める
    Debug.Print (i Mod 25)

End Sub

実行結果

 100 
 110 
 80 
 300 
 4 
 0 

上から順に、変数の値、足し算、引き算、掛け算、割り算と余りが出力されました。

変数と変数をつかった計算

変数と数値をつかった計算と同じく、変数どうしでも実行可能です。

入力コード

Sub vartest()
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    
    Dim i As Integer
    
     '変数に値を代入する
    i = 100
    Debug.Print (i)

    '変数どうしでも計算可能
    Dim j As Integer, k As Integer, l As Integer, m As Integer
    
    'それぞれの変数の値を代入
    j = 10
    k = 20
    l = 3
    m = 25
     
     '変数と変数を足す
    Debug.Print (i + j)
     
     '変数から変数を引く
    Debug.Print (i - k)
    
     '変数に変数を掛ける
    Debug.Print (i * l)
    
     '変数の値を変数で割る
    Debug.Print (i / m)
     
     '変数の値を変数で割った後の余りを求める
    Debug.Print (i Mod m)

End Sub
複数の変数をまとめて宣言するときの注意

変数をまとめて宣言する書き方①

Dim j As Integer, k As Integer, l As Integer, m As Integer

変数をまとめて宣言する書き方

Dim j , k , l , m As Integer

①と②ともにエラーは発生しません。
ただし、j、k、lについてはバリアント(万能)型で宣言したことになる点が①と異なります。
(※最後の変数mのみ整数(int)型となります。)

実行結果

 100 
 110 
 80 
 300 
 4 
 0 
変数どうしでも同じ実行結果が求められました。

変数をつかった文字列結合

続いて変数を使って文字列を結合をします。変数に文字列を代入して結合することができます。
以下、入力コード①はシンプルに変数に代入した文字列をつなげてメッセージをする処理。
入力コード②はユーザー名や生年月日が入力されると誕生した曜日がメッセージで返ってくる処理です。

入力コード①

Sub vartest()


'変数iとj、k、l、mを別の行で宣言しているのは分かりやすくするためです。
Dim i As String
Dim j As String, k As String, l As String, m As String

i = "私"
j = "ピカチュウ"
k = "フシギダネ"
l = "ヒトカゲ"
m = "ゼニガメ"

Debug.Print (i & "は" & j & "も" & k & "も" & l & "も" & m & "も全部大好きです。")

実行結果

私はピカチュウもフシギダネもヒトカゲもゼニガメも全部大好きです。

ユーザーにより入力された名前や生年月日より、メッセージを返すプログラム

入力コード②

Option Explicit

Sub test()

    Dim name As String
    Dim input_Birthday As String
    Dim Birthday As Date
    
    name = Application.InputBox("あなたの名前を教えてください。", "名前を入力", "緋村剣心")
    input_Birthday = Application.InputBox("あなたの生年月日を数字8桁で入力してください。", "生年月日を入力", "18490620", Type:=1)
    
    If Len(input_Birthday) = 8 Then
        input_Birthday = Left(input_Birthday, 4) & "/" & Mid(input_Birthday, 5, 2) & "/" & Mid(input_Birthday, 7, 2)
        Birthday = CDate(input_Birthday)
        WeekdayName (Weekday(input_Birthday))
    ElseIf Len(input_Birthday) <> 8 Then
        MsgBox "不正な入力です。" & vbCrLf & "処理を終了します。"
        Exit Sub
    End If
    
    Debug.Print ("あなたの名前は" & name & "です。" _
    & vbCrLf & "生年月日は" & input_Birthday & "なので" _
    & vbCrLf & "誕生日は:" & WeekdayName(Weekday(input_Birthday)) & "です。")

End Sub

実行結果

イミディエイトウィンドウには以下の実行結果が出力されます。

あなたの名前は緋村剣心です。
生年月日は1849/06/20なので
誕生日は:水曜日です。

名前と生年月日を入力すると、誕生日が何曜日であったかメッセージでかえってきます。

オブジェクトを変数に代入して操作する

本記事の冒頭で変数に値やセル範囲を代入するコードを書きましたが、この変数に代入したセル範囲の変更や値の書き込み処理をするコードを紹介します。

変数に代入されているRangeオブジェクトから値を取り出す

前提条件

緑色に着色したエリアがオブジェクト型変数に代入されている範囲となります。

入力コード

Sub vartest()
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    
    Dim q As Object
    Dim sum As Integer

    '変数に値を代入する
    Set q = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
    
    '変数qのセルに入力されている値を取り出す。
    Debug.Print (q.Range("A1").Value)
    Debug.Print (q.Range("A2").Value)
    Debug.Print (q.Range("A3").Value)
    Debug.Print (q.Range("A4").Value)
    Debug.Print (q.Range("A5").Value)
    
    '変数qのセルに入力されている値を全て足して変数sumに代入する
    sum = q.Range("A1") + q.Range("A2") + q.Range("A3") + q.Range("A4")
    Debug.Print (sum)
    
    '変数qのセルA1の値を「 10 」に変更した後、値を全て足して変数sumに代入する
    q.Range("A1").Value = 10
    sum = q.Range("A1") + q.Range("A2") + q.Range("A3") + q.Range("A4")
    Debug.Print (sum)
    
    '変数qのセルに入力されている値をワークシート関数を使って全て加算し変数sumに代入する
   sum = WorksheetFunction.sum(q.Range("A1"), q.Range("A2"), q.Range("A3"), q.Range("A4"))
   Debug.Print (sum)
    

End Sub
ワークシート関数とはエクセルシート上で使用可能な関数をVBAで利用する時の書き方です。

実行結果

 1 
 10 
 110 
 110 
メッセージボックスでピカピカチュウ
 231 
 240 
 240 

実行結果の上から順にA1セルには「 1 」が記入されているので、Debug.Print (q.Range(“A1”).Value)のコードを実行した結果として「 1 」が出力されました。
同様に、A2セルからA5セルの値を出力するコードにて「 10 」、「 110 」、「メッセージボックスでピカピカチュウ」の値が返ってきています。

続いて、整数型の変数sumにA1セルからA4セルをたし算をした値を代入し、結果を出力するコードですが、結果である「 231 」が返ってきます。更にA1セルの値を「 1 」→「 10 」に更新し、たし算をした結果を出力することもできます。

また、最後の以下のコードはエクセルのワークシート関数を使うときの書き方です。
ここでは、sum関数でA1セル~A4セルの値をたし算しています。

sum = WorksheetFunction.sum(q.Range("A1"), q.Range("A2"), q.Range("A3"), q.Range("A4"))

変数に代入されているオブジェクトを書き換え(更新)

以下の表のようなエクセルシートがあるとします。
ここでは、最初にA列をオブジェクト変数に代入し、値を取り出します。その後で変数内のオブジェクトをB列に更新して値を取り出せるか確認してみます。

A列B列
1行目ピカチュウコラッタ
2行目カイリューズバット
3行目ヤドランギャロップ
4行目ピジョンサンダース
5行目コダックメノクラゲ

入力コード

Option Explicit

Sub test2()
    
    '繰り返し処理用の変数i、jとセル領域を代入するオブジェクト変数boxAの宣言
    Dim i As Integer, j As Integer
    Dim boxA As Object
    
    'ワークシートのA1セル~A5セルを変数に代入する
    Set boxA = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
    
    '変数boxAのA1セル~A5セルに入力された値を繰り返しで出力する
    For i = 1 To 5
        Debug.Print (boxA.Range("A" & i))
    Next i
    
    'ワークシートのB1セル~B5セルを変数に代入する(boxAの中身を更新する)
    Set boxA = ThisWorkbook.Worksheets("Sheet1").Range("B1:B5")
    
    '変数boxAのB1セル~B5セルに入力された値を繰り返しで出力する
    For i = 1 To 5
        Debug.Print (boxA.Range("A" & i))
    Next i
    
    'ワークシートのA1セル~B5セルを変数に代入する(boxAの中身を更新する)
    Set boxA = ThisWorkbook.Worksheets("Sheet1").Range("A1:B5")
    
    'boxAの中身を出力する
    Debug.Print ("A列" & " | " & "B列")
    Debug.Print (boxA.Range("A1") & " | " & boxA.Range("B1"))
    Debug.Print (boxA.Range("A2") & " | " & boxA.Range("B2"))
    Debug.Print (boxA.Range("A3") & " | " & boxA.Range("B3"))
    Debug.Print (boxA.Range("A4") & " | " & boxA.Range("B4"))
    Debug.Print (boxA.Range("A5") & " | " & boxA.Range("B5"))
 
 
End Sub
青色マーカー部分で変数qのオブジェクトを更新しています。

最初に変数boxAに代入されたセル範囲はワークシート(”Sheet1”)A1セル:A5セルとなります。
その後、ワークシート(”Sheet1”)B1セル:B5セルに更新していますが、変数に代入されたRangeオブジェクトとワークシートの座標は別ものである為、Rangeオブジェクトで指定する場合は1(A)列として値を取り出しています。

実行結果

ピカチュウ
カイリュー
ヤドラン
ピジョン
コダック
コラッタ
ズバット
ギャロップ
サンダース
メノクラゲ
A列 | B列
ピカチュウ | コラッタ
カイリュー | ズバット
ヤドラン | ギャロップ
ピジョン | サンダース
コダック | メノクラゲ

「エクセル(Excel)VBAの変数について」のまとめ

今回はエクセルVBAにおける変数を紹介しました。最後に今回紹介した内容をまとめます。

●変数とは何か
値を代入する箱のイメージで良い。

変数のデータ型と種類について
整数型・小数点型・文字列型・日付型など目的に応じた種類の箱を宣言する必要がある。
宣言した型と異なる値を代入しようとするとエラーが発生する。
バリアント型は万能で使えるが、メモリ消費が多くなるので用途が明確であれば使わない。

●変数の宣言方法
「Dim 〇〇 as データ型」
例:Dim i As Integer、Dim j As Stringなど…

●変数に値を代入する方法
「〇〇 = X」で変数に値を代入する
例:i = 1、j = “ピカチュウ”など…

●変数を使ってできることを3つ
1.変数をつかった計算
2.変数をつかった文字列結合
3.オブジェクトを代入して操作

最後までお読み頂きありがとうございました。
これからVBAの学習を試みる人にこの記事が少しでもお役に立てば嬉しいです。

komori
にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村
PVアクセスランキング にほんブログ村コダマのもりブログ - にほんブログ村

コメント

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