エクセルVBA|変数の宣言と値やオブジェクトを代入する基本の使い方

エクセルVBAに限らず、プログラミングを学んでいる人は必ず『変数』というものを知ることになります。マクロやプログラムにおいて、変数を使ったものとそうでないものを比較すると、プログラミングのスキル面だけでなく、その機能の汎用性にも大きな差がでます。

例えば、実行ボタンを押すと「〇〇さん、おはようございます。」とメッセージを表示するマクロがあるとして、〇〇さんの部分に”ネコ”という決まった値を指定すると、そのマクロでは必ず毎回「ネコさん、おはようございます。」となります。これでは、”ネコ”さんにしか挨拶しないマクロになってしまいます。
このような場合、例えば「ネコさん、おははようございます。」の「ネコさん」の部分を『変数』に置きなおせば、変数の値に応じた人に対応したあいさつ文を表示するマクロとなるわけです。

マクロやプログラムは便利な機能を提供するものですが、それを利用する人は不特定多数です。そのため、ユーザーごとの環境に役立つものを作ろうとすると『変数』を使うことが必須だと言えます。なぜなら、ユーザーによって環境や、得たい結果が異なることが一般的だからです。

本記事では、ExcelVBAの『変数』について解説していきます。『変数』は、ExcelVBAでマクロをつくるスキルを上げるだけでなく、他のプログラミング言語を習得する上でに知識にも繋がります。これからプログラミングを学ぼうと考えている人や、マクロ開発のスキルアップを目指す人はぜひ参考にしてください。

『 変数 』はとても便利はものだよ。マクロをつくるためには必須の知識だよ。

エクセルVBAの変数とはどういったものか

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

エクセルVBAの変数とは

個人的にはこの説明で理解することが難しかったので、関連する本やインターネットの記事を参考にしたものでよくつかわれていた表現が以下のとおり

変数は値を入れておく箱

簡単にいえば、変数は学生のときにならったXをつかった文字式の「X」のようなイメージだと言えます。ただし、文字式でならった「X」と異なる点として、変数は数値のみでなく、文字やオブジェクトと呼ばれるものなどもしまっておくことができ、状況に応じて書きかえたり、取り出したりと便利につかえるものと覚えておくと良いでしょう。

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

こちらのイラストには変数名AからCがあります。
それぞれの変数には数字の「1」・文字列の「カレー」と「2022年」を代入する予定で準備します。

エクセルVBAでは、変数をつかうときに何を代入する型の変数であるかを明示的に予約しておく必要があります。数値を入れるためには整数型を、文字を入れるためには文字列型で予約(宣言)しますが、変数(箱)の型と入れる値が異なるものであった場合は、エラーが発生することに注意が必要です。

プログラミング言語によっては、変数の型を宣言しなくてよいものもあるよ。

次からは、ここまでの説明をふまえて変数を宣言する方法について紹介していきます。

エクセルVBAで変数の宣言の書きかた

エクセルVBAで変数をあつかうためには、先に変数を宣言をする必要があることを紹介しました。また、変数の宣言では、その変数がどのような値を代入する予定であるかを指定します。エクセルVBAで変数を宣言するためには、VBEのコード入力画面にて以下のように書きます。

構文

Dim 変数名 As データ型

プロシージャのなかで変数を宣言した場合が以下のコードになります。

変数の宣言
Sub test()

    Dim 変数名 As データ型

End Sub

変数の宣言では、Dimキーワードを使います。Dimキーワードに任意の変数名を書き、Asキーワードでどういったデータ型を代入する変数であるかを指定します。変数名は任意で指定できますが、以下のようなルールがあります。また、データ型には変数に代入する値の種類の型名を指定します。

プロシージャの中で変数を宣言した場合、宣言したプロシージャの中でのみ有効な変数が作成できます。
プロシージャとは、Sub〇〇() から End Sub までの間のひとつのプログラムの単位のことです。変数は、宣言の方法によって適用範囲(スコープ)を指定することができます。

ここでは詳しく解説しませんが、変数はプロシージャのなかでの宣言のほかにモジュールの宣言セクションと呼ばれる場所で宣言することもできます。これらの方法で宣言した変数はモジュールの範囲や、プロジェクト全体を適用範囲として指定する宣言ができます。

標準モジュール
Option Explicit

'~~~~~~~~~~~~~~

'ここが宣言セクション

'~~~~~~~~~~~~~~

Sub Sample_Macro() 'サンプルマクロという名前のプロシージャ

    '変数名「variable1」という数値型の変数を宣言して、variable1に1を代入する
    Dim variable1 As Integer
    variable1 = 1
    
    '変数名「variable2」という文字列型の変数を宣言して、variable2に文字列を代入する
    Dim variable2 As String: variable2 = "1行で変数の宣言と値の代入もできる"

    'メッセージボックスで1を表示する
    MsgBox variable1
    
    'メッセージボックスで「1行で変数の宣言と値の代入もできる」を表示する
    MsgBox variable2
    
End Sub 'End Subまでが1つのプロシージャ

また、変数の値が保持される期間のことを「変数の有効期限」といいますが、こちらも適用範囲と同じく宣言する方法によって期限を指定できます。上記のサンプルマクロのように、通常どおりプロシージャのなかで宣言した場合は、プロシージャのおわりであるEnd Subに到達したあとに変数の値が破棄されます。

まとめると、変数には適用範囲(スコープ)と「有効期限」があり、これらも変数の宣言の方法によって変えることができることを知っておいてください。

変数の適用範囲(スコープ)や有効期限の指定方法については、以下のリンクより読むことができますので合わせてご覧ください。

上記のリンクから参考記事を読むことができます。

ここまでで変数の宣言ができるようになりましたので、宣言した変数に値を代入したり出力したりなどしてみましょう。

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

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

宣言した変数と代入する値の関係について

それでは、宣言した変数に値を代入し、変数の値を取り出す(出力する)マクロを実行してみます。

入力コード

