VBAでFor
ループを使い列を順番に処理する場合、Cells(行番号, 列番号)
のように、列を数値で扱うのが一般的です。しかし、処理の過程で「28番目の列」を「AB列」のように、見慣れたアルファベットの列名に変換したい場面が出てきます。
残念ながら、VBAにはこの変換を直接行うColumnNumberToLetter()
のような関数は用意されていません。しかし、セルの.Address
プロパティの特性を利用した簡単なテクニックで、この変換を実現できます。
この記事では、そのスマートな変換方法を、再利用しやすい関数として紹介します。
完成したVBAコード(再利用可能な関数)
以下が、列番号を引数として渡すと、対応する列名を返すFunction
(自作関数)です。この関数を標準モジュールにコピーしておけば、いつでも自分のマクロから呼び出して使えます。
' 列番号をアルファベットの列名に変換する関数
Function ConvertColumnNumberToLetter(ByVal colNumber As Long) As String
Dim result As String
' 列番号が有効な範囲内かチェック
If colNumber > 0 And colNumber <= Columns.Count Then
' .Addressプロパティを利用して列名を取得
result = Split(Cells(1, colNumber).Address, "$")(1)
Else
result = "Error"
End If
ConvertColumnNumberToLetter = result
End Function
' --- 上記関数の使い方を示すサンプルコード ---
Sub Demo_GetColumnLetter()
Dim columnNum As Long
Dim columnLetter As String
' 例1: 28番目の列名を取得
columnNum = 28
columnLetter = ConvertColumnNumberToLetter(columnNum)
MsgBox columnNum & "番目の列名は「" & columnLetter & "」です。" ' -> 結果: 「AB」
' 例2: 255番目の列名を取得
columnNum = 255
columnLetter = ConvertColumnNumberToLetter(columnNum)
MsgBox columnNum & "番目の列名は「" & columnLetter & "」です。" ' -> 結果: 「IU」
End Sub
コードのポイント解説(変換の仕組み)
このテクニックの核心部分は、Split(Cells(1, colNumber).Address, "$")(1)
という一行にあります。これを分解して見ていきましょう。
1. Cells(1, colNumber)
まず、変換したい列番号(colNumber
)を使い、その列のいずれかのセルを参照します。どの行でも良いため、一番シンプルな1
行目を指定します。例えばcolNumber
が28
なら、これはAB1
セルを指します。
2. .Address
次に、そのセルの.Address
プロパティを取得します。引数を省略した場合、このプロパティは絶対参照形式のセルアドレスを文字列として返します。 Cells(1, 28).Address
は、文字列 "$AB$1"
を返します。
3. Split(..., "$")
Split
関数を使い、取得した文字列"$AB$1"
を、区切り文字"$"
で分割します。これにより、以下の3つの要素を持つ配列が作成されます。
(0)
: “” (最初の$
の前なので空)(1)
: “AB”(2)
: “1”
4. (...)(1)
Split
で作成された配列は0から始まるため、その2番目(インデックス番号1
)の要素を取り出します。これが、目的の列名"AB"
となります。
この一連の流れにより、どんな列番号でもアルファベットの列名に変換できるのです。
まとめ
VBAで数値の列番号をアルファベットの列名に変換するには、直接的な関数はありませんが、.Address
プロパティとSplit
関数を組み合わせたトリックで簡単に実現できます。
Split(Cells(1, 列番号).Address, "$")(1)
この一行で変換できることを覚えておくと非常に便利です。今回紹介したFunction
を自分の標準モジュールに保存しておけば、様々なマクロ開発の場面で役立つでしょう。