
VBAを使ったExcelのマクロを習い始めたんだけど、
セルの値を取得する方法がわからない…。

なるほど…。
セルの値を取得できれば、集計したり比較したりできて便利です。
マクロ操作の幅がぐーんと広がりますよ!
では今回は、「VBAでセルの値を取得する方法」を
できるだけわかりやすく解説いたします。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
VBAでセルの値を取得する方法(Excelマクロ)

上図が元データです。
A1セルに書き込みされた値「Utatane」を取得してみましょう。
まずは基本構文をご覧ください。
基本構文
Sub セルの値を取得()
Dim atai As Variant
atai = Range("A1").Value ' セルA1の値を取得
Debug.Print atai
End Sub
1つ1つ解説していきます。
プロシージャの作成
Sub セルの値を取得()
End Sub
プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。
変数の宣言
Dim atai As Variant
上記コードにて、以降使用する変数の宣言を行っております。
変数や宣言についての詳しい解説は、下記記事をご参考ください。
セルの値を取得
atai = Range("A1").Value
上記コードにて、セルの値を取得しています。
今回は「A1セル」の値(Utatane)を取得し、2行目で宣言した変数(atai)に代入した場合の例です。
変数名(今回はatai)を書いたら、「=(イコール)」を書きます。
「=」の後ろに、「Range().Value」を書いてください。
()内に取得するセルの名前を書いて完了です。
「Range」というのは「セル」を指すものだと思ってください。
「Value」は「値」という意味です。
ここまでをまとめると「Range(“A1”).Value」は「セルA1の値」を意味します。
それを変数に代入したという認識でOKです。
セル名は「”(ダブルクォーテーション)」で囲ってください。囲わないとうまく動作しません。
これで変数(atai)にA1セルの値である「Utatane」が格納されました。
変数に値が格納(セルの値が取得)されたことを確認するために、今回は「Debug.Print」で値を表示させています。
「Debug.Print」での表示方法は、下記記事をご参考ください。
マクロが完成したら、実行して動作を確認してみましょう。

エクセル内に作成した自作のボタンを押してマクロを実行させることも可能です。
ボタンの作り方は、下記記事でわかりやすく解説しております。
ショートカットキーを押すことでマクロを実行させることもできます。
詳しくは下記記事をご参考ください。
マクロを実行してみると、イミディエイトウィンドウに「Utatane」と表示されました。

A1セルの値が取得されたということです。
では次に応用例として、いろいろな取得例を見ていきましょう。
いろいろな取得例
ここからは、比較的よく使う取得方法をいくつか紹介いたします。
Cellsで取得
下記のVBAコードを見てください。
Sub セルの値を取得()
Dim atai As Variant
atai = Cells(1, 1).Value ' セルA1の値を取得
Debug.Print atai
End Sub
前項では「Range」を使ってセルの値を取得しましたが、
今回は「Cells」を使って取得しています。
使い方は「Range」と似ていますが、少し違います。
「Cells(行番号, 列番号)」でセルを指定できます。
例えば「Cells(1, 1)」ならA1、「Cells(2, 3)」ならC2といった具合です。
Cellsの使い方として便利なのは、For文ループで使いやすいという点です。
「Cells(row, col)」といったように、行番号・列番号を変数に置き換えることができるため、
「1→2→3」とカウントを進めることで、ループを容易に行うことができます。
For文のループ処理については下記記事をご参考ください。
RangeとCellsの違いをまとめた記事も参考になるかと思います。
アクティブセルの値を取得
アクティブセルとは、現在選択されているセルのことです。

下記のVBAコードを実行することで、アクティブセルの値を取得できます。
Sub セルの値を取得()
Dim atai As Variant
atai = ActiveCell.Value ' アクティブセルの値を取得
Debug.Print atai
End Sub

「A1」など、セルを直接指定しなくてもよいのが特徴です。
範囲セルの値を取得
下図のように、A1~C3の範囲を取得することもできます。

Sub セルの値を取得()
Dim atai As Variant
atai = Range("A1:C3").Value ' A1~C3セルの値を取得
Debug.Print atai(1,3) ' C1の値を表示
End Sub
取得されたセルの値は二次元配列として変数に格納されます。
配列については下記記事をご参考ください。
別シートの値を取得
これまで紹介した取得方法は、アクティブシート(現在開いているシート)限定でした。
しかしながら、別のシートの値を取得したい場合もあるかと思います。
そんな時は、下記のVBAコードを実行してください。
Sub セルの値を取得()
Dim atai As Variant
atai = Worksheets("Sheet2").Range("A1").Value ' 「Sheet2」のA1セルの値を取得
Debug.Print atai
End Sub
3行目に「Worksheets(“Sheet2”).」が追加されただけです。
「Sheet2」はシート名に応じて変更してください。
もし、シート名が不明な場合は、シート番号でシートを指定することができます。
atai = Worksheets(2).Range("A1").Value ' シート番号2のA1セルの値を取得
(2)は左から2番目のシートを指します。
一番右のシートを指定したい場合は、(Sheets.Count)と記述してください。

ここまで、いろいろな取得方法を紹介いたしました。
次は取得した値の活用法を紹介いたします。
取得後の活用法
ここからは、取得した値の簡単な活用法をお見せします。
取得した値を別のシートにコピー
下記VBAコードは、「Sheet1のA1セル」から値を取得し、「Sheet2のA1セル」にコピーした例です。
Sub セルの値を取得()
Dim atai As Variant
atai = Worksheets("Sheet1").Range("A1").Value ' Sheet1のA1セルの値を取得
Worksheets("Sheet2").Range("A1").value = atai ' Sheet2のA1セルにコピー
End Sub
コードの3行目で値を取得し、4行目で値をコピー(書き込み)しています。
値の書き込みについては、下記記事をご参考ください。
取得したセルの値が空かどうかを判定
下記VBAコードは、A1セルが空白かどうかを判定するサンプルコードです。
Sub セルの値を取得()
Dim atai As Variant
If Range("A1").Value = "" Then
Debug.Print "セルは空です"
End If
End Sub
Ifを使って、セルが空白だった場合は別の処理をさせています。
If文については下記記事でわかりやすく解説しております。ご参考ください。
うまく動作しないときの対処法
エラーが発生する
型が一致しません
例えば、A1セルの値である「Utatane」という文字列を「Integer型」の変数に代入しようとするとこのエラーが発生します。
A1セルの値が文字列とわかっている場合は「String型」で宣言した変数に代入しましょう。
A1セルの値が数値なのか文字列なのか不明な場合は、「Variant型」で宣言すると安全です。
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAでセルの値を取得する方法(Excelマクロ)を解説いたしました。
当ブログでは、VBAを使ったExcelマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!