列番号を文字に変換する関数?


143

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

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



@FrancisDeanは、番号から住所を探すこの質問の逆です
brettdj '29

2
@brettdjリンクされた回答は、数字と文字、および文字と数字の両方を示しています。
フランシスディーン

2
@FrancisDeanの公平な点、私はリンクの質問のタイトルを、受け入れられた回答ではなく、リンクで調べました
brettdj

回答:


211

この関数は、指定された列番号の列文字を返します。

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

9
(0)変数宣言と追加のコード行を保存したい場合は、Splitコマンドの最後にを追加できます。例Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
Caltor、2015

3
それは正しいですが、数行使用する方が読みやすいと思いました。
brettdj

6
なぜこのような状況でブールパラメータに悩むのか。あなたはこれを行うことができます:............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Excelヒーロー

1
これは非常に古いですが、マイナーな追加があります。最初に数値が正かどうかをチェックします。そうでなければ、エラーが発生します。lngcol <= 0の場合
Selkie

1
VBS .Cellsを使用する場合、これはExcelのプロパティであり、を使用する必要があることを覚えておいてください<excel_object>.Cells()。そうしないと、型の不一致エラーが発生します。
Stevoisiak 2017

88

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

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

1
あなたがに基づいてループを長くする方法を掲示する理由は明らかではない:あなたはかなりの範囲のオブジェクトを使用したくない場合
brettdj

29
@brettdj私はいくつかの理由を想像できます:1)このメソッドは私のテストで約6倍高速です2)Excel APIへのアクセスを必要としない3)おそらくメモリフットプリントが小さいです。編集:また、なぜ私が1年以上前の答えにコメントしたのかわかりません:S
ブラックホーク

6
ただし、速度の向上には欠点があります。範囲オブジェクトを使用すると、無効な列番号を渡すとエラーがスローされます。Excel 2003をまだ使用している場合でも機能します。そのような例外が必要な場合は、rangeメソッドを使用してください。それ以外の場合は、robartsdを称賛します。
エンジニアトースト

6
IF ColumnNumber <= Columns.Countバージョンに関する想定を避ける方が良いでしょう。
brettdj

1
このコードを使用するもう1つの理由は、VBAではなくVB、.netなどにいる場合です
Maury Markowitz


33

誰も提案していないことに驚いています:** <code> </ code> <code> Columns(</ code> *** <code> Column Index </ code> *** <code>)。Address </ code> <code> </ code> **

  • 例:を MsgBox Columns( 9347 ).Address 返します ** <code> $ MUM:$ MUM </ code> **

列文字のみを返すにはSplit((Columns(Column Index).Address(,0)),":")(0)

  • 例:を MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) 返します ** <code> DAD </ code> **

  その他の例



これはOffice 365で私のために機能します:string col = Worksheet.Columns [column] .Address; col.Substring(col.IndexOf( ":")+ 2);を返します。何らかの理由で、Range = Worksheet.Cells [1、column]などの他の式がエラーをスローしていました(Cells呼び出しで、またはアドレスを取得しようとしたときに、覚えられません-すみません-どの行でどこにスローしたか特定のケース)
Sam Azer、

19

これを行うもう1つの方法です。Brettdjの答えは私にこれを思い起こさせましたが、この方法を使用する場合、バリアント配列を使用する必要はなく、直接文字列に移動できます。

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

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

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

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


18

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

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

676より大きい数値を変換するのに最適なカットアンドペースト。ありがとうございます。
David Krider 2014

1
残りが26を超えることは決してないので、なぜ長整数ではなく整数でないのですか?
Caltor、2015

10
@Caltorたとえば、APIを要求するAPIを呼び出すなど、Integerを使用する特別な目的がない限り、LongよりもIntegerを選択しないでください。VBAはLong向けに最適化されています。VBAは整数よりも高速にLongを処理します。
Excelヒーロー

1
@ExcelHero知らなかった。LongはIntegerよりも多くのメモリを必要としませんか?
Caltor、2015

6
@Caltor Indeed Longは32ビット、Integerは16ビットですが、現代のコンピューティングではそれは問題になりません。25年前...それは非常に重要でした。しかし、今日(15年前であっても)違いはまったく重要ではありません。
Excelヒーロー、

9

これは、数式を使用して利用できます。

=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

8

これは、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=> ""

2
私はこれが本質的にニコライ・イワノフの解決策と同じであることに気づきました。それは特徴点のいくつかのために、わずかに異なるアプローチを示しているので、私はそれを任せる
alexanderbird

2つの理由からの適切な解決策:オブジェクト(範囲、セルなど)を使用しないこと。非常にコンパクトな定義。
loved.by.Jesus

8

robertsdのコードはエレガントが、将来を見据えたものにするために、nの宣言をlong型に変更します

マクロを避けるために数式が必要な場合は、列702まで含めて次のように機能します

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

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


7

