VBAは、エクセル操作を自動化・プログラミング化できる
本サイトでは、プログラミングの基本を理解する事に重点をおいていたため、これまで構文や概念などの基礎を中心に説明してきました。
今回から、より実務で使えるVBAを紹介していきたいと思います。
そもそもエクセルVBAは、人間がマウスやキーボードでエクセルに対して操作してきた事の大半が、VBAを用いる事で実現可能です。
今回はエクセルのセルへ値を入力する方法について説明します。
VBAを使って、セルに値を入力する
それではセルへの入力方法を解説いたします。
以下にサンプルコードを用意しました。
Sub test22()
'セルA1に値を入力
Range("A1").Value = "AAA"
'セルA2(行2, 列1)に値を入力
Cells(2, 1) = "BBB"
'セルA3~A5に値を入力
Range("A3:A5").Value = "CCC"
'変数「ws」を「Worksheet型」で宣言
Dim ws As Worksheet
'変数「ws」に操作するシートをセットする
' ※この場合は「シート名:25」を指定
Set ws = Sheets("25")
'セルB1に値を入力
ws.Range("B1").Value = 10
'セルB2(行2, 列2)に値を入力
ws.Cells(2, 2) = 5
'セルB3~B5に値を入力
ws.Range("B3:B5").Value = 3
'セルC1~C5に値(数式)を入力
ws.Range("C1:C5") = "=B1*10"
End Sub
このサンプルコードを実行すると、画像1のような結果が得られます。
1つずつ解説していきます。
'セルA1に値を入力
Range("A1").Value = "AAA"
'セルA2(行2, 列1)に値を入力
Cells(2, 1) = "BBB"
'セルA3~A5に値を入力
Range("A3:A5").Value = "CCC"
こちらのコードでは、セルA1に「AAA」、セルA2に「BBB」を入力しています。
エクセルVBAには、標準モジュールである「Range」や「Cells」があります。
これらは「Rangeオブジェクト」の「Rangeプロパティ」「Cellsプロパティ」に該当します。
Rangeオブジェクト:Range
Rangeプロパティは、セルの範囲を指定します。
※「Range(“A1”)」や「Range(“A3:A5”)」
次にメソッドを指定します。
ドット(.)を入力すると、候補になるメソッドやプロパティが表示されます。
この中に「Value」というメソッドがあります。
こちらを指定して、値を代入するとか、そのセルの範囲に値が代入されます。
Rangeオブジェクト:Cells
Cellsプロパティは、セルの行番号と列番号を指定します。
Cells(<行番号>, <列番号>)
後はRangeプロパティと同じように「Value」メソッドを指定すれば、値を代入できます。
Worksheetオブジェクトで値を代入する
次にWorksheetオブジェクトを使った入力方法を說明します。
'変数「ws」を「Worksheet型」で宣言
Dim ws As Worksheet
'変数「ws」に操作するシートをセットする
' ※この場合は「シート名:25」を指定
Set ws = Sheets("25")
'セルB1に値を入力
ws.Range("B1").Value = 10
'セルB2(行2, 列2)に値を入力
ws.Cells(2, 2) = 5
'セルB3~B5に値を入力
ws.Range("B3:B5").Value = 3
基本はRangeオブジェクトと全く同じです。
違う点は、まずは「Worksheet型」で変数宣言します。
次にSETでWorksheet型で宣言した変数「ws」にオブジェクトを格納します。
この「Sheets(“25”)」は操作対象となるシート名を指定します。
このサンプルでは操作対象シート名が「25」になります。
Set <Worksheet型の変数> = Sheets(<シート名>)
後は変数「ws」にあるRangeプロパティを使います。
これは、RangeオブジェクトのRangeプロパティと全く同じです。
というのも、WorksheetオブジェクトのRangeプロパティは、Rangeオブジェクトを参照しているからです。
この辺は小難しいので、基本的に同じものと思っていただければ良いと思います。
数式も代入可能
最後に、C列1行目~5行目に数式を代入しています。
'セルC1~C5に値(数式)を入力
ws.Range("C1:C5") = "=B1*10"
この書き方では、C1~C5まで全てに「=B1*10」が代入されるのではなく、相対的に入力されます。
つまりセルC2には「=B2*10」が代入されます。
これは、C1に数式「=B1*10」が入力されていた際、同じように手動でC5までコピーすれば同じ結果になるのと同様です。
以上のように「Rangeオブジェクト」「Worksheetオブジェクト」を使うことで、エクセルのセルに値を代入する事が可能です。
オブジェクト | プロパティ |
---|---|
Worksheet | Range |
Worksheet | Cells |
Range | Range |
Range | Cells |
<補足情報>Worksheet・Rangeオブジェクトの使い分け
今回のサンプルでは、Worksheet・Rangeオブジェクト共に紹介しました。
これらの使い分けについてですが、大きな違いを見れば、Worksheetオブジェクトではシート名が指定できる点です。
エクセルには、アクティブという概念が存在します。
現在開いているシートがアクティブシートであり、現在選択されているセルがアクティブセルとなります。
Rangeオブジェクトでは、アクティブになっているシートが操作の対象です。
一方で、Worksheetオブジェクトは、アクティブでないシートも操作する事ができます。
その変わり、必ずオブジェクトをセットする必要がありますが、Rangeオブジェクトはオブジェクトをセットしなくても、そのまま手軽に使う事ができます。
書きやすさなどに合わせて、使い分ければ良いと思います。
RangeオブジェクトをSETした書き方
Sub test22a()
Dim r As Range
Set r = Range("D1")
'セルD1に「555」が入力される
r.Value = 555
End Sub