Excel VBAでセルの値を取得する方法をお探しですね。

広告

Excel VBAでセルの値を取得・入力する方法を基礎から解説

Excel VBAでセルの値を取得したり入力したりする処理は、マクロ作成の基本中の基本です。

手作業でセルに入力したり、別の場所へコピーしたりする作業を、VBAではRangeやCellsを使って簡単に書けます。

ただし、RangeとCellsの使い分けや、Valueプロパティの意味、別シートを指定するときの注意点をしっかり理解していないと、思わぬトラブルが起きることがあります。

たとえば、意図しないシートに値を書き込んでしまったり、数式ではなく計算結果だけを取得してしまったり……。

この記事では、Excel VBAでセルの値を扱う方法を、初心者の方にも分かりやすく整理して解説します。

1. セルの値を扱う基本は「Valueプロパティ」

Excel VBAでセルの値を扱うときの基本は、「セル.Value」という形です。

たとえばA1セルの値を取得したいなら、`Range(“A1”).Value`と書きます。

逆に、A1セルへ文字列や数値を入力したいときは、`Range(“A1”).Value = “東京”`のように、Valueプロパティへ値を代入すればOKです。

Valueとは、セルに入っている「値そのもの」を表すプロパティです。

セルに数式が入っている場合、Valueで取得できるのは数式の文字列ではなく、計算された結果になります。

“`vb
Sub セルの値を取得する()
Dim s As String

s = Range(“A1”).Value
Debug.Print s
End Sub
“`

“`vb
Sub セルに値を入力する()
Range(“A1”).Value = “東京”
Range(“B1”).Value = 100
End Sub
“`

Valueは省略できる?

実は、RangeやCellsでセルを指定した場合、`.Value`を省略しても動くことがあります。

たとえば`Range(“A1”) = “東京”`と書いても、多くの場合は`Range(“A1”).Value = “東京”`と同じ意味として扱われます。

でも、初心者のうちはValueを省略せずに書くことをおすすめします。

理由は、コードを読んだときに「セル範囲そのものを操作している」のか「セルの値を操作している」のかが、はっきり分かるからです。

特にセル範囲の転記や配列処理では、Valueを付けるかどうかで意図が伝わりやすくなります。

ValueとTextの違い

表示されている見た目の文字列を取得したい場合は、ValueではなくTextプロパティを使います。

たとえばセルに「1000」という数値が入っていて、表示形式で「1,000円」と表示されている場合を考えてみましょう。

Valueは数値の1000を返しますが、Textは画面上に表示されている「1,000円」のような文字列を返します。

集計や計算に使うならValue、帳票の表示どおりの文字列を取り出したいならText、というように目的に合わせて使い分けましょう。

“`vb
Sub 表示文字列を取得する()
Debug.Print Range(“A1”).Value ‘セルの実際の値
Debug.Print Range(“A1”).Text ‘セルに表示されている文字列
End Sub
“`

2. RangeとCellsの違いと使い分け

RangeとCellsは、どちらもセルを指定するために使います。

でも、それぞれに得意な場面があります。

Rangeの特徴

Rangeは`Range(“A1”)`や`Range(“A1:B10”)`のように、Excel画面で見慣れたA1形式で指定できます。

固定されたセルや範囲を扱うときに読みやすいのが特徴です。

Cellsの特徴

一方、Cellsは`Cells(行番号, 列番号)`の形で指定します。

たとえば`Cells(1, 1)`はA1セル、`Cells(2, 3)`はC2セルを表します。

行番号と列番号を数値で扱えるため、For文などの繰り返し処理や、変数を使った処理と相性がいい書き方です。

“`vb
Sub RangeとCellsの基本()
Range(“A1”).Value = “Rangeで入力”
Cells(2, 1).Value = “Cellsで入力” ‘A2セル
End Sub
“`

使い分けの目安

使い分けの目安は、**セル番地が固定ならRange、行や列を変数で動かすならCells**です。

たとえばA1、A2、A3のように縦方向へ連続して値を入力する場合、`Range(“A” & i)`のようにRangeへ文字列連結で指定することもできます。

でも、列方向にも変数を使いたい場合は、列番号をアルファベットへ変換する必要が出てきて、コードが分かりにくくなりがちです。

その点、Cellsなら`Cells(i, j)`のように行も列も数値で指定できるため、表全体を処理するときに自然に書けます。

“`vb
Sub 繰り返しで入力する()
Dim i As Long

For i = 1 To 5
Cells(i, 1).Value = i * 10
Next i
End Sub
“`

RangeとCellsの組み合わせ

セル範囲を変数で指定したい場合は、RangeとCellsを組み合わせる方法が便利です。

たとえばA1からC10までを指定するなら、`Range(Cells(1, 1), Cells(10, 3))`と書けます。

これは「左上のセル」と「右下のセル」をCellsで指定し、その間の範囲をRangeで取得する考え方です。

行数や列数が処理中に変わる表では、この書き方が特に役立ちます。

ただし、標準モジュールでシートを省略するとアクティブシートが対象になるため、実務では後で説明するようにワークシート名まで明示するのが安全です。

“`vb
Sub RangeとCellsを組み合わせる()
Range(Cells(1, 1), Cells(10, 3)).Value = “入力”
End Sub
“`

3. セル範囲の値をまとめて取得・代入する方法

Excel VBAでは、1セルずつ値を取得・入力するだけでなく、セル範囲をまとめて扱うこともできます。

たとえばA1からC10までの値をE1からG10へ転記したい場合、For文で1セルずつコピーするよりも、セル範囲のValueをまとめて代入するほうがシンプルで高速です。

