web-dev-qa-db-ja.com

列番号を文字に変換する機能

誰かが数字から列の文字を返すことができるExcelのVBA関数を持っていますか?

たとえば、100と入力すると、CVが返されます。

127
mezamorphic

この関数は、与えられた列番号の列文字を返します。

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

100列目のテストコード

Sub Test()
    MsgBox Col_Letter(100)
End Sub
189
brettdj

範囲オブジェクトを使用したくない場合は、

Function ColumnLetter(ColumnNumber As Long) As String
    Dim n As Long
    Dim c As Byte
    Dim s As String

    n = ColumnNumber
    Do
        c = ((n - 1) Mod 26)
        s = Chr(c + 65) & s
        n = (n - c) \ 26
    Loop While n > 0
    ColumnLetter = s
End Function
80
robartsd

私のために働く何かは:

Cells(Row,Column).Address 

これにより、$ AE $ 1形式の参照が返されます。

42
Damian Fennelly

I'm surprised nobody suggested: **<code></code> <code>Columns(</code>***<code>Column Index</code>***<code>).Address</code> <code></code>**

  • たとえば、次のようになります。MsgBox Columns( 9347 ).Address戻り値 **<code>$MUM:$MUM</code>**

ONLY列文字(s):Split((Columns(Column Index).Address(,0)),":")(0)

  • たとえば、次のようになります。MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)戻り値 **<code>DAD</code>**

More Examples


18
ashleedawg

そして再帰を使った解決策:

Function ColumnNumberToLetter(iCol As Long) As String

    Dim lAlpha As Long
    Dim lRemainder As Long

    If iCol <= 26 Then
        ColumnNumberToLetter = Chr(iCol + 64)
    Else
        lRemainder = iCol Mod 26
        lAlpha = Int(iCol / 26)
        If lRemainder = 0 Then
            lRemainder = 26
            lAlpha = lAlpha - 1
        End If
        ColumnNumberToLetter = ColumnNumberToLetter(lAlpha) & Chr(lRemainder + 64)
    End If

End Function
16
Nikolay Ivanov

もう1つの方法です。 Brettdjの答え は私にこれを考えさせました、しかしあなたがこのメソッドを使うならあなたはバリアント配列を使う必要はない、あなたは直接文字列に行くことができます。

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")

またはこれでもう少しコンパクトにすることができます

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")

これは、cellsオブジェクトの1行目を参照していることにかかっていることに注意してください。

16
OSUZorba

これは式を使って利用できます。

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")

そのため、要求に応じてVBA関数として記述することもできます。

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
9

これは robartsdの答え のバージョンです( Jan Wijninckxの1行の解法 を使用)。ループの代わりに再帰を使用します。

Public Function ColumnLetter(Column As Integer) As String
    If Column < 1 Then Exit Function
    ColumnLetter = ColumnLetter(Int((Column - 1) / 26)) & Chr(((Column - 1) Mod 26) + Asc("A"))
End Function

私は以下の入力でこれをテストしました:

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""
8
alexanderbird

LATEST UPDATE:以下の関数は無視してください。@ SurasinTancharoenは、n = 53で破損していることを警告することができました。
興味がある人のために、n = 200のすぐ下に他の壊れた値を示します。

Certain values of

必要に応じて@brettdj関数を使用してください。MicrosoftExcelの最新の最大列数制限でも機能します:16384XFDを与える必要があります

enter image description here

更新終了


以下の機能はMicrosoftによって提供されます。

Function ConvertToLetter(iCol As Integer) As String
   Dim iAlpha As Integer
   Dim iRemainder As Integer
   iAlpha = Int(iCol / 27)
   iRemainder = iCol - (iAlpha * 26)
   If iAlpha > 0 Then
      ConvertToLetter = Chr(iAlpha + 64)
   End If
   If iRemainder > 0 Then
      ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
   End If
End Function

ソース: Excelの列番号をアルファベット文字に変換する方法

に適用されます

  • Microsoft OfficeExcel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
7
mtbink.com

robertsdのコード は洗練されていますが、将来を見据えて、nの宣言をlong型に変更します。

マクロの使用を避けるための式が欲しい場合は、ここで列702までを処理します。

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

a1は、文字に変換される列番号を含むセルです。

6
Jan Wijninckx

Excelの電源を使用する非常に簡単な方法があります。Range.Cells.Addressプロパティを使用します。

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

これにより、1行目の目的の列のアドレスが返されます。1のアドレスを使用してください。

strCol = Left(strCol, len(strCol) - 1)

非常に高速で強力なので、存在する場合でも列アドレスを返すことができます。

Selection.Columnプロパティを使用して、目的の列番号をlngRowに置き換えます。

3
flaviomorgado

これは上記の @ DamienFennellyの答え に基づく関数です。あなたが私に親指をあきらめたら、彼にも親指をあきらめなさい! :P

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function
3
BrettFromLA

これは、行Y、列Yにあるセルのthatに対して、1つのコード行のどの列に関係なく機能します。

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

一意の定義名 "Cellname"を持つセルがある場合

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
2
Codeplayer

これは、使うことができる簡単なワンライナーです。

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

これは1文字の列指定に対してのみ機能しますが、単純な場合には最適です。 2文字の指定だけで機能する必要がある場合は、次のものを使用できます。

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
2
Syd B

この式は範囲(すなわち、 A 1 )に基づいて列を与え、ここで範囲は単一セルである。複数セル範囲が指定されている場合は、左上のセルが返されます。両方のセル参照は同じである必要があります。