Sub test()

    Dim A As Integer'整数型の変数Aを宣言する。
    Dim B As String, C As String'文字列型の変数BとCを宣言する。
    
    A = 1'変数Aに1を代入する
    B = "カレー"'変数Bにカレーを代入する
    C = "2022年"'変数Cに2022年を代入する
    
    Debug.Print A'イミディエイトウィンドウに変数Aを表示する
    Debug.Print B'イミディエイトウィンドウに変数Bを表示する
    Debug.Print C'イミディエイトウィンドウに変数Cを表示する

End Sub

こちらのマクロでは変数名A・B・Cを使います。変数Aは数値を代入する整数型、変数B・Cは文字を代入する文字列型で宣言しています。それぞれの変数に数値と文字列を代入して、イミディエイトウィンドウに出力するマクロとなっています。

実行結果

イミディエイトウィンドウに以下の結果が表示されます。

1
カレー
2022年

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

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

続いて、変数で宣言した型と異なる値を代入するマクロを書いて実行してみます。

入力コード

Sub test()

    Dim A As Integer
    
    A = "カレー"

    Debug.Print A

End Sub

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

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

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

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

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

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

エクセルVBAにおける変数宣言時の型の種類について

エクセルVBAで変数をつかうためには、変数の宣言をする必要があることを説明しました。さらに変数の宣言は、変数名とその変数であつかうデータ型を指定する必要があります。

それでは変数のデータ型と種類を表で紹介します。ここで紹介する内容を全ておぼえる必要はありませんが、それぞれの型がどのような値をあつかうことができるものであるか、ざっくりと知っておくと良いでしょう。

データ型の種類と代入できる値について
データ型説明代入できる値
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
Booleanブーリアン型(真偽値)True または Falseの真偽値
Objectオブジェクト型ワークブック・ワークシート・セル範囲などのオブジェクトを代入可能
Variantバリアント型万能型

バリアント(Variant)型は万能なので、どういったものでも代入できますが、その分コンピューターのメモリをたくさん使います。
例えるなら、普段持ち歩くようなイヤフォンや眼鏡などを専用ケースではなく、むき出しで海外旅行用のスーツケース入れている状態です。近所の買い物に行くために大きなケースは不向きなので、なるべく準備した箱(変数)にどのような値を代入するものかを想定し、適切なデータ型を宣言することで無駄なメモリ消費を抑えた効率の良いプログラムになります。

変数を宣言するときは『 Dim 変数名 As データ型 』と書くんだね。

変数を1つずつ宣言して、管理するのは面倒くさい。

エクセルVBAで変数をまとめて宣言し、管理する方法として「 配列 」があります。配列は変数のかたまり(ブロック)のようなものなので、たくさんの値を管理する場合に便利に使えるものです。大量のデータを処理するマクロをつくるときは、とても便利につかえるため高度で規模の大きな処理ができるようになります。

多くの変数を使ったマクロをつくるときは、配列をつかうことを検討しましょう。配列の宣言方法や基本的なつかいかたについて詳しく知りたい人は、こちらの記事をご覧ください。

上記のリンクから参考記事を読むことができます。

エクセルVBAで変数をつかったマクロの作り方

エクセル(Excel)VBAでは、変数に代入するためのデータ型を想定して宣言時に指定します。宣言したデータ型以外の値を代入してしまうとエラーが発生しますので注意が必要です。

ここからは、それぞれのデータ型の変数を宣言して値の代入と出力をするマクロを紹介していきます。なるべくシンプルなコードにしていますので、これからマクロを作ろうと考えている人は参考にしてください。

エクセルVBAってどうやってはじめるかわからない。準備ができていない人は以下の記事を参考にしてください。準備するものはMicrosoftExcelだけなので、手順に従って設定をするだけなので5分程で完了します。