Excel VBAは、セルへのアクセス回数が増えるほど処理が遅くなりやすいので、大量データを扱う場合は「範囲ごと取得して、範囲ごと代入する」という考え方が大切になります。

“`vb
Sub セル範囲を転記する()
Range(“E1:G10”).Value = Range(“A1:C10”).Value
End Sub
“`

配列を使った処理

セル範囲の値を変数に入れると、Variant型の二次元配列として取得できます。

たとえば`v = Range(“A1:C10”).Value`とすると、vには行と列を持つ配列が入ります。

このとき、通常は`v(1, 1)`が範囲内の左上、つまりA1セルの値に対応します。

配列に入れてから処理すると、ワークシートへ何度もアクセスせずにメモリ上で計算できるため、大量のデータ加工で処理速度を大幅に改善できます。

最終的に結果をセルへ戻すときも、配列の大きさに合わせた範囲へ一括で代入できます。

“`vb
Sub 範囲を配列で取得する()
Dim v As Variant

v = Range(“A1:C10”).Value

Debug.Print v(1, 1) ‘A1
Debug.Print v(1, 2) ‘B1
End Sub
“`

Resizeで出力範囲を自動調整

配列をセルへ出力するときは、出力先のセル範囲の大きさに注意が必要です。

取得元が10行3列なのに、出力先を5行3列にすると一部しか出力されません。

逆に、出力先を広く取りすぎると、余ったセルにエラー値が入ることがあります。

そこで便利なのがResizeです。

Resizeは、起点セルから指定した行数・列数の範囲へ広げるプロパティです。

配列の行数や列数をUBoundで取得し、出力先の範囲を自動調整すると、表の大きさが変わっても対応しやすくなります。

“`vb
Sub 配列をセルへ出力する()
Dim v As Variant

v = Range(“A1:C10”).Value
Range(“E1”).Resize(UBound(v, 1), UBound(v, 2)).Value = v
End Sub
“`

数式を入力する場合

数式を入力したい場合は、ValueではなくFormulaプロパティを使います。

たとえばD1セルにA1とB1の合計式を入れるなら、`Range(“D1”).Formula = “=A1+B1″`と書きます。

セル範囲にFormulaを代入すると、Excelで数式をコピーしたときのように相対参照が自動調整されます。

計算結果だけを残したい場合は、数式を入れたあとに`Range(“D1:D10”).Value = Range(“D1:D10”).Value`と書くことで、値貼り付けと同じように数式を値へ固定できます。

“`vb
Sub 数式を入力して値にする()
Range(“D1:D10”).Formula = “=A1+B1”
Range(“D1:D10”).Value = Range(“D1:D10”).Value
End Sub
“`

4. 別シート指定とValue・Value2の注意点

VBAでセルの値を取得・入力するときに、初心者の方がつまずきやすいのが「どのシートのセルを操作しているか」という問題です。

標準モジュールに`Range(“A1”).Value = “入力”`と書いた場合、多くのケースでは現在アクティブになっているシートのA1セルが対象になります。

つまり、思っていたシートとは別のシートを開いている状態でマクロを実行すると、誤ったシートへ値を書き込む可能性があります。

実務用のマクロでは、できるだけ`Worksheets(“Sheet1”).Range(“A1”).Value`のように、ワークシートを明示する書き方が安全です。

“`vb
Sub 別シートの値を取得する()
Dim s As String

s = Worksheets(“Sheet1”).Range(“A1”).Value
Worksheets(“Sheet2”).Range(“A1”).Value = s
End Sub
“`

RangeとCellsを組み合わせるときの注意点

RangeとCellsを組み合わせる場合も、シート指定は両方に付けるのが重要です。

たとえば`Worksheets(“Sheet1”).Range(Cells(1, 1), Cells(10, 3))`のように書くと、一見Sheet1の範囲を指定しているように見えますが、内側のCellsがアクティブシートを参照してしまうことがあります。

安全に書くには、Withステートメントを使って、RangeとCellsの参照先を同じシートにそろえます。

ドットを付けた`.Range`や`.Cells`は、Withで指定したワークシートの中のセルを意味します。

“`vb
Sub シートを明示して範囲指定する()
With Worksheets(“Sheet1”)
.Range(.Cells(1, 1), .Cells(10, 3)).Value = “OK”
End With
End Sub
“`

ValueとValue2の違い

Valueと似たプロパティにValue2があります。

通常の文字列や数値を扱う範囲では、ValueとValue2の違いを強く意識する必要はありません。

ただし、日付や通貨のようなデータでは違いが出ることがあります。

Valueはセルの表示形式や内容に応じてDate型などとして値を返す場合がありますが、Value2は日付をExcel内部のシリアル値、つまり数値として返します。

日付として扱いたいならValueのほうが直感的ですが、大量データの転記や計算で型変換の影響を避けたい場合はValue2が使われることもあります。

まとめ:目的に合わせて使い分けよう

セルの値を扱うVBAでは、「何を取得したいのか」を明確にすることが大切です。

– セルに表示されている文字列が必要なら**Text**
– セルの計算結果や入力値が必要なら**Value**
– 数式そのものを扱うなら**Formula**

また、セルの指定方法も使い分けましょう。

– 固定セルなら**Range**
– 変数で行列を動かすなら**Cells**
– 可変範囲なら**RangeとCellsの組み合わせ**

さらに、別シートを扱う場合は**Worksheets**を明示し、アクティブシート依存を避けることで、保守しやすく安全なマクロになります。

これらのポイントを押さえれば、セルの値を扱うVBAコードがぐっと読みやすく、トラブルも減らせるはずです。

ぜひ実際に試しながら、自分のものにしていってください!

広告