まりふのひと

Excel VBA/Addressプロパティで列番号の数値⇔文字列変換関数を作った

 昨年6月に完成した‥‥かもVBA、リボンから起動するには

もうちょっとチェックが必要*1 かと、列番号の数値を文字に変換する関数を「この際作ろう」と思い、まずはGoogle先生に聞いてみた。

 Excelの列番号はA・B・C…で表しますが、VBAでセルを操作するとき、列を数値で指定したいこともあります。小さい数字なら、1 はA列、2 はB列と、脳内で変換することも簡単ですが、21や24など大きい数字の列番号となると、間違えやすくなりますね。
こんなときはAddressプロパティを使うと便利です。
 MsgBox Cells(1, 27).Address
を実行すると「$AA$1」のような文字列が返ります。
Addressプロパティには引数があり、行と列のそれぞれを、絶対参照または相対参照で表すことが可能です。
 MsgBox Cells(1, 27).Address(True, False)
を実行すると、「AA$1」のように行番号だけが絶対参照で表されます。
このアドレスは「$」より左側が列番号となっているので、次のようにすると列番号だけを取得できます。

Sub Sample2()
    Dim num As Long, buf As String
    num = InputBox("列の数字を入力してください")
    buf = Cells(1, num).Address(True, False)
    buf = Left(buf, InStr(buf, "$") - 1)
    MsgBox buf
End Sub

 コード記述時の言語で参照範囲を表す文字列型 (String) の値を返します。
構文
expression.Address (RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)

Set mc = Worksheets("Sheet1").Cells(1, 1) 
MsgBox mc.Address() ' $A$1 
MsgBox mc.Address(RowAbsolute:=False) ' $A1 
MsgBox mc.Address(ReferenceStyle:=xlR1C1) ' R1C1 
MsgBox mc.Address(ReferenceStyle:=xlR1C1, _ 
 RowAbsolute:=False, _ 
 ColumnAbsolute:=False, _ 
 RelativeTo:=Worksheets(1).Cells(3, 3)) ' R[-2]C[-2]


解ったこと
No コード 戻り値
1 Cells(1,1),Address $A$1
2 Cells(1,1),Address(False) $A1
3 Cells(1,1),Address(True,False) A$1
4 Cells(1,1),Address(ReferenceStyle:=xlR1C1) R1C1
完成したコード
01.Public Function get列記号(arg列番号 As Variant) As Variant
02.On Error GoTo Err_get列記号
03.Dim mbTitle As String
04.
05.    mbTitle = "get列記号/" & getMBTitle()
06.    If IsNumeric(arg列番号) Then
07.        STRAns = Cells(1, Val(arg列番号)).Address(True, False)
08.        get列記号 = Left(STRAns, InStr(STRAns, "$") - 1)
09.    Else
10.        STRAns = Range(arg列番号 & "1").Address(ReferenceStyle:=xlR1C1)
11.        get列記号 = Mid(STRAns, InStr(STRAns, "C") + 1)
12.    End If
13.    
14.Exit_get列記号:
15.    Exit Function
16.    
17.Err_get列記号:
18.    MsgBox "列番号の変換に失敗しました。" & vbCrLf _
19.            & "Excelの限界を超えている可能性があります。" & vbCrLf & vbCrLf _
20.            & " ◆列番号=" & arg列番号 _
21.            , vbCritical, mbTitle
22.'    Resume Exit_get列記号  'これがあるとDebugPrintで「Functionがない」となることが...
23.    
24.End Function

*1:シートに関係なく実行できるので