最新の更新:以下の関数を無視してください。@ SurasinTancharoenは、で壊れていることを通知してくれましたn = 53
興味のある方のために、以下に他の壊れた値を示しますn = 200

の特定の値

@brettdj関数をすべてのニーズに使用してください。それも、Microsoft Excelの列の制限の最新の最大数を動作します:16384与えなければなりませんXFD

ここに画像の説明を入力してください

更新の終わり


以下の関数は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 Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition

2
参考までに、Chr()は大きな数を適切に処理しないため、これはより大きな列セットを備えています。
Azuvector 2014年

2
これにはバグがあります。'BA'であるはずのConvertToLetter(53)を試してください。ただし、失敗します。
Surasin Tancharoen、2015

@SurasinTancharoenこの欠陥にご注意いただきありがとうございます。Microsoftが自分でMicrosoft Excelを作成したので、Microsoftが壊れた機能を提供するとは思っていませんでした。今後はこの関数を放棄し、@ brettdj関数を使用して、最新のMicrosoft Excelの列制限の最大数まで修正しますCol_Letter(16384) = "XFD"
mtbink.com

4
そして、この「27による除算」はいったいどこから来たのでしょうか。最後に26文字あることを確認しました。これが、このコードが機能しない理由です。
ib11 2016年

5

これは、上記の@DamienFennellyの回答に基づく関数です。イマイチをあげたら、イマイチもあげて!:P

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

2
良い質問ですが、承認された回答とどう違うのですか?
イオアニス2014年

@loannis私は、受け入れられたものではなく、DamianFennellyの答えに基づいています。しかし、ええ、私のものは受け入れられた答えによく似ていますが、1行が2行に分かれて読みやすくなっています。
BrettFromLA 2014年

3

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

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

これは、のそれを取る1行上の目的の列のアドレスを返します1

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

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

置き換えてlngRow使用して目的の列番号のためのSelection.Columnプロパティを!


2

こちらは使用できるシンプルなワンライナーです。

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

1文字の列指定でのみ機能しますが、単純な場合に適しています。2文字の指定のみで機能する必要がある場合は、以下を使用できます。

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

2

これは、行X、列Yにあるセルの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)

1

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

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

ここでは後半の答えはちょうど使用して単純化したアプローチのために、あるInt()If1-3文字列の場合:

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
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

ここでは、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

この数式は、範囲(つまり、A1)に基づいて列を提供します。ここで、rangeは単一のセルです。マルチセル範囲が指定されている場合は、左上のセルを返します。両方のセル参照は同じでなければならないことに注意してください。

MID(CELL( "住所"、A1)、2、SEARCH( "$"、CELL( "住所"、A1)、2)-2)

使い方:

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


0

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

Sub column()

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

End Sub

それが役に立てば幸いです=)


0
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

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

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から開始し$、次にを$使用して文字列内の2番目が現れる場所を見つけ、次にInStr2を引いてその開始位置を考慮します。

これにより、考えられるすべてのカラムに適応できるという利点があります。したがって、ColLetter(1)「A」 ColLetter(16384)を返し、Excelバージョンの最後の列である「XFD」を返します。


-1

列番号からの列文字は、次の手順で式を使用して抽出できます
。1. ADDRESS式を使用して列アドレスを計算します
2. MIDおよびFIND関数を使用して列文字を抽出します

例:
1. ADDRESS(1000,1000,1)
結果$ ALL $ 1000
2 。= MID(F15,2、FIND( "$"、F15,2)-2)の
結果すべてのF15にステップ1の結果が含まれていると 仮定すると、一度にMID(ADDRESS(1000,1000,1)、2、FINDと

書き込むことができます。
( "$"、ADDRESS(1000,1000,1)、2)-2)


-1

これはREFEDITのみです。一般的に、ここでコードをすぐに使用します。バージョン...読みやすく、理解しやすいです/ $のpozを使用します

Private Sub RefEdit1_Change()

    Me.Label1.Caption = NOtoLETTER(RefEdit1.Value) ' you may assign to a variable  var=....'

End Sub

Function NOtoLETTER(REFedit)

    Dim First As Long, Second As Long

    First = InStr(REFedit, "$")                 'first poz of $
    Second = InStr(First + 1, REFedit, "$")     'second poz of $

    NOtoLETTER = Mid(REFedit, First + 1, Second - First - 1)   'extract COLUMN LETTER

End Function


-2

ASCII番号に変換し、Chr()を使用して文字に戻すのはどうですか?

col_letter = Chr(Selection.Column + 96)


-6

ここに別の方法があります:

{

      Sub find_test2()

            alpha_col = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,W,Z" 
            MsgBox Split(alpha_col, ",")(ActiveCell.Column - 1) 

      End Sub

}

1
アルファベットの文字をリストした文字列を作成する必要はありません。ASCIIは基本的にそれを行ってくれました。
Caltor、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.