MID(CELL( "アドレス"、 A1 )、2、SEARCH( "$"、CELL( "アドレス"、 A1 )、 2)-2)

使い方:

CELL( "property"、 "range")は、使用されているプロパティに応じて範囲の特定の値を返します。この場合、セルアドレス。 addressプロパティは値$ [col] $ [row]、つまりA1 - > $ A $ 1を返します。 MID関数は、$記号間の列値を解析します。

1
Thom

1〜3文字の列の場合にInt()Ifを使用する単純化されたアプローチのために、これが遅い答えです。

Function outColLetterFromNumber(i As Integer) As String

    If i < 27 Then       'one-letter
        col = Chr(64 + i)
    ElseIf i < 677 Then  'two-letter
        col = Chr(64 + Int(i / 26)) & Chr(64 + i - (Int(i / 26) * 26))
    Else                 'three-letter
        col = Chr(64 + Int(i / 676)) & Chr(64 + Int(i - Int(i / 676) * 676) / 26)) & Chr(64 + i - (Int(i - Int(i / 676) * 676) / 26) * 26))
    End If

    outColLetterFromNumber = col

End Function
1
ib11

Brettdjによる解決策は素晴らしく機能しますが、私がそうであったのと同じ理由でこれを解決策の候補として遭遇したのであれば、私は私の代わりの解決策を提供すると思いました。

私が抱えていた問題は、MATCH()関数の出力に基づいて特定の列にスクロールすることでした。列番号をその列文字に平行に変換する代わりに、参照スタイルを一時的にA1からR1C1に切り替えることにしました。このようにして、VBA機能を使わずに列番号までスクロールできます。 2つの参照スタイルを簡単に切り替えるには、このVBAコードを使用します。

Sub toggle_reference_style()

If Application.ReferenceStyle = xlR1C1 Then
  Application.ReferenceStyle = xlA1
Else
  Application.ReferenceStyle = xlR1C1
End If

End Sub
1
Will Ediger

ここでは、Pascal(Delphi)の簡単な関数です。

function GetColLetterFromNum(Sheet : Variant; Col : Integer) : String;
begin
  Result := Sheet.Columns[Col].Address;  // from Col=100 --> '$CV:$CV'
  Result := Copy(Result, 2, Pos(':', Result) - 2);
end;
1
Jordi

Brettdjの答えをさらに進めて、ここでは列番号の入力をオプションにすることです。列番号の入力が省略された場合、関数はその関数を呼び出すセルの列文字を返します。これは単にColumnLetter(COLUMN())を使っても達成できることを私は知っていますが、私はそれが巧妙に理解することができればそれはいいだろうと思った。

Public Function ColumnLetter(Optional ColumnNumber As Long = 0) As String
    If ColumnNumber = 0 Then
        ColumnLetter = Split(Application.Caller.Address(True, False, xlA1), "$")(0)
    Else
        ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False, xlA1), "$")(0)
    End If
End Function

この関数のトレードオフは、IFテストのため、brettdjの答えよりもわずかに遅いということです。しかし、この機能が非常に長い間繰り返し使用されると、これを感じることができます。

1
Rosetta
Function fColLetter(iCol As Integer) As String
  On Error GoTo errLabel
  fColLetter = Split(Columns(lngCol).Address(, False), ":")(1)
  Exit Function
errLabel:
  fColLetter = "%ERR%"
End Function
1
Krzysztof
Sub GiveAddress()
    Dim Chara As String
    Chara = ""
    Dim Num As Integer
    Dim ColNum As Long
    ColNum = InputBox("Input the column number")

    Do
        If ColNum < 27 Then
            Chara = Chr(ColNum + 64) & Chara
            Exit Do
        Else
            Num = ColNum / 26
            If (Num * 26) > ColNum Then Num = Num - 1
            If (Num * 26) = ColNum Then Num = ((ColNum - 1) / 26) - 1
            Chara = Chr((ColNum - (26 * Num)) + 64) & Chara
            ColNum = Num
        End If
    Loop

    MsgBox "Address is '" & Chara & "'."
End Sub
0
Chetan V.

それで私はここのパーティーに遅れています、しかし私は誰もまだ演説していないそれが配列を含まないという別の答えを貢献したいです。簡単な文字列操作でそれを行うことができます。

Function ColLetter(Col_Index As Long) As String

    Dim ColumnLetter As String

    'Prevent errors; if you get back a number when expecting a letter, 
    '    you know you did something wrong.
    If Col_Index <= 0 Or Col_Index >= 16384 Then
        ColLetter = 0
        Exit Function
    End If

    ColumnLetter = ThisWorkbook.Sheets(1).Cells(1, Col_Index).Address     'Address in $A$1 format
    ColumnLetter = Mid(ColumnLetter, 2, InStr(2, ColumnLetter, "$") - 2)  'Extracts just the letter

    ColLetter = ColumnLetter
End Sub

$A$1の形式で入力した後、Mid関数を使用して、最初の$を計算するために位置2から開始します。次に、InStrを使用して2番目の$が文字列で現れる場所を見つけ、その開始を計算するために2 offを引きます。ポジション。

これにより、可能性のあるすべての列に適応できるという利点が得られます。したがって、ColLetter(1)は "A"を返し、ColLetter(16384)は "XFD"を返します。これは、私のExcelバージョンでは最後の列です。

0
SandPiper

列名を取得する簡単な方法

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

=)

0
cristobal