164

数値から列文字を返すことができるExcelVBA関数を持っている人はいますか?

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

4

28 に答える 28

235

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

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
于 2012-10-09T09:44:55.073 に答える
100

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

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
于 2013-03-12T16:37:04.687 に答える
49

私のために働くものは次のとおりです。

Cells(Row,Column).Address 

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

于 2013-11-21T21:00:41.657 に答える
38

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

  <img src = "https://i.stack.imgur.com/7lg2r.gif" alt="その他の例"title= "確かに、*少し*時間がかかりすぎるかもしれません.....または、ScreenToGifの画像のフェード遷移がどれほどスムーズで目立つかをテストする機会を見たかもしれません。結局のところ、Stack Overflowは学習の場ですよね?(そしてそれはプログラミングに関連しているので、私は* am *技術的に話題になっています!)Stack Overflowの投稿の画像にツールのヒントを追加できることすら知らなかったでしょうね?あなたはこのツールのヒントに気付くのに十分長い間アニメーションを見つめていました-そしてさて、ほら、あなたは*まだ*ここに座って、それをすべて読んでいます!さあ、どうやって「哀れな賛成票」を出しますか?わかりません、それはあなたにいくつかの貴重なカルマポイントを獲得するかもしれません!:)」 />


于 2018-03-30T15:22:56.157 に答える
19

そして、再帰を使用したソリューション:

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
于 2013-11-27T10:31:57.907 に答える
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を参照していることに依存していることに注意してください。

于 2014-05-23T15:22:58.413 に答える
10

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

=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
于 2014-12-09T12:08:47.240 に答える
9

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

マクロを回避する数式が必要な場合は、702列目まで機能するものを次に示します。

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

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

于 2014-02-17T03:29:01.740 に答える
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=> ""
于 2015-02-04T16:18:07.783 に答える
7

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

の特定の値

すべてのニーズに合わせて@brettdj関数を使用してください。MicrosoftExcelの最新の最大列数制限でも機能します16384XFD

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

更新の終わり


以下の機能は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
于 2014-07-20T14:46:53.813 に答える
5

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

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function
于 2014-03-20T18:43:32.647 に答える
3

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

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

これにより、行1の目的の列のアドレスが返されます1

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

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

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

于 2014-07-29T12:39:52.723 に答える
2

これが使用できる簡単なワンライナーです。

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

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

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
于 2014-08-26T14:15:33.093 に答える
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)
于 2014-11-05T17:30:41.840 に答える
2

ですから、私はここでのパーティーに遅れていますが、アレイを含まない、他の誰もまだ取り組んでいない別の答えを提供したいと思います。あなたは簡単な文字列操作でそれを行うことができます。

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使用し、位置2から開始して最初の位置を計算し、次に、を使用して文字列の2番目の位置を見つけ、2を減算してその開始位置を計算します。Mid$$InStr

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

于 2018-12-27T23:51:48.537 に答える
1

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

Sub column()

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

End Sub

お役に立てば幸いです=)

于 2014-11-11T12:09:03.123 に答える
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
于 2015-02-12T18:07:37.113 に答える
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

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

于 2016-03-19T04:52:09.697 に答える
1

これは、 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
于 2016-05-28T21:56:30.297 に答える
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
于 2017-03-04T22:36:16.400 に答える
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;
于 2017-09-08T11:00:21.290 に答える
1

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

MID(CELL( "address"、A1)、2、SEARCH( "$"、CELL( "address"、A1)、2)-2)

使い方:

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

于 2018-01-31T18:49:22.100 に答える
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
于 2016-02-04T11:16:16.450 に答える
-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)

于 2015-09-22T20:54:34.047 に答える
-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
于 2016-03-19T17:02:41.703 に答える
-2

キャップAは65なので、次のようになります。

MsgBox Chr(ActiveCell.Column + 64)

で見つかりました:http ://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter

于 2016-03-30T09:31:28.440 に答える
-2

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

col_letter = Chr(Selection.Column + 96)

于 2016-07-15T15:41:06.353 に答える
-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

}
于 2014-07-28T14:17:37.523 に答える