この記事を読むのに必要な時間は約 5 分です。
A1のようなRangeの座標を、Cells(1,1)に変換するにはどうすればいいか。
また、CellsからRangeにどうやって変換すればいいのか、先日Grepの記事を書いていて悩みました。
上の記事ではShift_JISの文字コードを変換するという、とてもメンドクサイやり方をしていましたが、今回はもっと楽なやり方もあわせて紹介します。
目次(リンク)
A1⇒1,1 のように、RangeからCellsに変換
まずは、RangeからCellsへの変換です。
Range(“A1”)の後に行番号と列番号をそれぞれ取得できるプロパティを使います。
- .Rowなら行番号
- .Columnなら行番号
Rangeの場合は、「A1」のように列→行の順で書きます。
Cellsは逆に、行→列の順で、かっこ「()」の中にカンマ区切りで書きます。
具体的にはこんな感じ。
1 2 3 4 5 6 7 8 |
'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」と表示されました。
1,1⇒A1のように、CellsからRangeに変換
次はCellsからRangeへの変換です。
最初は楽なやり方、もう1つはメンドクサイやり方です。
めんどうなほうも、知っておいたら役に立つかもしれません。
Addressプロパティを使って変換
Addressプロパティを使うと、Rangeの「A1」のような値を簡単に取得できてしまいます。
やり方は、Cells(1,1)の後に、.Addressを付けるだけ!!
引数によって「$」が付いたりつかなかったりします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
'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を書きます。
Chrで文字コード変換
Chrを使うと、Shift_JISの文字コードを文字に変換することが出来ます。
例えば、半角数字の「1」はShift_JISでは49、半角の「A」は65です。
Chrを利用して、CellsからRangeに変換するとなると・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
'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」。
ちゃんと変換できてそうです。
でも、たまたま上手く出来ただけなんじゃないの?と思うかもしれません。
もう少し大きいCellsの数字を変換してみたいと思います。
Cells(10, 10)、Cells(100, 100)を変換したところ、Addressプロパティと同じ結果になりました。
まとめ:Rangeの座標をCellsに変換する方法
RangeをCellsに変換する方法と、その逆にCellsからRangeに変換する方法も紹介しました。
- RangeからCellsに変換するには、.Rowと.Column
- CellsからRangeに変換するには、.Address(False, False)
- 文字コードの変換を使うやり方はめんどくさい
ExcelファイルのGrepについて紹介した記事では、なんで面倒なやり方をしてしまっていたのか自分でも謎でした。
でもきっと、今回の記事を書くためだったのかもしれません。
遠回りも無駄ではないってことですね。
最後までお読みいただき、ありがとうございました。