列番号を列符号に変換する関数

列符号を割り出す関数を作る

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にぶち込んでいる。

元の文字列がデリミタである「$」で始まっているこんなとき、返り値である配列はどうなるか。

f:id:akashi_keirin:20170827171408j:plain

こうなる。

配列の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列目の符号をイミディエイト・ウインドウに表示するというだけ。

f:id:akashi_keirin:20170827171419j:plain

ほれ、この通り、「NTP」と表示されている(核不拡散条約かよwww←「NPT」な。)。

下の2行を見てもらったら、NTP列が10000列目であることも確認していただけよう。

おわりに

まあ、何に使うのかはよく分かりません。

@akashi_keirin on Twitter