Excelマクロ・VBA セルへ値を設定/セルから値を取得

2021年10月14日

Excelのマクロ・VBAにおけるセルの値の基本的な操作方法を紹介します。

解説

Range.ValueプロパティまたはCells.Valueプロパティを利用して操作します。

セルへ値を設定

対象をセルアドレスで指定(Range)

単独のセル

Range("セルアドレス").Valueに対して設定します。

Worksheets("シート名")を利用すると対象シートも指定します。

シートを指定しない場合はアクティブシートのセルが対象になります。

Worksheets(インデックス) の場合は最も左のシートを1とした連番を指定します。

以下コード例です。(赤字は適宜変更

' アクティブシートのA1セルに設定
Range("A1").Value = 設定値
' Sheet1のB1セルに設定
Worksheets("Sheet1").Range("B1").Value = 設定値
' 最も左にあるシートのA2セルに設定。1つ数字を増やすと1つ右のシート
Worksheets(1).Range("A2").Value = 設定値
セル範囲

Rangeでセル範囲を指定すると範囲に対して設定します。

省略していますが、 Worksheets指定も可能です。

設定する値が配列でない場合は対象の全セルに同じ値が設定され、

配列やセル範囲の場合は配列の内容が展開されます。

以下コード例です。(赤字は適宜変更

' A1~C3の値を取得
Range("A1:C3").Value = 設定値
' A1~C3の値を取得(前行と同じ効果)
Range("A1", "C3").Value = 設定値
' 設定値がセル範囲。A1~A3の値をB1~B3に設定
Range("B1:B3").Value = Range("A1:A3").Value 

設定値の配列やセル範囲が設定対象のセル範囲と合わなくても設定可能です。

ただし設定される側のセル範囲の方が大きい場合、余るセルに#N/Aエラーが設定されます。

逆の場合は設定値の方の該当要素が無視されます。(設定される側の余るセルは変化なし)

対象を行数・列数で指定(Cells)

Cells(行数,列数).Valueに対して設定します。

Worksheets("シート名")を利用すると対象シートも指定します。

シートを指定しない場合はアクティブシートのセルが対象になります。

Worksheets(インデックス) の場合は最も左のシートを1とした連番を指定します。

以下コード例です。(赤字は適宜変更

' アクティブシートのA1セルに設定
Cells(1,1).Value = 設定値
' Sheet1のB1セルに設定
Worksheets("Sheet1").Cells(1,2).Value = 設定値
' 最も左にあるシートのA2セルに設定。1つ数字を増やすと1つ右のシート
Worksheets(1).Cells(2,1).Value = 設定値

設定値のデータ型について

設定値は文字列は"で囲む必要があるなど一定のルールがあります。

以下コード例です。

Range("A1").Value = "ABCD" ' 文字列は"で囲む
Range("A2").Value = "2021/10/13" ' 日付は"で囲む。セルでは数値(シリアル値)扱い
Range("A3").Value = 1234 '数値は"で囲まない
Range("A4").Value = 変数 '変数は"で囲まない
Range("A5").Value = "1234" '数値を"で囲っても良いが、セルでは数値扱い
Range("A6").Value = "'1234" '数値を文字列にしたい場合は"で囲って先頭に'
Range("A7").Value = "'''1234" '先頭の'を文字として表示したい場合は'を2つ。先頭以外は1つ。結果は ''1234
Range("A8").Value = """""1234" '"を文字としたい場合は"を常に2つ。結果は""1234
Range("A8").Value= "=10+5" '先頭が=の場合は数式扱い。数式がそのまま設定されるので関数も設定可能

セルからの値を取得

対象をセルアドレスで指定(Range)

単独のセル

Range("セルアドレス").Valueで取得します。

Worksheets("シート名")を利用すると対象シートも指定します。

シートを指定しない場合はアクティブシートのセルが対象になります。

Worksheets(インデックス) の場合は最も左のシートを1とした連番を指定します。

以下コード例です。(赤字は適宜変更

' アクティブシートのA1セルを取得
変数 = Range("A1").Value 
' Sheet1のB1セルを取得
変数 = Worksheets("Sheet1").Range("B1").Value
' 最も左にあるシートのA2セルを取得。1つ数字を増やすと1つ右のシート
変数 = Worksheets(1).Range("A2").Value
セル範囲

Rangeでセル範囲を指定すると複数の値を二次元配列で取得します。

省略していますが、 Worksheets指定も可能です。

何らかの理由で配列の形で取得したいか、高速化したい場合に有効です。

ただしコードとしては読み取りにくいので、理由がなければ単独セルの方を推奨します。

以下コード例です。(赤字は適宜変更

Dim
二次元配列変数
As Variant
二次元配列変数 = Range("A1:C3").Value ' A1~A3の値を取得
二次元配列変数 = Range("A1", "C3").Value ' A1~A3の値を取得(前行と同じ効果)
' 値をセルに設定
Range("A5").Value = 二次元配列変数(1, 3)
Range("A6").Value = 二次元配列変数(2, 2)
Range("C7").Value = 二次元配列変数(3, 1)

対象を行数・列数で指定(Cells)

Cells(行数,列数).Valueで取得します。

Worksheets("シート名")を利用すると対象シートも指定します。

シートを指定しない場合はアクティブシートのセルが対象になります。

Worksheets(インデックス) の場合は最も左のシートを1とした連番を指定します。

以下コード例です。(赤字は適宜変更

' アクティブシートのA1セルを取得
変数 = Cells(1,1).Value 
' Sheet1のB1セルを取得
変数 = Worksheets("Sheet1").Cells(1,2).Value
' 最も左にあるシートのA2セルを取得。1つ数字を増やすと1つ右のシート
変数 = Worksheets(1).Cells(2,1).Value

変数のデータ型について

セルにどのような値が入っているか不明な場合はVariantにします。

もし何かしらのルールの下で入力される場合にはStringやIntegerなど具体的なデータ型にします。

Variantで取得した場合、どのようなデータが入力されたかを確認する必要がある場合があります。

その場合はIs〇〇関数やTypeName関数を利用します。

以下コード例です。(赤字は適宜変更

Dim
変数
As Variant
変数 = Range("A1").Value

Range("B1").Value = IsNumeric(変数) ' 変数が数値の場合、True
Range("B2").Value = IsError(変数) ' 変数がエラーの場合、True
Range("B3").Value = IsDate(変数) ' 変数が日付の場合、True
Range("B4").Value = IsArray(変数) ' 変数が配列の場合、True
' 文字列を調べる関数がないため、すべてFalseなら文字列と判定

Range("B5").Value = TypeName(変数) ' 変数のデータ型を取得

数式を取得する場合(FormulaとFormulaR1C1)

取得対象のセルが数式の場合、Valueでは数式ではなく計算結果が取得されます。

数式を取得したい場合は、 FormulaまたはFormulaR1C1で取得します。

変数 = Range("A1").Value ' A1セルの計算結果を取得
変数 = Range("A1").Formula ' A1セルの数式(A1形式)を取得
変数 = Range("A1").FormulaR1C1 ' A1セルの数式(R1C1形式)を取得

数式がスピル(動的配列数式)の場合は Formula2またはFormula2R1C1で取得します。

書式設定された文字列を取得する場合(Text)

例えば通貨の書式設定を適用しているセルの場合、(例として 10000 が \10,000 になる)

Valueでは書式設定の反映されない10000が取得されます。

書式設定の反映されない \10,000 を取得したい場合はTextを利用します。

変数 = Range("A1").Value ' A1セルの書式設定が反映されていない数値を取得
変数 = Range("A1").Text' A1セルの書式設定が反映された文字列を取得

日付のシリアル値を取得する場合(Value2)

利用頻度は低いと思われますが、日付セルをシリアル値で取得したい場合はValue2を利用します。

変数 = Range("A1").Value ' A1セルの値を日付型で取得
変数 = Range("A1").Value2' A1セルのシリアル値を数値型で取得

Office スクリプト(オンライン版)の場合

以下のコードで行います。(赤字は適宜変更

workbook.getWorksheet("シート").getRange("セルアドレス").setValue("設定値");          // 設定
workbook.getWorksheet("シート").getCell(行番号 - 1, 列番号 - 1).setValue("設定値");   // 設定
変数名 = workbook.getWorksheet("シート名").getRange("セルアドレス").getValue();        // 取得
変数名 = workbook.getWorksheet("シート名").getCell(行番号 - 1, 列番号 - 1).getValue(); // 取得

詳細はこちら。

関連記事

マクロ・VBAの学習・活用方法の記事一覧