誰かが数値から列文字を返すことができるExcel VBA関数を持っていますか?
たとえば、100と入力するとが返されCV
ます。
誰かが数値から列文字を返すことができるExcel VBA関数を持っていますか?
たとえば、100と入力するとが返されCV
ます。
回答:
この関数は、指定された列番号の列文字を返します。
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
(0)
変数宣言と追加のコード行を保存したい場合は、Splitコマンドの最後にを追加できます。例Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
を使用する場合、これはExcelのプロパティであり、を使用する必要があることを覚えておいてください<excel_object>.Cells()
。そうしないと、型の不一致エラーが発生します。
範囲オブジェクトを使用したくない場合:
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
IF ColumnNumber <= Columns.Count
バージョンに関する想定を避ける方が良いでしょう。
MsgBox Columns( 9347 ).Address
返します 。列文字のみを返すには:Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
返します 。
これを行うもう1つの方法です。Brettdjの答えは私にこれを思い起こさせましたが、この方法を使用する場合、バリアント配列を使用する必要はなく、直接文字列に移動できます。
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
またはこれで少しコンパクトにすることができます
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
これは、cellsオブジェクトの行1を参照していることに依存していることに注意してください。
そして再帰を使用した解決策:
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
これは、数式を使用して利用できます。
=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
これは、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=> ""
robertsdのコードはエレガントが、将来を見据えたものにするために、nの宣言をlong型に変更します
マクロを避けるために数式が必要な場合は、列702まで含めて次のように機能します
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
ここで、A1は文字に変換される列番号を含むセルです。
最新の更新:以下の関数を無視してください。@ 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の列番号をアルファベット文字に変換する方法
に適用されます
Col_Letter(16384) = "XFD"
これは、上記の@DamienFennellyの回答に基づく関数です。イマイチをあげたら、イマイチもあげて!:P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
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
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の回答よりも非常にわずかに遅くなることです。しかし、これは、関数が非常に長時間繰り返し使用された場合に感じる可能性があります。
ここでは後半の答えはちょうど使用して単純化したアプローチのために、あるInt()
とIf
1-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
この数式は、範囲(つまり、A1)に基づいて列を提供します。ここで、rangeは単一のセルです。マルチセル範囲が指定されている場合は、左上のセルを返します。両方のセル参照は同じでなければならないことに注意してください。
MID(CELL( "住所"、A1)、2、SEARCH( "$"、CELL( "住所"、A1)、2)-2)
使い方:
CELL( "property"、 "range")は、使用されるプロパティに応じて、範囲の特定の値を返します。この場合、セルアドレス。addressプロパティは値$ [col] $ [row]を返します。つまり、A1-> $ A $ 1です。MID関数は、$記号の間の列値を解析します。
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
だから私はここのパーティーに遅れますが、私は他の誰もまだ対処していない、配列を含まない別の答えを投稿したいと思います。簡単な文字列操作でそれを行うことができます。
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番目が現れる場所を見つけ、次にInStr
2を引いてその開始位置を考慮します。
これにより、考えられるすべてのカラムに適応できるという利点があります。したがって、ColLetter(1)
「A」 ColLetter(16384)
を返し、Excelバージョンの最後の列である「XFD」を返します。
これは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
キャップAは65なので、
MsgBox Chr(ActiveCell.Column + 64)
発見場所:http : //www.vbaexpress.com/forum/showthread.php? 6103-Solved-get-column-letter
ASCII番号に変換し、Chr()を使用して文字に戻すのはどうですか?
col_letter = Chr(Selection.Column + 96)
ここに別の方法があります:
{
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
}