【プログラミング】エクセルVBAの変数:宣言(Dim)とデータ型の種類(as 〇〇)を解説

プログラミング
<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-teal-color">komori</mark></strong>
komori

こんにちは。今回はエクセル(Excel)VBAの変数を扱ってみたいと思います。

プログラミングを学んでいく上で欠かせない変数の存在ですが、今回はエクセル(Excel)VBAにおける変数について解説していきたいと思います。

基本的にはどのプログラミングで同様になりますがコードの書き方や事前のデータ型の宣言の有無など細かいところは使うプログラミング言語により異なってきます。

この記事はこういう人におすすめできます
  • これからエクセル(Excel)lVBAでプログラミングをしていきたい人

  • エクセル(Excel)を書いて文字の表示は出来るようになった人

  • エクセル(Excel)VBAを覚えて事務作業をもっと効率的にすすめていきたい

  • エクセル(Excel)VBAを含めこれからプログラミングを覚えていきたい

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

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

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

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

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

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

何だか凄く難しい説明ので私は「なるほど!」とならないのですが、よくプログラミングを勉強していく中で言われるのは、箱に例えられ、その箱の中身の読みや書き込み、更新、破棄などの処理を自由にできるようにするもの。

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

ただし、VBAではこの箱を事前に何用かを明示的に予約しておく必要があるので、整数型のintに文字列の”カレー”を代入しようとするとエラーとなります。

引越の荷造り時にダンボール箱に「服」「アクセサリー」「本」「おもちゃ」などのラベルづけをしたことがある人はそちらをイメージすると理解しやすいでしょう。

Pythonは変数の宣言時に型をつける必要がないので、事前に宣言が必要かどうかは言語によって異なります。

エクセル(Excel):変数の種類(データ型)と用途について

続いて変数の種類と用途についてですが、プログラミングで値を扱う上で”データ型”というものが重要になります。これはそれぞれの値が持つ形式のようなものであり、VBAではこの型(値)と変数の型(箱の種類)が食い違っていると実行時にエラーとなります。

変数の種類について
ここでは全てを紹介はしませんが、使用頻度が高いものを挙げておきます。

エクセル(Excel)VBAにおけるデータ型の種類
  • Integer
    整数型

    (-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)

  • Boolean
    ブール・ブーリアン型

    (TrueまたはFalse)

  • Object
    オブジェクト型

    (オブジェクト)

  • Variant
    バリアント型

    (万能型)

<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-teal-color">komori</mark></strong>
komori

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

エクセル(Excel)VBAで変数を扱う時のコードの書き方

エクセル(Excel)VBAでは変数を扱う場合に事前に宣言をする必要があります。
基本的にはコードを読みやすくする理由で、Sub〇〇()の直ぐ下の冒頭部分に宣言しておくことが多いです。

エクセル(Excel)VBA:変数宣言コードの書き方

変数 i~ q をそれぞれのデータ型で宣言する

入力コード

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

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

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

入力コード

Sub vartest()

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

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

End Sub

実行結果

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

小数点(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)型の変数mに【 カレー 】を代入する

入力コード

Sub vartest()

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

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

実行結果

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

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

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

入力コード

Sub vartest()

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

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

実行結果

2022/10/20

ブール・ブーリアン(Boolean)型の変数oに【 True 】を代入する

入力コード

Sub vartest()

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

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

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

実行結果

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

オブジェクト(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 
メッセージボックスでピカピカピカチュウ
Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。
ワークシート”Sheet1″のA1セルには【 1  】が入力されているため値が出力されます。。
A5セルには【 メッセージボックスでピカピカピカチュウ 】 が入力されているため値が出力されます。

エクセル(Excel)VBA:変数に代入した値の更新(書き換え)

入力コード

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)

実行結果

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

入力コードを詳細にみていきます。

Debug.Print (i + 9999)
Debug.Print (i)

まずは、変数i + 9999をしているこちらですがポイントは変数iの値を書き換えている訳ではない点です。実行結果が10000となっていますが、これはデバッグプリントをするタイミング変数iに9999が足された数値が表示されています。

i = 9999
Debug.Print (i)

つづいて、上記の場合ですがこちらは実行結果が9999となります。コードの記述そのままですが、変数iの値を9999に書き換えた処理を実行のあとにデバッグプリントで変数iを表示しているからです。

