将列字母转换为数字

7

我找到了将数字转换为列字母的代码。

我该如何将列字母转换为数字?

Sub colLtr()
Dim mycolumn
mycolumn = 1000
Mcl = Left(Cells(1, mycolumn).Address(1, 0), InStr(1, Cells(1, mycolumn).Address(1, 0), "$") - 1)
MsgBox Mcl
End Sub

1
可能是Excel列名称转换为列数字的重复问题。请参考我在该帖子中的回答,我已经展示了如何实现两种方法。 - Siddharth Rout
这与 OP 所询问的相反。 - DSlomer64
5个回答

15

您可以按其字母引用列,如下所示:

Columns("A")

所以要获得列号,只需像这样修改上述代码:

Columns("A").Column

上面的代码会返回一个整数(在这种情况下为1)。

因此,如果您正在使用变量mycolumn来存储和引用列号,您可以这样设置值:

mycolumn = Sheets("Sheet1").Columns("A").Column

然后,您可以通过以下方式引用变量:

Sheets("Sheet1").Columns(mycolumn)

或引用单元格 (A1):

Sheets("Sheet1").Cells(1,mycolumn)

或者要引用一系列单元格(A1:A10),你可以使用:

Sheets("Sheet1").Range(Cells(1,mycolumn),Cells(10,mycolumn))

我已将代码重写为以下内容:子 LtrCol() Dim AlphaColumn As String Dim ColumnNumber As Long AlphaColumn = "AAA" ColumnNumber = Columns(AlphaColumn).Column MsgBox ColumnNumber End Sub - user1902849
.range 方法 更直观。 - Timo
小细节,使用 .cells 而不是 cells。注意点号“.”。 - Timo
Columns("A").Column给我返回"对象不支持此属性或方法"的错误信息? - undefined
@DavidMays在即时窗口中粘贴?Columns("A").Column,按回车键,您应该会得到输出1 - undefined

4
这个答案的思路很简单,但是效率不高,因为需要获取范围并查询属性。一个更优的解决方案如下:
Function getColIndex(sColRef As String) As Long
  Dim sum As Long, iRefLen As Long
  sum = 0: iRefLen = Len(sColRef)
  For i = iRefLen To 1 Step -1
    sum = sum + Base26(Mid(sColRef, i)) * 26 ^ (iRefLen - i)
  Next
  getColIndex = sum
End Function

Private Function Base26(sLetter As String) As Long
  Base26 = Asc(UCase(sLetter)) - 64
End Function

一些例子:

getColIndex("A")   '-->1
getColIndex("Z")   '-->26
getColIndex("AA")  '-->27
getColIndex("AZ")  '-->52
getColIndex("AAA") '-->703

0
我的评论

ARich提供了一个很好的解决方案,并展示了我使用了一段时间的方法,但Sancarn是正确的,它不是最优的。它速度有点慢,如果输入错误会导致错误,并且不太健壮。Sancarn走在正确的轨道上,但缺少一些错误检查:例如,getColIndex("_")和getColIndex("AE")都将返回31。其他非字母字符(例如:“*”)有时会返回各种负值。

工作函数

这是我编写的一个函数,将把列字母转换为数字。如果输入不是工作表上的列,则会返回-1(除非AllowOverflow设置为TRUE)。

Function ColLetter2Num(ColumnLetter As String, Optional AllowOverflow As Boolean) As Double
'Converts a column letter to a number (ex: C to 3, A to 1, etc). Returns -1 if its invalid.
' @ColumnLetter - the letter(s) to convert to a number.
' @AllowOverflow - if TRUE, can return a number greater than the max columns.
    On Error GoTo invalidCol
    If Len(ColumnLetter) = 0 Then GoTo invalidCol
    Dim thisChar As String
    For i = 1 To Len(ColumnLetter) 'for each character in input
        thisChar = Mid(ColumnLetter, i, 1) 'get next character
        If Asc(UCase(thisChar)) >= 65 And Asc(UCase(thisChar)) <= 90 Then 'if the character is a letter
            ColLetter2Num = ColLetter2Num + (26 ^ (Len(ColumnLetter) - i)) * (Asc(UCase(thisChar)) - 64) 'add its value to the return
        Else
            GoTo invalidCol 'if the character is not a letter, return an error
        End If
        If AllowOverflow = False And (ColLetter2Num = 0 Or ColLetter2Num > Columns.Count) Then
        'if the value is not inside the bounds of the sheet, return an error and stop
invalidCol:
            ColLetter2Num = -1 'error
            Exit Function 'stop checking
        End If
    Next i
End Function
示例
 Sub test()
        Debug.Print ColLetter2Num("A") 'returns 1
        Debug.Print ColLetter2Num("IV") 'returns 256        (max columns for excel 2003 and prior))
        Debug.Print ColLetter2Num("XFD") 'returns -1        (invalid because IV is the last column for .xls workbooks)
        Debug.Print ColLetter2Num("XFD", True) 'returns 16384 (does not return -1 because AllowOverflow = TRUE)
        Debug.Print ColLetter2Num("A_", True) 'returns -1   (invalid because "_" is not a column)
        Debug.Print ColLetter2Num("132", True) 'returns -1  (invalid because "1" is not a column)
        
        If ColLetter2Num("A") <> -1 Then
            Debug.Print "The input is a valid column on the sheet."
        Else
            Debug.Print "The input is NOT a valid column on the sheet."
        End If
    End Sub

0

要查看字母指定的列的数字等效项:

Sub dural()
    ltrs = "ABC"
    MsgBox Cells(1, ltrs).Column
End Sub

4
为什么当一个问题已经是重复的时候,你还要回复它呢:)? - Siddharth Rout
我不想给你的帖子投反对票,尤其是在你发布了一个几乎与重复线程中我的解决方案完全相同的解决方案后,你完全忽略了我的评论。 - Siddharth Rout

0
如果需要编写一个强大的函数,请注意不要使用工作表属性(例如下面@Zac的示例),因为如果活动工作表不是工作表,例如图表,它将会崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接