エクセル(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
先頭に ‘ がついている行はコメントアウトと言って、VBAのコードとして認識されなります。

こちらのプロシージャ「vartest」は、変数を宣言するだけのマクロになります。
変数名i~qの9つの変数をそれぞれのデータ型で宣言しています。それぞれの変数は、宣言しただけの状態なので初期値となっている状態となっています。それぞれのデータ型変数の初期値は以下のとおりです。

変数で宣言できるデータ型と初期値

変数は宣言したデータ型によってちがった初期値が入っているね。

これまで変数の宣言方法・データ型・初期値と紹介してきましたので、次からそれぞれのデータ型の変数の宣言と値の代入と出力をするマクロを紹介していきます。

VBA変数のデータ型|整数型(Integer)

まずは整数型(Integer)についてですが、こちらは「インテジャー」と読みます。整数型(Integer)の変数は「-32,768~32,767」の整数を代入することができるデータ型です。
サンプルマクロでは、この整数型(Integer)の変数を宣言して、数値の1を代入・出力をしてみます。

マクロで実行したいこと

整数型(Integer)の変数を宣言して、整数1を代入・出力する

入力コード

Sub vartest()

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

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

End Sub

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

1

Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。
上記のリンクから参考記事を読むことができます。

VBA変数のデータ型|小数型(Single)

つづいて単精度浮動小数点数型(Single)についてですが、代入できる数値は「約-3.4×10(38乗)~-1.4×10(-45乗)正の値:約1.4×10(-45乗)~1.8×10(38乗)」のデータ型です。
サンプルマクロでは、この単精度浮動小数点数型(Single)の変数を宣言して、数値の0.5を代入・出力をしてみます。

マクロで実行したいこと

単精度浮動小数点数型(Single)型の変数を宣言して、小数0.5を代入・出力する

入力コード

Sub vartest()

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

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

End Sub

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

0.5

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

VBA変数のデータ型|文字列型(String)

こんどは文字列型(String)をみていきます。代入できる文字数はお使いのパソコンにもよりますが、64ビット版のパソコンならざっくり20億文字以上となります。これだけの文字数の代入が必要なケースはかぎりなく少ないとは思いますが、この文字数の理由を深掘りするとメモリだの、バイトだのとすごく難しい話になってくるため、専門的な知識が豊富で説明上手なブロガーさんに任せることにします。

膨大な文字数を代入できるので、安心して使えるものと知っておけば大丈夫です。
それではサンプルマクロに、この文字列型(String)の変数を宣言して「カレー」を代入・出力をしてみます。

マクロで実行したいこと

文字列(string)型の変数を宣言して、カレーを代入・出力する

入力コード

Sub vartest()

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

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

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

カレー

Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。
上記のリンクから参考記事を読むことができます。

VBA変数のデータ型|日付型(Date)

こちらでは日付型(Date)をみていきます。日付型(Date)であつかえる値は「西暦100年1月1日~西暦9999年12月31日時刻:0:00:00 ~ 23:59:59」です。こちらも文字列型と同じで現実的な業務であつかう値としては十分過ぎる許容量となっています。

マクロで実行したいこと

日付(Date)型の変数を宣言して、文字列、日付リテラル値、シリアル値で日時を代入・出力する

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    '※〇〇は変数名
    Dim Sample_Day1 As Date, Sample_Day2 As Date, Sample_Day3 As Date
    Dim Sample_Day1_1 As Date, Sample_Day2_1 As Date, Sample_Day3_1 As Date

   '文字列で変数に日付を代入する(時間なし)
    Sample_Day1 = "100年1月1日"
    Debug.Print Sample_Day1
    
    '文字列で変数に日付を代入する(時間あり)
    Sample_Day1_1 = "100年1月1日 0:00:01"
    Debug.Print Sample_Day1_1
     
    'リテラル値で変数に日付を代入する(時間なし)
    Sample_Day2 = #12/31/9999#
    Debug.Print Sample_Day2
    
    'リテラル値で変数に日付を代入する(時間あり)
    Sample_Day2_1 = #12/31/9999 11:59:59 PM#
    Debug.Print Sample_Day2_1
    
    '日付シリアル値で変数に日付を代入する(時間なし)
    Sample_Day3 = 1
    Debug.Print Sample_Day3
    
    '日付シリアル値で変数に日付を代入する(時間あり)
    Sample_Day3_1 = 1.0000115741
    Debug.Print Sample_Day3_1


End Sub

VBAで日付を代入するときの記述方法は3つあります。
まずは文字列で代入する書きかた、次に日付リテラル値で代入する書きかた、さいごにシリアル値で代入する方法となります。文字列型で入力する場合は「”」ダブルクォーテーションで、日付リテラル値の場合は「#」シャープを値の両端をつけて書きます。実行結果を確認してみましょう。

正確に日付の代入をするのであれば、日付リテラル値で書くことがおすすめ。

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

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

※シリアル値とはVBAで日付や時刻を数値で管理しているもので、1899年12月31日を1とした数値です。同じようにエクセルにもシリアル値が存在しますが、エクセルでは1900年1月1日を1としていて、VBAとは異なるものとなります。このような違いがなぜあるのかというと、エクセルは1900年が閏年と誤って想定されていたことが原因となります。

シリアル値がVBAとは異なるものであることや、エクセルのシリアル値の想定誤りついて詳しく知りたい人は、以下にMicrosoftのWebページのリンクを掲載しますのでそちらを参考にしてください。

・Excel では、1900 年が閏年であると誤って想定されています

・WorksheetFunction.EoMonth メソッド (Excel)

日付型の変数を使ったマクロでは、実務的にも多くの場面で使われそうなマクロをもう一つ紹介します。

マクロで実行したいこと

日付(Date)型の変数を宣言して、Date関数やNow関数で現在の日付や時刻を代入・出力する

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    '※〇〇は変数名
   
    'Date関数で取得した値は変数名ToDayに、Now関数で取得した値は変数名NowTimeに代入する
    Dim ToDay As Date, NowTime As Date

    '今日の日付を変数に代入する(Date関数)
    ToDay = Date
    Debug.Print ToDay
    
    '今日の日時を変数に代入する(Now関数)
    NowTime = Now
    Debug.Print NowTime

End Sub

エクセルと同じくVBAにも関数が多数存在します。このサンプルマクロではDate関数で現在の日付、Now関数で現在の日時を取得して変数に代入しています。

実行結果

Date関数では現在の日付、Now関数では現在の日時の取得ができるため、値を変数に代入してイミディエイトウィンドウに出力できることが確認できました。

VBA変数のデータ型|ブーリアン型(Boolean)

ブーリアン型(Boolean)の変数をあつかったマクロを書いてみます。ブーリアン型(Boolean)であつかえる値は「True」または「False」の真偽値で、初期値は「False」となります。ブーリアン型(Boolean)の変数では状態の判定などでつかうことができます。

マクロで実行したいこと

ブール・ブーリアン(Boolean)型の変数を宣言して、Trueを代入・出力する

Boolean型変数の初期値はFalseとなります。

入力コード

Sub vartest()

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

   'Boolean型変数の初期値を出力する
    Debug.Print Sample_switch
      
    'Boolean型変数の値をTrue更新する
    Sample_switch = True '文字列ではないため、Trueにダブルクォーテーションはつけない
    Debug.Print Sample_switch

    'Boolean型変数の値に判定式の結果を代入する(璧と壁の字がちがうためFalse)
    Sample_switch = "完璧" = "完壁"
    Debug.Print Sample_switch

    'Boolean型変数の値に判定式の結果を代入する
    Sample_switch = 10 = 2 * 4 + 2
    Debug.Print Sample_switch

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

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

Debug.Printなのでイミディエイトウィンドウに実行結果が出力されます。
上記のリンクから参考記事を読むことができます。

VBA変数のデータ型|オブジェクト型(Object)

オブジェクト型(Object)のサンプルマクロを書いていきます。オブジェクト型(Object)は「ワークブック・ワークシート・セル範囲」などのオブジェクトが代入できます。

マクロで実行したいこと

オブジェクト(Object)型の変数を宣言して、ワークシート(”Sheet1”)のセル範囲(A1セルからA5セル) を代入して、セルに入力された値とセルのアドレス・個数を出力する

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

入力コード

Sub vartest()

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

    'Object型変数にセル範囲を代入する(Setをつけなければエラーが発生する)
    Set Sample_Cell = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
    
    Debug.Print Sample_Cell.Range("A1").Value '代入した範囲のA1の値を表示する
    Debug.Print Sample_Cell.Range("A5").Value '代入した範囲のA5の値を表示する
    Debug.Print Sample_Cell.Address '代入したセル範囲のアドレスを表示する
    Debug.Print Sample_Cell.Count '代入したセル範囲のセルの個数を表示する

End Sub

他のデータ型の変数に値を代入するときと異なり、オブジェクト型を代入するときは、変数名の前にSetをつけないと以下のエラーが発生します。

実行時エラー’91:
オブジェクト 変数または With ブロック変数が設定されていません。

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

A1セルに入力されている値である「1」とA5セルに入力されている値「メッセージボックスでピカピカピカチュウ」が表示されていることから、オブジェクトからセルに入力された値を取り出しています。さらに、オブジェクト変数からアドレスを取り出して出力した結果「$A$1:$A$5」が、セルの個数を出力した結果として「5」が返ってきています。

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

これまでの内容で変数の宣言・値の代入と出力ができました。マクロでは、変数に代入した値をなにかしら加工や書きかえをおこなうことがありますが、ここでは変数の値を書きかえるマクロを作成し、実行してみたいと思います。

マクロで実行したいこと

整数型(Integer)の変数を宣言して、一度代入した値を書きかえて(更新)改めて出力する

入力コード

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

End Sub

こちらのサンプルマクロでは、整数型(Integer)の変数を宣言し、数値の「1」をしています。注目してもらいた点は、”Debug.Purit(i + 9999)“で、出力結果として合計値の10000が返ってきている部分ですが、これは変数に代入された値「1」に9999が加算された結果が出力されているだけなので、変数に代入された値そのものは書きかわっていません。
変数「i」が書きかわっているタイミングは、i = 9999のコードが実行されたタイミングです。

実行結果

1
10000
1
9999

デバッグプリントで9999を足した値を出力しても、変数「i」の値を書きかえているわけではない。

数値だけでなく、文字列型(String)の変数でも値の書きかえ(更新)はできます。

マクロで実行したいこと

文字列型(String)の変数を宣言して、一度代入した値を書きかえて(更新)改めて出力する

入力コード

Sub vartest()

    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    '※〇〇は変数名
    '文字列型の変数「Sample_name1~3」の宣言と値を代入を1行で実行する
    Dim Sample_name1 As String: Sample_name1 = "ミッフィー"
    Dim Sample_name2 As String: Sample_name2 = "うさこ"
    Dim Sample_name3 As String: Sample_name3 = "ナインチェ"

    '変数と文字列をつなげてイミディエイトウィンドウに出力する
    Debug.Print Sample_name1; " は "; Sample_name2; " ちゃんで "; Sample_name3; " です。"
    
    '変数Sample_name1~3の値を書きかえる(更新)
    Sample_name1 = "メラニー"
    Sample_name2 = "ダーン"
    Sample_name3 = "スナッフィー"
    
    '変数と文字列をつなげてイミディエイトウィンドウに出力する
    Debug.Print Sample_name1; " と "; Sample_name2; " と "; Sample_name3; " は ミッフィーのなかまです。"
        
End Sub

文字列型(String)の変数を3つ作成して、デバッグプリントでつなげて文章を出力しています。その後で変数に代入していた文字列を書きかえた後で改めてつなげて文章を出力します。

実行結果

文字列型(String)の変数に代入した値が書きかえられ、文章が正しく出力されていることがわかります。

エクセルVBAで変数をつかったマクロでできること

変数が使えるようになると、VBAでできることの幅が大きく広がります。そのすべてを紹介することは難しいため、基本的な処理をいくつか紹介します。

変数をつかった計算や文字列の結合などの操作

ここでは変数を使って出来ることを簡単な具体例をつけて3つ紹介します。

  • 変数を数値をつかった計算
    • 変数と数値をつかった四則演算の結果を出力するマクロ
  • 変数と変数をつかった計算
    • 変数と変数をつかった四則演算の結果を出力するマクロ
  • 変数で文字列結合
    • 変数と文字列をつなげた結果を出力するマクロ

変数のメリットは、状況に応じて値を書きかえられるところだね。

「変数」と「数値」で足し算・引き算・掛け算・割り算・余りを計算するマクロ

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

マクロで実行したいこと

数値型の変数を宣言して、変数の値と数値をつかって計算する

入力コード

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

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

End Sub

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

100
110
80
300
4
0

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

「変数」と「変数」で足し算・引き算・掛け算・割り算・余りを計算するマクロ

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

マクロで実行したいこと

数値型の変数を宣言して、変数の値と変数の値をつかって計算する

入力コード

Sub vartest()
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    '※〇〇は変数名
     
    '変数を宣言して値を代入する
    Dim Var_Price As Long: Var_Price = 100
    
    '~変数は複数同時に宣言ができる~
    '・宣言方法1:全て長整数型(Long)になる
    Dim Var1 As Long, Var2 As Long, Var3 As Long, Var4 As Long
    
    '・宣言方法2:Var8のみ長整数型(Long)で他はバリアント型(Variant)になる点に注意
    Dim Var5, Var6, Var7, Var8 As Long
    
    '複数の変数に値を代入する
    Var1 = 10: Var2 = 20: Var3 = 3: Var4 = 25
    
    Debug.Print Var_Price + Var1 '100+10
    Debug.Print Var_Price - Var2 '100-20
    Debug.Print Var_Price * Var3 '100*3
    Debug.Print Var_Price / Var4 '100÷25
    Debug.Print Var_Price Mod Var4 '100÷25の余り

End Sub
変数はまとめて宣言できる

サンプルマクロのなかに書かれた以下のコードでは変数をまとめて宣言しています。どちらの宣言方法でもエラーは発生しませんが、宣言の書きかたによって変数のデータ型はちがうものになります。

こちらの宣言方法であった場合は、Var1からVar4の変数はすべて長整数型(Long)となります。

こちらの宣言方法であった場合は、Var8のみ長整数型(Long)でVar5からVar7はバリアント型(Variant)となります。

書きかたによる変数のデータ型のちがいを表にまとめると以下のとおり。

変数名データ型
Var1長整数型(Long)
Var2長整数型(Long)
Var3長整数型(Long)
Var4長整数型(Long)
Var5万能型(Variant)
Var6万能型(Variant)
Var7万能型(Variant)
Var8長整数型(Long)

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

100
110
80
300
4
0

変数と変数でも同じ実行結果が求められました。

変数と変数でも数値と同じようなことができるよ。

上記のリンクから参考記事を読むことができます。

変数をつかった文字列を結合するマクロ

続いて変数を使って文字列を結合します。
具体的に言えば、変数に文字列を代入したものを結合していきます。以下のサンプルマクロ1は、シンプルに変数に代入した文字列をつなげてメッセージをするマクロで、サンプルマクロ2は、ユーザー名や生年月日が入力されると誕生日が何曜日であるかをメッセージで返してくれるマクロです。

サンプルマクロ1

まずは文字列型(String)の変数を宣言し、文字列を変数に代入したあとでつなげて文章を出力します。

マクロで実行したいこと

文字列型の変数を宣言して、文章としてつなげて出力する

入力コード①

Sub vartest()
    
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    '※〇〇は変数名
    
    '主語となる文字列"私"を文字列型(String)の変数の宣言と同時に代入
    Dim Subject As String: Subject = "私"
    
    '複数の文字列型(String)の変数をまとめて宣言する
    Dim PM1 As String, PM2 As String, PM3 As String, PM4 As String
    
    '文字列型(String)の変数にまとめて文字列を代入する
    PM1 = "ピカチュウ": PM2 = "フシギダネ": PM3 = "ヒトカゲ": PM4 = "ゼニガメ"

    '変数と文字列をつなげて出力する
    Debug.Print (Subject & "は" & PM1 & "も" & PM2 & "も" & PM3 & "も" & PM4 & "も全部大好きです。")

    '文字列型(String)の変数にまとめて文字列を代入する
    PM1 = "ライチュウ": PM2 = "フシギソウ": PM3 = "リザード": PM4 = "カメール"

    '変数と文字列をつなげて出力する
    Debug.Print (Subject & "は" & PM1 & "も" & PM2 & "も" & PM3 & "も" & PM4 & "も全部大好きです。")

End Sub

文字列型(String)の変数に値を代入しているコードは以下のとおりです。

PM1 = “ピカチュウ”: PM2 = “フシギダネ”: PM3 = “ヒトカゲ”: PM4 = “ゼニガメ”

PM1 = “ライチュウ”: PM2 = “フシギソウ”: PM3 = “リザード”: PM4 = “カメール”

このコードによって、1度目と2度目のデバッグプリントで出力するメッセージが変わります。

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

1行目が最初に代入したものを出力したもので、2行目が変数の値を書きかえたあとに出力したものです。

サンプルマクロ2

つぎに変数を宣言し、ユーザーからの入力値を変数に代入したあとでつなげて文章を出力するマクロです。これまでのマクロと比べると複雑な処理が入っています。ですが、ここで注目してもらいたいのはマクロを作った人があらかじめ準備した値ではなく、ユーザー(マクロの使用者)から受け取った値を変数に代入して、その変数をつかって文章を出力することができるということがお分かりいただければ大丈夫です。

マクロで実行したいこと

文字列型や日付型の変数を宣言して、ユーザーから受け取った値を変数に代入したものを文章としてつなげて出力する

入力コード②

ユーザーにより入力された名前や生年月日より、メッセージと誕生日が何曜日であるかを返すマクロ

Option Explicit

Sub test()

    Dim name As String'文字列型の変数を宣言する
    Dim input_Birthday As String'文字列型の変数を宣言する
    Dim Birthday As Date'日付型の変数を宣言する
    
    '変数 name にインプットボックスで入力された文字列を代入する
    name = Application.InputBox("あなたの名前を教えてください。", "名前を入力", "緋村剣心")

    '変数 input_Birthday にインプットボックスで入力された文字列を代入する
    input_Birthday = Application.InputBox("あなたの生年月日を数字8桁で入力してください。", "生年月日を入力", "18490620", Type:=1)
    
    '変数に代入された数値が8桁かそれ以外で処理を分岐する
    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'8桁以外の数値が入力された場合は不正の値としてマクロを終了する。
        MsgBox "不正な入力です。" & vbCrLf & "処理を終了します。"
        Exit Sub
    End If
    
    '結果をイミディエイトウィンドウに表示する処理
    Debug.Print ("あなたの名前は" & name & "です。" _
    & vbCrLf & "生年月日は" & input_Birthday & "なので" _
    & vbCrLf & "誕生日は:" & WeekdayName(Weekday(input_Birthday)) & "です。")

End Sub

実行結果

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

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

名前と生年月日を入力すると、誕生日が何曜日をメッセージで返します。

変数は数値も文字列も処理ができる。データの型と代入する値を間違えないように気を付けないとね。

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

オブジェクト型(Object)の変数を宣言して、エクセルのワークシートのセル範囲を代入します。オブジェクト型(Object)の変数からアドレスを取得して文字列型(String)変数に代入、そのあとで文字列として出力します。また、セル範囲に入力された値の合計値を整数型(Integer)に代入して出力するマクロを作成して実行します。

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

前提条件

エクセルのワークシート(Sheet1)は、以下のようになっているものとします。
この範囲をオブジェクト型変数に代入して操作してみます。

オブジェクト型変数に代入するワークシートのセル範囲
セルA1からI9までをオブジェクト型変数に代入します。

入力コード

Sub vartest()
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    '※〇〇は変数名
    
    'オブジェクト型(Object)の変数を宣言する
    Dim Sample_Range As Object
    'Dim Sample_Range As Range 'データ型にはRange型も存在し、セル範囲を代入するならこちらでも可

    
    '整数型(Integer)の変数を宣言する
    Dim Total As Integer
    Dim Func_Total As Integer
    
    '文字列型(String)の変数を宣言する
    Dim Sample_Address As String
    
    '変数に値を代入する
    Set Sample_Range = ThisWorkbook.Worksheets("Sheet1").Range("A1:I9")
        
    '変数Sample_Rangeのアドレスを変数Sample_Addressに代入する
    'アドレスプロパティの戻り値は文字列型(String)のため、文字列型変数に代入する
    Sample_Address = Sample_Range.Address
    Debug.Print "Sample_Addressのアドレスは "; Sample_Address '"$A$1:$I$9"
        
    '変数Sample_Rangeに入力されている値をイミディエイトウィンドウに出力する
    Debug.Print Sample_Range.Range("A1").Value '1
    Debug.Print Sample_Range.Range("A2").Value '2
    Debug.Print Sample_Range.Range("A3").Value '3
    Debug.Print Sample_Range.Range("A4").Value '4
    Debug.Print Sample_Range.Range("A5").Value '5
    Debug.Print Sample_Range.Range("A6").Value '6
    Debug.Print Sample_Range.Range("A7").Value '7
    Debug.Print Sample_Range.Range("A8").Value '8
    Debug.Print Sample_Range.Range("A9").Value '9
    
    '変数Sample_RangeのA列のセルを合計して変数Totalに代入する
    '半角スペースとアンダースコア( _)を行末に書くことでコードが改行できる
    Total = Sample_Range.Range("A1") _
          + Sample_Range.Range("A2") _
          + Sample_Range.Range("A3") _
          + Sample_Range.Range("A4") _
          + Sample_Range.Range("A5") _
          + Sample_Range.Range("A6") _
          + Sample_Range.Range("A7") _
          + Sample_Range.Range("A8") _
          + Sample_Range.Range("A9")
    
    '変数Totalの値をイミディエイトウィンドウに出力する
    Debug.Print Total  '45
        
    '変数Sample_Rangeに1行目のセルを、ワークシート関数で合計して変数Func_Totalに代入する
    Func_Total = WorksheetFunction.sum(Sample_Range.Range("A1:I1"))
    
    '変数Func_Totalの値をイミディエイトウィンドウに出力する
    Debug.Print Func_Total '45
    
End Sub

Dim Sample_Range As Object

サンプルマクロの上記でオブジェクト型(Object)変数を宣言しています。今回変数に代入するものがセル範囲になりますので、As Objectではなく、As Rangeでも宣言できます。オブジェクトの型はいくつもの種類があるのですべて覚える必要はありませんが、このサンプルマクロでもつかえるセル範囲が代入できる「Range」型や、ワークシートを代入してつかう「Worksheet」型などよく使うものからおぼえていくと良いでしょう。

Set Sample_Range = ThisWorkbook.Worksheets(“Sheet1”).Range(“A1:I9”)

オブジェクト型(Object)変数に代入するときには「Set」を忘れずに書きます。これでワークシート名「Sheet1」のA1セルからI9セルの範囲が、変数「Sample_Range」に代入されました。

Dim Total As Integer
Dim Func_Total As Integer

こちらの整数型(Integer)の変数である2つには、「Sample_Range」の値が入力されたセルの合計値を代入します。

・変数名「Total」には、Sample_RangeのA1セルからA9セルに入力された値の合計値
 範囲内のA列には、1から9の数値が入力されているので下記になります。
 
 1+2+3+4+5+6+7+8+9=45

・変数名「Func_Total」には、Sample_RangeのA1セルからI1セルに入力された値の合計値
 範囲内の1行には、1から9の数値が入力されているので下記になります。
 
 1+2+3+4+5+6+7+8+9=45

なお、変数名「Func_Total」に代入する値は、ワークシート関数であるSum関数を利用しています。ワークシート関数は、エクセルのシート上であつかえる関数のことです。VBAにも関数はたくさん存在しますが、エクセルのワークシート関数をつかうこともできることを知っておいてください。

エクセルの関数を使いなれている人は、こちらになじみがあるね。

エクセルVBAでワークシート関数をあつかうための書きかたは他の記事で紹介しています。
Sum関数以外のよく使われる関数も紹介していますので、詳しくは以下のリンクより記事をご覧ください。

上記のリンクから参考記事を読むことができます。

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

実行結果として、イミディエイトウィンドウにオブジェクト型変数に代入したセルのアドレスと、指定したセルの値と合計値の出力ができました。

引き続きこちらのサンプルをもう少し発展させてみましょう。今度は、結果をイミディエイトウィンドウに出力するのではなくセルに値を入力してみます。

マクロで実行したいことをイメージしやすくするため、改めて「Sample_Range」に代入したセル範囲の画像を掲載します。

画像の緑色でかこった、空白のセルB2からI9にもっとも上の行と、左端の列に入力された値を掛けた数値を入力してみます。具体的でいえば、B2を求める数式はA2×B1となるため九九の表となります。

さきほどのサンプルマクロに少し追記したものが以下となります。

入力コード

Sub vartest()
    '変数の宣言
    '「Dim 〇〇 as データ型」で宣言する
    '※〇〇は変数名
    
    'オブジェクト型(Object)の変数を宣言する
    Dim Sample_Range As Object
    'Dim Sample_Range As Range 'データ型にはRange型も存在し、セル範囲を代入するならこちらでも可

    
    '整数型(Integer)の変数を宣言する
    Dim Total As Integer
    Dim Func_Total As Integer
    
    '文字列型(String)の変数を宣言する
    Dim Sample_Address As String
    
    '変数に値を代入する
    Set Sample_Range = ThisWorkbook.Worksheets("Sheet1").Range("A1:I9")
        
    '変数Sample_Rangeのアドレスを変数Sample_Addressに代入する
    'アドレスプロパティの戻り値は文字列型(String)のため、文字列型変数に代入する
    Sample_Address = Sample_Range.Address
    Debug.Print "Sample_Addressのアドレスは "; Sample_Address '"$A$1:$I$9"
        
    '変数Sample_Rangeに入力されている値をイミディエイトウィンドウに出力する
    Debug.Print Sample_Range.Range("A1").Value '1
    Debug.Print Sample_Range.Range("A2").Value '2
    Debug.Print Sample_Range.Range("A3").Value '3
    Debug.Print Sample_Range.Range("A4").Value '4
    Debug.Print Sample_Range.Range("A5").Value '5
    Debug.Print Sample_Range.Range("A6").Value '6
    Debug.Print Sample_Range.Range("A7").Value '7
    Debug.Print Sample_Range.Range("A8").Value '8
    Debug.Print Sample_Range.Range("A9").Value '9
    
    '変数Sample_RangeのA列のセルを合計して変数Totalに代入する
    '半角スペースとアンダースコア( _)を行末に書くことでコードが改行できる
    Total = Sample_Range.Range("A1") _
            + Sample_Range.Range("A2") _
            + Sample_Range.Range("A3") _
            + Sample_Range.Range("A4") _
            + Sample_Range.Range("A5") _
            + Sample_Range.Range("A6") _
            + Sample_Range.Range("A7") _
            + Sample_Range.Range("A8") _
            + Sample_Range.Range("A9")
    
    '変数Totalの値をイミディエイトウィンドウに出力する
    Debug.Print Total  '45
        
    '変数Sample_Rangeに1行目のセル(A1からI1)を、ワークシート関数で合計して変数Func_Totalに代入する
    Func_Total = WorksheetFunction.sum(Sample_Range.Range("A1:I1"))
    
    '変数Func_Totalの値をイミディエイトウィンドウに出力する
    Debug.Print Func_Total '45
    

    'Sample_Rangeの空白セルにもっとも上の行と、左端の列に入力された値を掛けた数値を出力する(ここから追記)
    Sample_Range.Range("B2") = Sample_Range.Range("B1") * Sample_Range.Range("A2")
    Sample_Range.Range("B3") = Sample_Range.Range("B1") * Sample_Range.Range("A3")
    Sample_Range.Range("B4") = Sample_Range.Range("B1") * Sample_Range.Range("A4")
    Sample_Range.Range("B5") = Sample_Range.Range("B1") * Sample_Range.Range("A5")
    Sample_Range.Range("B6") = Sample_Range.Range("B1") * Sample_Range.Range("A6")
    Sample_Range.Range("B7") = Sample_Range.Range("B1") * Sample_Range.Range("A7")
    Sample_Range.Range("B8") = Sample_Range.Range("B1") * Sample_Range.Range("A8")
    Sample_Range.Range("B9") = Sample_Range.Range("B1") * Sample_Range.Range("A9")
    Sample_Range.Range("C2") = Sample_Range.Range("C1") * Sample_Range.Range("A2")
    Sample_Range.Range("C3") = Sample_Range.Range("C1") * Sample_Range.Range("A3")
    Sample_Range.Range("C4") = Sample_Range.Range("C1") * Sample_Range.Range("A4")
    Sample_Range.Range("C5") = Sample_Range.Range("C1") * Sample_Range.Range("A5")
    Sample_Range.Range("C6") = Sample_Range.Range("C1") * Sample_Range.Range("A6")
    Sample_Range.Range("C7") = Sample_Range.Range("C1") * Sample_Range.Range("A7")
    Sample_Range.Range("C8") = Sample_Range.Range("C1") * Sample_Range.Range("A8")
    Sample_Range.Range("C9") = Sample_Range.Range("C1") * Sample_Range.Range("A9")
    Sample_Range.Range("D2") = Sample_Range.Range("D1") * Sample_Range.Range("A2")
    Sample_Range.Range("D3") = Sample_Range.Range("D1") * Sample_Range.Range("A3")
    Sample_Range.Range("D4") = Sample_Range.Range("D1") * Sample_Range.Range("A4")
    Sample_Range.Range("D5") = Sample_Range.Range("D1") * Sample_Range.Range("A5")
    Sample_Range.Range("D6") = Sample_Range.Range("D1") * Sample_Range.Range("A6")
    Sample_Range.Range("D7") = Sample_Range.Range("D1") * Sample_Range.Range("A7")
    Sample_Range.Range("D8") = Sample_Range.Range("D1") * Sample_Range.Range("A8")
    Sample_Range.Range("D9") = Sample_Range.Range("D1") * Sample_Range.Range("A9")
    Sample_Range.Range("E2") = Sample_Range.Range("E1") * Sample_Range.Range("A2")
    Sample_Range.Range("E3") = Sample_Range.Range("E1") * Sample_Range.Range("A3")
    Sample_Range.Range("E4") = Sample_Range.Range("E1") * Sample_Range.Range("A4")
    Sample_Range.Range("E5") = Sample_Range.Range("E1") * Sample_Range.Range("A5")
    Sample_Range.Range("E6") = Sample_Range.Range("E1") * Sample_Range.Range("A6")
    Sample_Range.Range("E7") = Sample_Range.Range("E1") * Sample_Range.Range("A7")
    Sample_Range.Range("E8") = Sample_Range.Range("E1") * Sample_Range.Range("A8")
    Sample_Range.Range("E9") = Sample_Range.Range("E1") * Sample_Range.Range("A9")
    Sample_Range.Range("F2") = Sample_Range.Range("F1") * Sample_Range.Range("A2")
    Sample_Range.Range("F3") = Sample_Range.Range("F1") * Sample_Range.Range("A3")
    Sample_Range.Range("F4") = Sample_Range.Range("F1") * Sample_Range.Range("A4")
    Sample_Range.Range("F5") = Sample_Range.Range("F1") * Sample_Range.Range("A5")
    Sample_Range.Range("F6") = Sample_Range.Range("F1") * Sample_Range.Range("A6")
    Sample_Range.Range("F7") = Sample_Range.Range("F1") * Sample_Range.Range("A7")
    Sample_Range.Range("F8") = Sample_Range.Range("F1") * Sample_Range.Range("A8")
    Sample_Range.Range("F9") = Sample_Range.Range("F1") * Sample_Range.Range("A9")
    Sample_Range.Range("G2") = Sample_Range.Range("G1") * Sample_Range.Range("A2")
    Sample_Range.Range("G3") = Sample_Range.Range("G1") * Sample_Range.Range("A3")
    Sample_Range.Range("G4") = Sample_Range.Range("G1") * Sample_Range.Range("A4")
    Sample_Range.Range("G5") = Sample_Range.Range("G1") * Sample_Range.Range("A5")
    Sample_Range.Range("G6") = Sample_Range.Range("G1") * Sample_Range.Range("A6")
    Sample_Range.Range("G7") = Sample_Range.Range("G1") * Sample_Range.Range("A7")
    Sample_Range.Range("G8") = Sample_Range.Range("G1") * Sample_Range.Range("A8")
    Sample_Range.Range("G9") = Sample_Range.Range("G1") * Sample_Range.Range("A9")
    Sample_Range.Range("H2") = Sample_Range.Range("H1") * Sample_Range.Range("A2")
    Sample_Range.Range("H3") = Sample_Range.Range("H1") * Sample_Range.Range("A3")
    Sample_Range.Range("H4") = Sample_Range.Range("H1") * Sample_Range.Range("A4")
    Sample_Range.Range("H5") = Sample_Range.Range("H1") * Sample_Range.Range("A5")
    Sample_Range.Range("H6") = Sample_Range.Range("H1") * Sample_Range.Range("A6")
    Sample_Range.Range("H7") = Sample_Range.Range("H1") * Sample_Range.Range("A7")
    Sample_Range.Range("H8") = Sample_Range.Range("H1") * Sample_Range.Range("A8")
    Sample_Range.Range("H9") = Sample_Range.Range("H1") * Sample_Range.Range("A9")
    Sample_Range.Range("I2") = Sample_Range.Range("I1") * Sample_Range.Range("A2")
    Sample_Range.Range("I3") = Sample_Range.Range("I1") * Sample_Range.Range("A3")
    Sample_Range.Range("I4") = Sample_Range.Range("I1") * Sample_Range.Range("A4")
    Sample_Range.Range("I5") = Sample_Range.Range("I1") * Sample_Range.Range("A5")
    Sample_Range.Range("I6") = Sample_Range.Range("I1") * Sample_Range.Range("A6")
    Sample_Range.Range("I7") = Sample_Range.Range("I1") * Sample_Range.Range("A7")
    Sample_Range.Range("I8") = Sample_Range.Range("I1") * Sample_Range.Range("A8")
    Sample_Range.Range("I9") = Sample_Range.Range("I1") * Sample_Range.Range("A9")

End Sub

先ほどのマクロに空白セルに値を入力するコードを追記しました。本来こういった力わざの書きかたはせず、くり返しをつかったコードで書きますが、ここでは変数に代入されたセル範囲の値を操作していることをわかりやすくするため、あえて不格好な書きかたで記載しています。

くり返し処理の書きかたは他の記事で紹介しています。
くり返し(ループ)は、実際の業務でもよく利用されるもので、多くの処理をするマクロを作るためには必ずおさえておきたい知識となります。今すぐに実践的なレベルの内容を知りたい人は以下のリンクより記事をご覧ください。

上記のリンクから参考記事を読むことができます。

実行結果

空白セルに、縦横掛け算の計算結果を入力することができました。

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

エクセルシート以下の表があるとします。
ここでは、最初に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

Set boxA = ThisWorkbook.Worksheets(“Sheet1”).Range(“B1:B5”)

最初にオブジェクト変数”boxA”に代入されたセル範囲は、ワークシート(”Sheet1”)A1セル:A5セルとなります。その後、上記のコードで改めて”boxA”にワークシート(”Sheet1”)B1セル:B5セルを代入しています。

Debug.Print (boxA.Range(“A” & i))

この時点の変数”boxA”の値を出力するときの座標の指定方法ですが、変数”boxA”に代入された範囲の座標と、ワークシート上の座標は別ものです。変数”boxA”は5行×1列のオブジェクトですので、B列や2列目を指定するのではなく、A列または1列目を指定しています。

“boxA”のセル範囲はをA列の5行、B列の5行、AB列の5行と値を更新しているよ。

実行結果

実行結果としてイミディエイトウィンドウに以下を表示します。

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

オブジェクト変数に代入されたセル範囲が書きかえられ、値の取り出しもできました。

エクセルVBA|変数の宣言と基本の使い方まとめ

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

  • 変数とはなにか
    • 変数は数値や文字列・オブジェクトなどを入れることができる箱
  • 変数の宣言
    • VBAで変数をつかうためには宣言するコードを書く必要がある
    • 変数を宣言する場所や宣言のしかたによって変数の適用範囲や有効期限がかわる
    • 変数は宣言セクションかプロシージャのなかで宣言する
    • プロシージャのなかで変数を宣言するには「Dim 変数名 As データ型」と書く
  • 変数のデータ型
    • 整数型・小数点型・文字列型・日付型・オブジェクト型・バリアント型など複数のデータ型がある
    • バリアント型はどのデータでも対応ができるがメモリの消費が多くなる
    • オブジェクトのなかには「Worksheet」型や「Range」型などの細かい分類も存在する
  • 変数に値を代入する
    • 変数に値を代入するときは、「変数名=1」や「変数名=”ネコ”」のようにイコールを使う
    • オブジェクト型の変数の場合は「Set 変数名 = Sheets1」のように「Set」を行頭に書く
    • 日付型(Date)型は日付リテラル値「変数名 = #12/31/9999#」で代入するほうが良い
    • 変数宣言時のデータ型と異なる値を代入しようとするとエラーが発生する
    • 変数にはユーザーから受け取った値を代入することもできる
  • 変数をつかってできること
    • 変数と数値をつかって計算する
    • 変数と変数をつかって計算する
    • 変数と文字列を結合してメッセージを表示する
    • オブジェクトを代入して操作する

変数はとても大事なところなのでぜひ使えるようになってね。

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

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

コメント

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