入力コード

'変数iに9999を足して、変数iを書き換える(更新する)コード

i = i + 9999
Debug.Print (i)
上記の場合、先頭に【 i = 】を記載しており、こちらの場合は変数iを書き換えることができます。

実行結果

10000
こちらは変数iの値が書き換えられ、元々代入されていた【 1 】に【 9999 】が足された値に更新されました。

エクセル(Excel)VBAで変数を扱って出来ること

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

エクセル(Excel)VBA:変数をつかった計算

変数と数値を使って計算結果を表示してみます。
ここでは四則演算(足し算、引き算、掛け算、割り算)と余りを求める除算と紹介します。

入力コード

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 〇〇 as データ型」で宣言する

Dim j As Integer, k As Integer, l As Integer, m As Integer
データ型を指定するときは上記の書き方をしましょう。
'複数の変数の宣言
'「Dim 〇〇 as データ型」で宣言する

Dim j , k , l , m As Integer
エラーとはなりませんが、上の場合は変数j、k、lについてはバリアント(万能)型で宣言されることになります。(※最後の変数mのみ整数(int)型となってしまいます。)

実行結果

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

エクセル(Excel)VBA:変数をつかった文字列結合

続いて変数を使って文字列を結合をします。

入力コード

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 & "も全部大好きです。")

実行結果

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

エクセル(Excel)VBA:オブジェクトを変数に代入して操作する

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

変数に代入されている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の値を変更した後、値を全て足して変数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セル~A5セルに入力されている値が表示されています。下から3行目は、A1からA4セルの合計値、その下2行はA1セルの値を”10″に書き換えた後に改めてA1セルからA4セルの合計値を表示しています。


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

先ほどのコードに追記する形で変数に代入されているオブジェクトを更新し、変わったことを確認してみます。

入力コード

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

  '変数qにセル範囲オブジェクトを参照する  
    Set q = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
    

  '変数qに代入されたRangeオブジェクトからセルに入力された値を表示する
    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の値を変更した後、値を全て足して変数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)
    
    
    q.Range("A1").Value = 1

 '変数qのオブジェクトを解除    
    Set q = Nothing

  '変数qに新たにセル範囲オブジェクトを参照する  
    Set q = ThisWorkbook.Worksheets("Sheet1").Range("B1:B6")

  '変数qに代入されたRangeオブジェクトからセルに入力された値を表示する
    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)
    Debug.Print (q.Range("A6").Value)

    Debug.Print (q.Range("A1") & "は" & q.Range("A2") & "と" & q.Range("A3") & "と" _
    & q.Range("A4") & "と" & q.Range("A5") & "と" & q.Range("A6") & "と友達です。")
End Sub
青色のマーカー部分で変数qのオブジェクトを更新しています。

変数qに代入されたセル範囲はワークシート(”Sheet1”)A1セル:A5セルからワークシート(”Sheet1”)B1セル:B6セルに書き換えていますが、変数に代入されたRangeオブジェクトとワークシートの座標別ものである為、Rangeオブジェクトで指定する場合は1(A)列として値を取り出しています。

実行結果

 1 
 10 
 110 
 110 
メッセージボックスでピカピカチュウ
 231 
 240 
 240 
私
ピカチュウ
フシギダネ
ヒトカゲ
ゼニガメ
イーブイ
私はピカチュウとフシギダネとヒトカゲとゼニガメとイーブイと友達です。
黄色部分がコードを追記して得られた実行結果となります。

エクセル(Excel)VBAにおける変数についてまとめ

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

エクセル(Excel)VBA変数まとめ
  • 変数とは何か
    • 値を代入する箱として認識すればOK

  • 変数のデータ型と用途について
    • 整数型・小数点数型・文字列型・日付型など目的に応じた箱を用意する必要がある

    • 万能(バリアント)型もあるが、変数の用途が決まっているならなるべく使わない

  • 変数を扱うときのコードの書き方
    • 「Dim 〇〇 as データ型」で変数を宣言する
      例:Dim i As Integer、Dim j As Stringなど…

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

  • 変数を扱って出来ることを3つ紹介
    • 変数を使って計算ができる
      ※変数どうしでも可能

    • 変数を使って文字列の結合ができる
      ※変数どうしでも可能

    • 変数を使ってオブジェクト操作ができる

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

komori

コメント

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