VBA_RangeとCellsを相互変換

この記事を読むのに必要な時間は約 9 分です。

 

A1のようなRangeの座標を、Cells(1,1)に変換するにはどうすればいいか。

 

また、CellsからRangeにどうやって変換すればいいのか、先日Grepの記事を書いていて悩みました。

 

上の記事ではShift_JISの文字コードを変換するという、とてもメンドクサイやり方をしていましたが、今回はもっと楽なやり方もあわせて紹介します。

スポンサーリンク

A1⇒1,1 のように、RangeからCellsに変換

まずは、RangeからCellsへの変換です。

 

Range(“A1”)の後に行番号と列番号をそれぞれ取得できるプロパティを使います。

 

  • .Rowなら行番号
  • .Columnなら行番号

 

Rangeの場合は、「A1」のように列→行の順で書きます。
Cellsは逆に、行→列の順で、かっこ「()」の中にカンマ区切りで書きます。

 

具体的にはこんな感じ。

'RangeからCellsに変換
Sub changeRangeToCells()
    
    Debug.Print Range("A1").Row & "," & Range("A1").Column
    
    Debug.Print Range("$A$1").Row & "," & Range("$A$1").Column
        
End Sub

 

実行すると、通常のセル参照も固定する絶対参照も、どちらのやり方でもイミディエイトウィンドウに「1,1」と表示されました。

VBA_Range_Cells変換

1,1⇒A1のように、CellsからRangeに変換

次はCellsからRangeへの変換です。

 

最初は楽なやり方、もう1つはメンドクサイやり方です。
めんどうなほうも、知っておいたら役に立つかもしれません。

Addressプロパティを使って変換

Addressプロパティを使うと、Rangeの「A1」のような値を簡単に取得できてしまいます。

 

やり方は、Cells(1,1)の後に、.Addressを付けるだけ!!
引数によって「$」が付いたりつかなかったりします。

'CellsからRangeに変換
Sub changeCellsToRange()
    
    'A1
    Debug.Print Cells(1, 1).Address(False, False)
    
    '$A1
    Debug.Print Cells(1, 1).Address(False, True)
    
    'A$1
    Debug.Print Cells(1, 1).Address(True, False)
    
    '$A$1
    Debug.Print Cells(1, 1).Address(True, True)
    
    '$A$1
    Debug.Print Cells(1, 1).Address
    
End Sub

 

実行してみると、下図のようになります。

 

引数を省略した場合と、どちらもTrueにした場合が同じ結果になりました。
省略しない場合は、Address(行番号の「$」用, 列番号の「$」用)でTrueかFalseを書きます。

VBA_Range_Cells変換

Chrで文字コード変換

Chrを使うと、Shift_JISの文字コードを文字に変換することが出来ます。

 

例えば、半角数字の「1」はShift_JISでは49、半角の「A」は65です。

 

Chrを利用して、CellsからRangeに変換するとなると・・・

'RangeからCellsに変換
Private Sub changeRangeToCellsAsc()

    '1,1 ⇒ A1
    Debug.Print convertRange(1) & 1

End Sub

'セルの位置を変換
Private Function convertRange(ByVal lCol As Long) As String
    convertRange = ""
    
    Dim lTmpCol As Long
    Dim lBuf As Long
    Dim sAsc As Long
    sAsc = 64
    
    If Len(lCol) = 0 Then Exit Function
    
    lTmpCol = lCol
    
    '1桁目を変換
    lBuf = sAsc + lTmpCol Mod 26
        
    convertRange = Chr(lBuf)
    
    lTmpCol = lTmpCol \ 26
    
    '2桁目を変換
    If lTmpCol Mod 26 >= 1 Then
        
        lBuf = sAsc + lTmpCol Mod 26
        convertRange = Chr(lBuf) & convertRange
        
    End If
    
    '3桁目を変換
    If lTmpCol \ 26 >= 1 Then
    
        lBuf = sAsc + lTmpCol \ 26
        convertRange = Chr(lBuf) & convertRange
        
    End If
 
End Function

 

無駄に長いソースコードになりました。

 

Debug.Printを実行した結果は「A1」。
ちゃんと変換できてそうです。

VBA_Range_Cells変換

 

でも、たまたま上手く出来ただけなんじゃないの?と思うかもしれません。

 

もう少し大きいCellsの数字を変換してみたいと思います。

 

Cells(10, 10)、Cells(100, 100)を変換したところ、Addressプロパティと同じ結果になりました。

VBA_Range_Cells変換

スポンサーリンク

まとめ:Rangeの座標をCellsに変換する方法

RangeをCellsに変換する方法と、その逆にCellsからRangeに変換する方法も紹介しました。

 

  • RangeからCellsに変換するには、.Rowと.Column
  • CellsからRangeに変換するには、.Address(False, False)
  • 文字コードの変換を使うやり方はめんどくさい

 

ExcelファイルのGrepについて紹介した記事では、なんで面倒なやり方をしてしまっていたのか自分でも謎でした。

 

でもきっと、今回の記事を書くためだったのかもしれません。
遠回りも無駄ではないってことですね。

 

最後までお読みいただき、ありがとうございました。