1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ExcelVBA】列番号を変換する関数を自作してみた(R1C1形式<->A1形式)

Posted at

はじめに

ExcelVBA上では、1~Nの整数で表される列番号(R1C1形式)を用いることが多いですが、ユーザーが見ているExcelの画面上ではA, B, C, ..., AA, AB, ...というアルファベットで表される列番号(A1形式)が表示されていることが多いです。
(※表示をA1形式からR1C1形式に変えることも可能です)

そこで今回は学習目的で、R1C1形式とA1形式の列番号を(力任せで)相互に変換出来る関数を自作してみました。

また、INDIRECT関数やADDRESS関数などを使うともっとスッキリ変換出来るので、実用上はこちらの記事の方法を参考にされた方が良いと思います。

列番号(R1C1形式) 列番号(A1形式)
1 A
2 B
3 C
... ...
26 Z
27 AA
... ...
52 AZ
53 BA
... ...

作成した関数

  • ASCIIコード表では、A~Zの大文字のアルファベットが10進数だと65~90で表されています。
  • そこでChr関数を使って、列番号の数字をアルファベットに変換する処理を作ってみました。
    • 列番号が27以上の時は再帰処理を使ってA1形式の列番号を組み立てていますが、再帰を使わない方がより効率的な処理になると思います。

R1C1形式->A1形式に変換する関数

R1C1形式->A1形式
'--------------------------------------------------------------------------------
' Excelの列番号をR1C1形式からA1形式に変換する。
'
' r1c1ColIdx:R1C1形式の列番号。
' return:Excelのバージョン。
'--------------------------------------------------------------------------------
Public Function ToA1(r1c1ColIdx As Long) As String
    Dim remainder As Integer, quotinent As Long
    remainder = (r1c1ColIdx - 1) Mod 26
    quotinent = Int((r1c1ColIdx - 1) / 26)  ' 除算の結果が小数になるケースがあるため、Int関数で切り捨てる
    
    If (quotinent > 0) Then
        ToA1 = ToA1(quotinent) + ToColAlphabet(remainder)
    Else
        ToA1 = ToColAlphabet(remainder)
    End If
End Function

'--------------------------------------------------------------------------------
' 1~26の整数を、A~Zのアルファベットに変換する。
'
' idx:1~26の整数。
' return:A~Zのアルファベット。
'--------------------------------------------------------------------------------
Private Function ToColAlphabet(idx As Integer) As String
    ToColAlphabet = Chr(idx + 65) ' Chr(65)は'A'となる。
End Function
テストコード
Public Sub TestToA1()
    Debug.Print "列番号1:", ToA1(1) ' A
    Debug.Print "列番号26:", ToA1(26) ' Z
    Debug.Print "列番号27:", ToA1(27) ' AA
    Debug.Print "列番号52:", ToA1(52) ' AZ
    Debug.Print "列番号53:", ToA1(53) ' BA
    Debug.Print "列番号78:", ToA1(78) ' BZ
    Debug.Print "列番号79:", ToA1(79) ' CA
End Sub
テストコードの実行結果
列番号1:     A
列番号26:    Z
列番号27:    AA
列番号52:    AZ
列番号53:    BA
列番号78:    BZ
列番号79:    CA

A1形式->R1C1形式に変換する関数

  • R1C1形式->A1形式の変換の逆の処理を行うため、Asc関数を使ってアルファベットをASCIIコードに変換し、ASCIIコードから列番号を作り出しています。
A1形式->R1C1形式
'--------------------------------------------------------------------------------
' Excelの列番号をA1形式からR1C1形式に変換する。
'
' a1ColIdx:A1形式の列番号。
' return:Excelのバージョン。
'--------------------------------------------------------------------------------
Public Function ToR1C1(a1ColIdx As String) As Long
    Dim substr As String
    substr = a1ColIdx
    
    Dim i As Integer
    
    For i = 1 To Len(a1ColIdx)
        If (i = 1) Then
            ToR1C1 = ToR1C1 + ToColNumber(Right(substr, 1))
        Else
            ToR1C1 = ToR1C1 + (ToColNumber(Right(substr, 1)) * (i - 1) * 26)
        End If
        substr = Left(substr, Len(substr) - 1)
    Next i
End Function

'--------------------------------------------------------------------------------
' A~Zのアルファベットを、1~26の整数に変換する。
'
' idx:A~Zのアルファベット。
' return:1~26の整数。
'--------------------------------------------------------------------------------
Private Function ToColNumber(idx As String) As Integer
    ToColNumber = Asc(idx) - 65 + 1 ' Asc("A")は65となる。
End Function
テストコード
Public Sub TestToR1C1()
    Debug.Print "列番号A:", ToR1C1("A") ' 1
    Debug.Print "列番号Z:", ToR1C1("Z") ' 26
    Debug.Print "列番号AA:", ToR1C1("AA") ' 27
    Debug.Print "列番号AZ:", ToR1C1("AZ") ' 52
    Debug.Print "列番号BA:", ToR1C1("BA") ' 53
    Debug.Print "列番号BZ:", ToR1C1("BZ") ' 78
    Debug.Print "列番号CA:", ToR1C1("CA") ' 79
End Sub
テストコードの実行結果
列番号A:      1 
列番号Z:      26 
列番号AA:     27 
列番号AZ:     52 
列番号BA:     53 
列番号BZ:     78 
列番号CA:     79 

参考URL

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?