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