【Excel VBA】RangeとCellsを互いに変換させる方法

ExcelVBAヘッダー Excel VBA

ExcelVBAでセルを参照する方法は、2種類あります。

一つはRangeオブジェクト、もう一つはCellsプロパティです。

Rangeオブジェクトは、カッコの中にセルの番地である「A1」や「C8」と書きますので、Excelを使っていれば馴染みがあると思います。

Rangeオブジェクトは、セルの参照はもちろん、主に範囲指定したりする場合に使われることが多いようです。

Cellsプロパティは「行」、「列」の順で数値をカッコの中に書きます。

ループを使って、セルに対して何らかの処理をする場合や、配列を使った処理などにCellsプロパティが使われることが多いようです。

ExcelVBAでセル「A1」を選択する場合、RangeオブジェクトとCellsプロパティの使い方は下のとおりです。

ActiveSheet.Range("A1").Select
ActiveSheet.Cells(1,1).Select

結果はどちらも同じです。

個人的には、Cellsプロパティの方がよく使う気がします。

RangeからCellsへ変換する

Cellsプロパティを使うためには、「行」と「列」の情報が数値で必要になります。

あるオブジェクトの「行」情報を数値で取得するには、「Row」プロパティを使います。

また、あるオブジェクトの「列」情報を数値で取得するには、「Column」プロパティを使います。

この「Row」と「Column」を使って、RangeからCellsへ変換していきます。

Public Sub Sample()

    Dim lngRow As Long
    Dim lngColunn As Long
    
    lngRow = ActiveSheet.Range("A1").Row
    lngColunn = ActiveSheet.Range("A1").Column

    ActiveSheet.Cells(lngRow, lngColunn).Select
    
End Sub

上の例ではRangeオブジェクトを使ったセル番地「A1」の行と列を数値で取得、それを変数に入れています。

「Row」プロパティと「Column」プロパティの使い方が重要です。

その変数を使って、Cellsプロパティのカッコ内に行と列を指定しています。

こうすると、RangeオブジェクトからCellsプロパティへの変換ができます。

変数を使うと煩わしいので下のようなコードにすると、もっとスッキリします。

Public Sub Sample()

    With ActiveSheet
        .Cells(.Range("A1").Row, .Range("A1").Column).Select
    End With
    
End Sub

Withブロックを使い、見やすくするとともに、「Row」プロパティ、「Column」プロパティを直接Cellsプロパティのカッコ内で指定してしまっています。

ちょっとした工夫でグッとコードが読みやすくなります。

CellsからRangeへ変換する

CellsからRangeへ変換する場合は、Addressプロパティを使います。

Addressプロパティはセルの番地を取得するプロパティです。

下の記事で詳しく解説していますので、そちらもご覧ください。

【Excel VBA】セルの番地(Address)を取得する方法
ExcelVBAでセルの番地を取得するにはAddressプロパティを使います。計算式だったり、他のセルの値を参照したり、Excelを使っていれば、必ず意識するのがセルの番地です。ExcelVBAで、さまざまな形式でセルの番地を取得してみましょう。
Public Sub Sample()

    Dim strAddress As String
    
    strAddress = ActiveSheet.Cells(1, 1).Address
    ActiveSheet.Range(strAddress).Select
    
End Sub

上の例では、まずAddressプロパティを使ってセルの番地「A1」を文字列変数に入れています。

実際には、変数「strAddress」には「$A$1」という文字列が入っています。

そして、変数「strAddress」を使って、Rangeオブジェクトでセルを選択しているというわけです。

変数を使わないでコーディングすると下のようになります。

Public Sub Sample()

    With ActiveSheet
        .Range(.Cells(1, 1).Address).Select
    End With
    
End Sub

範囲指定する場合は下のように書くとよいでしょう。

Public Sub Sample()

    With ActiveSheet
        .Range(.Cells(1, 1).Address & ":" & .Cells(5, 5).Address).Select
    End With
    
End Sub

こうすると、セル「A1」からセル「E5」までが範囲選択された状態になります。

ExcelVBAでマクロを作っているとRangeオブジェクトだと都合が悪かったり、Cellsプロパティだと都合が悪かったりする時があります。

そんな時は、うまく臨機応変にRangeオブジェクトとCellsプロパティを互いに変換させて壁を乗り越えていきましょう。

タイトルとURLをコピーしました