■ セルの参照をマスターしよう!
ExcelでVBAを使用するメリットの最たるものは、なんといってもVBAから直接「セル」を操作できることでしょう。これによって、ワークシート上にある様々なデータを取得し、VBAで加工して利用することが可能になります。
今回から、数回にわたってワークシート上のセルを操作するExcel VBAについて解説を行います。これをマスターすることで、現在仕事で使っているワークシートを業務用のアプリケーションとして、利用することができるようになります。
セルを参照する
Excel VBAには、セルを参照する様々な方法が用意されています。これらを使用することで、ワークシートの中の目的のセル、またはセル範囲を自由に参照し、利用することが可能になります。
■Rangeプロパティを使用してセルを参照する
セルを参照するには、Rangeプロパティを使用して、Rangeオブジェクトを取得します。
[書式]
オブジェクト.Range(セル範囲)
または
オブジェクト.Range(開始セル, 終了セル)
オブジェクトにはApplicationオブジェクト、Worksheetオブジェクト、Rangeオブジェクトを指定します。省略した場合は、アクティブシートが対象になります。
セル範囲には、セル範囲を表すA1形式の文字列を、開始セルにはセル範囲の左上端セルを、終了セルには右下端セルをそれぞれ指定します。
(注意)
オブジェクトを省略する場合は、操作の対象となるワークシートをあらかじめアクティブにしておく必要があります。
例:
Range("A1").Select
Worksheets("Sheet1").Range("A1").Select
上の例ではアクティブシートの「A1」セルを、下の例では「Sheet1」シートの「A1」セルをRangeオブジェクトのSelectメソッドでそれぞれ選択します。 |
Rangeオブジェクトとして取得するセル範囲の指定には、他にも様々な記述があります。
指定例 |
参照するセル |
備考 |
Range("A1") |
「A1」セル |
単一のセル |
Range("A1,C5") |
「A1」セルと「C5」セル |
複数の単一セル |
Range("A1","C5")
Range("A1:C5") |
「A1〜C5」セル |
セル範囲 |
Range("A1:C5,E1:G5") |
「A1〜C5」セルと「E1〜G5」セル |
複数のセル範囲 |
Range("A:C") |
「A〜C」列 |
列範囲 |
Range("1:5") |
「1〜5」行 |
行範囲 |
■Cellsプロパティを使用してセルを参照する
単一のセルを参照する場合、Cellsプロパティを使用してRangeオブジェクトを取得することができます。
[書式]
オブジェクト.Cells(行番号, 列番号)
オブジェクトにはApplicationオブジェクト、Worksheetオブジェクト、Rangeオブジェクトを指定します。省略した場合は、アクティブシートが対象になります。
行番号には、対象となるセルの行番号を、列番号には列番号を指定します。列番号には「"A"」のように、ダブルクォーテーションで囲んで、列名をアルファベットで指定することもできます。
(注意)
セルの指定方法は通常、「A1」のように「列、行」の順番で行いますが、Cellsプロパティでは「行、列」の順番で行います。行と列の指定する順番が逆になるので注意してください。
例:
Cells(5, 1).Select
Cells(5, "A").Select
この例ではどちらも、アクティブシートの「A5」セルを選択します。 |
※ ワークシートの列番号を調べるには、[ツール]メニューの[オプション]より、[全般]タブを選択、[R1C1参照形式を使用する]にチェックを入れることで、シートの列番号を数値で表示させることが可能です。
※ Cellsプロパティの引数を省略した場合、すべてのセルを参照することができます。例えば、「Cells.Select」と記述すると、アクティブシートのすべてのセルを選択します。
■RangeプロパティとCellsプロパティを組み合わせて使用する
CellsプロパティをRangeプロパティと組み合わせて使用することで、セル範囲を参照することができるようになります。
[書式]
オブジェクト.Range(Cells(開始行番号, 開始列番号), Cells(終了行番号, 終了列番号))
開始行番号・開始列番号には、セル範囲の左上端のセルの行番号と列番号を、終了行番号・終了列番号には、セル範囲の右下端のセルの行番号と列番号を、それぞれ指定します。
例:
Range(Cells(1, 1), Cells(5, 3)).Select
Range(Cells(1, "A"), Cells(5, "C")).Select
この例ではどちらも、アクティブシートの「A1〜C5」のセル範囲を選択します。 |
■その他のセル、セル範囲の指定方法
・[]を使ってセル範囲を参照する。
例:
[A1].Value = "Sample"
[A1:C5].Value = "Sample"
上の例ではアクティブシートの「A1」セルに、下の例ではアクティブシートの「A1〜C5」のセル範囲に、それぞれ「Sample」の文字列を設定します。 |
・インデックス番号を使用してセルを参照する。
例:
Cells(1).Select
Cells(257).Select
Excel2003までのバージョンでは、上の例では「A1」セルを、下の例では「A2」セルを、それぞれ参照します。 |
■セルのアドレスを指定せずに、セルを参照する方法
セルのアドレスを明示的に指定できないケースで、あるセルから相対的に位置を指定してセルを参照したり、特定の条件をもつセルを参照したりすることができます。
・Offsetプロパティ
あるセルから相対的に指定した位置にある、セルの参照を取得できます。
[書式]
オブジェクト.Offset(行方向, 列方向)
オブジェクトにはRangeオブジェクトを指定します。
行方向には参照したいセルに対するアクティブセルからの行数を、列方向には参照したいセルに対するアクティブセルからの列数を、それぞれ指定します。
例:
Range("A1").Offset(1, 1).Select
Range("A1").Offset(1, 2).Select
上の例ではアクティブシートの「B2」セルを、下の例では「C2」セルを、それぞれ選択します。 |
・CurrentRegionプロパティ
指定したセルを含む、表全体を参照します。このとき選択されるセル範囲を「アクティブセル領域」といいます。アクティブセル領域とは、キーボードで[Ctrl]+[*]キーを押したときに選択されるセル領域です。
[書式]
オブジェクト.CurrentRegion
オブジェクトにはRangeオブジェクトを指定します。
例:
Range("A1").CurrentRegion.Select
この例では、アクティブシートの「A1〜C3」のセル範囲にデータが格納されている場合、「A1〜C3」のセル範囲を選択します。 |
・Endプロパティ
データの入力されているセル領域の終端セルを参照します。
[書式]
オブジェクト.End(参照方向)
オブジェクトにはRangeオブジェクトを指定します。
参照方向には、次のXlDirectionクラスの定数で、参照する方向を指定します。
定数 |
参照方向 |
定数 |
参照方向 |
xlUp |
上端 |
xlToRight |
右端 |
xlDown |
下端 |
xlToLeft |
左端 |
例:
Range("B2").End(xlUp).Select
Range("B2").End(xlDown).Select
Range("B2").End(xlToRight).Select
Range("B2").End(xlToLeft).Select
この例では、アクティブシートの「A1〜C3」のセル範囲にデータが格納されているものとします。「xlUp」を引数に指定した場合「B1」セルを、「xlDown」を引数に指定した場合「B3」セルを、「xlToRight」を引数に指定した場合「C2」セルを、「xlToLeft」を引数に指定した場合「A2」セルを、それぞれ選択します。 |
※ Endプロパティでは、基準となるセルと終端セルの間に空白のセルがある場合、空白のセルの1つ手前のセルを取得します。表の最終行のセルを参照したい場合、「xlDown」を引数に指定するのではなく、「xlUp」を引数に指定し、最下行からセルを参照します。例えば「Range("A65536").End(xlUp).Select」ならば、A列の最下行の65536行(Excel2007の場合は1048576行を指定)からデータの入力されている上端のセルを参照することができます。この場合、データが格納されているセル範囲が「A1〜C3」ならば、「A3」セルを選択します。
・SpecialCellsメソッド
指定したセル範囲の中で、条件を満たすすべてのセルを参照します。
[書式]
オブジェクト.SpecialCells(セル種類, 値)
オブジェクトにはRangeオブジェクトを指定します。
セル種類には、次のXlCellTypeクラスの定数を指定します。
定数 |
内容 |
xlCellTypeAllFormatConditions |
表示形式が設定されているセル |
xlCellTypeAllValidation |
条件の設定が含まれているセル |
xlCellTypeBlanks |
空の文字列 |
xlCellTypeComments |
コメントが含まれているセル |
xlCellTypeConstants |
定数が含まれているセル |
xlCellTypeFormulas |
数式が含まれているセル |
xlCellTypeLastCell |
使われたセル範囲内の最後のセル |
xlCellTypeSameFormatConditions |
同じ表示形式が設定されているセル |
xlCellTypeSameValidation |
同じ条件の設定が含まれているセル |
xlCellTypeVisible |
すべての可視セル |
値には、次のXlSpecialCellsValuesクラスの定数を使用します。セルの種類にxlCellTypeConstantsまたは xlCellTypeFormulasを指定したとき、特定の種類の定数や数式を含むセルを参照するときに使用します。
定数 |
内容 |
定数 |
内容 |
xlErrors |
エラー値 |
xlNumbers |
数値 |
xlLogical |
論理値 |
xlTextValues |
文字 |
※ 複数の値を+演算子を使用して指定すると、複数の種類の定数や数式を指定することができます。また省略した場合、すべての定数および数式を対象にします。
例:
Range("A1:C3").SpecialCells(xlCellTypeBlanks).Select
Debug.Print Range("A1:C3").SpecialCells(xlCellTypeBlanks).Count
上の例では、アクティブシートの「A1〜C3」のセル範囲にあるすべての空白のセルを選択します。下の例では、空白のセルの個数を、イミディエイトウィンドウに出力します。 |
(注意)セル範囲にSpecialCellsメソッドで指定したセルがない場合、実行時エラーが発生するので注意してください。
・Selectionプロパティ、ActiveCellプロパティ
現在選択されているセル、またはセル範囲を参照します。
[書式]
オブジェクト.Selection
オブジェクト.ActiveCell
オブジェクトにはApplicationオブジェクト、またはWindowオブジェクトを指定します。省略した場合は、アクティブウィンドウが対象となります。
例:
Sub Test()
Range("A1:C3").Select
Debug.Print Selection.Address
Range("A2").Activate
ActiveCell.Value = "Sample"
End Sub
このプロシージャを実行すると、アクティブシートの「A1〜C3」のセル範囲を選択し、イミディエイトウィンドウに「$A$1:$C$3」を出力した後、「A2」セルに「Sample」の文字列を設定します。 |
※ 単一のセルを選択した場合、SelectionプロパティとActiveCellプロパティは同一のセルを参照します。セル範囲を選択した場合、Selectionプロパティは選択したセル範囲全体を、ActiveCellプロパティはアクティブセル(選択したセル範囲で色の付いていないセル)を参照します。
■セルに名前を定義する
・Nameプロパティ
セルやセル範囲に名前を設定するにはRangeオブジェクトのNameプロパティを使用します。セル範囲に名前を付けることで、セル範囲の指定が簡単になります。
[書式]
オブジェクト.Name = 値
オブジェクトにはRangeオブジェクトを指定します。
値にはセル範囲に付ける名前を指定します。
例:
Sub Test()
Range("A10").Name = "合計1"
Range("A11").Name = "合計2"
Range("A12").Name = "合計3"
Range("合計1").Select
End Sub
このプロシージャを実行すると、アクティブシートの「A10」セルの名前が「合計1」に、「A11」セルの名前が「合計2」に、「A12」セルの名前が「合計3」に定義されます。次に、定義した名前の「合計1」を使用してセルを選択します。「合計1」という名前が付いた「A10」セルが選択されます。 |
・Namesプロパティ
セルやセル範囲に付けられた名前を参照するにはWorkbookオブジェクトのNamesプロパティを使用します。また名前を削除するにはDeleteメソッドを使用します。
[書式]
オブジェクト.Names(名前)
オブジェクトには、Applicationオブジェクト、Workbookオブジェクトを指定します。省略すると作業中のブックが対象となります。
名前には、定義した名前のインデックス番号または名前そのものを指定します。
例:
Sub Test()
Dim o As Object
For Each o In ActiveWorkbook.Names
Debug.Print o.Name & Space(2) & o.RefersTo
Next
End Sub
このプロシージャを実行すると、アクティブブックに定義されたセルの名前の一覧をイミディエイトウィンドウに出力します。「Sheet1」シートの「A10」セルに「合計1」、「A11」セルに「合計2」、「A12」セルに「合計3」の名前が定義されている場合、次の結果が出力されます。
合計1 =Sheet1!$A$10
合計2 =Sheet1!$A$11
合計3 =Sheet1!$A$12 |
またコードの最後に「ActiveWorkbook.Names("合計3").Delete」の記述を追加すると、「A12」セルに定義された名前「合計3」が削除されます。 |
以上、セルを参照するいろいろな方法について解説しました。
目的のセル範囲を自由に操作するためには、そのセル範囲を正確に参照する操作が必要不可欠です。そのためには、今回の解説について十分な理解をしている必要があります。
次は、セルを選択する様々な方法について詳しく解説を行います。
|