数値から列文字を調べる


3列目って何列ですか?C列ですよね。誰でも分かります。じゃ、13列目は?正解はM列です。私はこれ覚えています。VBAのベーシックセミナーで、ワークシートを横方向に操作するという練習問題を出します。そのとき、右端の列がM列なんです。いつもみんな指を折って数えますので「M列は13ですよ」と教えてあげます。じゃ、52列目は?98列目は?5,762列目は?今のワークシートは、XFD列まであります。これ16,384列目です。これだけの大きさになると、n列の列文字(AとかBとか)なんか、一発で分からないですよね。

でも、マクロでときどき、列の位置(数値)が分かって、その列の列文字(AとかBとか)を調べたいときがあります。こんなとき、どうしましょう。

ちなみに26列目までだったら、次のような考え方でも通用します。アルファベットの"A"は、文字コードが65です。

この65という数値が分かれば"A"を特定できます。A列は1列目です。つまり、列の位置に64を足した数が、求めるアルファベットになります。たとえば26列目だったら。

Sub Sample1()
    Dim N As Long
    N = 26
    MsgBox N & " → " & Chr(N + 64)
End Sub

でも、この考え方だと、AA列以降に対応できません。

Sub Sample2()
    Dim N As Long
    N = 27
    MsgBox N & " → " & Chr(N + 64)
End Sub

26列目がZなのですから、27列目はAA列です。こんなとき、簡単な方法があります。ここでは、キリのいい数値ということで、128列目を調べてみましょう。

128列目だったら、行はどこでもいいですから、たとえば次のようにして128列目のセルを特定できます。
Cells(1, 128)

このセルのアドレスを取得すればいいんです。Addressプロパティです。ただし、ここで工夫が必要です。列は相対参照形式で、つまり$をつけないで、対して行は絶対参照形式で$をつけて取得します。

Sub Sample3()
    Dim N As Long
    N = 128
    MsgBox Cells(1, N).Address(True, False)
End Sub

あ、ネタバレしちゃいましたね。128列目はDX列だそうです。さあ、この取得できた「DX$1」から"DX"だけを抜き出せばいいんです。簡単ですね。"$1"を消せばいいんです。

Sub Sample4()
    Dim N As Long
    N = 128
    MsgBox Replace(Cells(1, N).Address(True, False), "$1", "")
End Sub

Cells(1, N)と、自分で1行目を指定しているのですから、消すのは必ず"$1"になります。

あるいは、行も分からなかったら。あるいはそのつど変わるようなときは。そうなったらしかたありません。別の考え方をします。「DX$1」のうち"DX"だけということは、要するに$の手前まで抜き出せばいいです。こんなとき、$の位置を調べて…なんてやる必要はありません。$で区切ってやればいいんです。そう、Split関数で。

Sub Sample5()
    Dim N As Long, tmp As Variant
    N = 128
    tmp = Split(Cells(1, N).Address(True, False), "$")
    MsgBox tmp(0)
End Sub

まぁ、これで十分なんですけど、ちなみにバリアント型の変数を使わなくても、次のように書けます。

Sub Sample5()
    Dim N As Long
    N = 128
    MsgBox Split(Cells(1, N).Address(True, False), "$")(0)
End Sub