列番号を列符号に変換する関数
列符号を割り出す関数を作る
Split関数の挙動
セルのAddressプロパティを取得すると、例えばA1セルなら、「$A$1」という文字列が返る。
ということは、「$」をデリミタとしてSplit関数を使えば、列符号を表す「A」がSplit関数の返り値である配列のどこかに格納されるはずだ。
で、やってみた。
リスト1
Public Sub testSplitFunction() Dim arraySample As Variant arraySample = Split("$A$1", "$") '……(1)' Dim i As Integer For i = 0 To UBound(arraySample) Debug.Print i & " : "; arraySample(i) Next End Sub
(1)の
arraySample = Split("$A$1", "$")
では、Split関数を使って文字列「$A$1」を区切り文字(デリミタ)「$」で区切った結果を配列にして変数arraySampleにぶち込んでいる。
元の文字列がデリミタである「$」で始まっているこんなとき、返り値である配列はどうなるか。
こうなる。
配列の1つ目の要素(インデックス番号「0」)は「""」になるようだ。
したがって、Split関数の引数にセルのAddressプロパティを渡して、出来た配列の2番目の要素(インデックス番号「1」)が列符号を表す文字列になると分かる。
列番号を渡したら列符号を返す関数
作ってみた。
リスト2
Public Function getColumnLetter(ByVal columnNumber As Long) As String On Error GoTo errorHandler Dim Sh As Worksheet '……(1)' Set Sh = ActiveSheet Dim tmpStr As String tmpStr = Sh.Cells(1, columnNumber).Address '……(2)' Dim tmpArray As Variant tmpArray = Split(tmpStr, "$") '……(3)' getColumnLetter = tmpArray(1) '……(4)' Exit Function errorHandler: getColumnLetter = "" End Function
(1)からの2行、
Dim Sh As Worksheet Set Sh = ActiveSheet
は別になくてもいいんですが、裸で「Range(……)」とか、「Cells(……)」とか書くのがイヤだからこうしているだけです。
まあ、「そんなこと言うならApplicationオブジェクトから書けや!」とか言われるかも知れませんが。
(2)の
tmpStr = Sh.Cells(1, columnNumber).Address
では、引数で渡された列番号に相当する列の1行目のAddressプロパティの文字列を変数tmpStrにぶち込んでいる。
まあ、直接Split関数に渡してもいいんだが、可読性のためにこうしている。
(3)の
tmpArray = Split(tmpStr, "$")
で変数tmpArrayの2番目の要素、すなわち「tmpArray(1)」には列符号を表す文字列が入っているはずなので、
(4)の
getColumnLetter = tmpArray(1)
でtmpArray(1)を返り値にしてやる。
動作テスト
次のコードで実験。
Public Sub test() Debug.Print getColumnLetter(10000) End Sub
10000列目の符号をイミディエイト・ウインドウに表示するというだけ。
ほれ、この通り、「NTP」と表示されている(核不拡散条約かよwww←「NPT」な。)。
下の2行を見てもらったら、NTP列が10000列目であることも確認していただけよう。
おわりに
まあ、何に使うのかはよく分かりません。