从列名获取Excel列号

79

如何使用Excel宏从Excel中的列名称获取列号?


1
看一下这个问题:https://dev59.com/w3VD5IYBdhLWcg3wTZxm 那里也有一个VBA解决方案。 - Cristian Lupascu
1
列名是按字母还是按标题? - Fionnuala
2
@wolf:这与OP想要的相反 :) - Siddharth Rout
1
我知道你要求一个宏,而且你已经得到了一个很好的答案,但是顺便说一下,在Excel中你可以使用=COLUMN(INDIRECT("C"&1))。可能有更简单的方法... - Wooly Jumper
7个回答

174

我想你想要这个?

列名转列号

Sub Sample()
    ColName = "C"
    Debug.Print Range(ColName & 1).Column
End Sub

编辑: 同时包括您想要的相反结果

列编号转换为列名称

Sub Sample()
    ColNo = 3
    Debug.Print Split(Cells(, ColNo).Address, "$")(1)
End Sub

后续

如果我在最上面有一个薪资字段,比如说在单元格C(1,1)中,现在如果我修改文件并将薪资列移到其他地方,比如F(1,1),那么我就必须修改代码,所以我想让代码检查薪资并找到列号,然后根据该列号执行其余操作。

在这种情况下,我建议使用.FIND。请参考下面的示例

Option Explicit

Sub Sample()
    Dim strSearch As String
    Dim aCell As Range

    strSearch = "Salary"

    Set aCell = Sheet1.Rows(1).Find(What:=strSearch, LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    If Not aCell Is Nothing Then
        MsgBox "Value Found in Cell " & aCell.Address & _
        " and the Cell Column Number is " & aCell.Column
    End If
End Sub

快照

在此输入图片描述


如果我有一个名为“salary”的字段,位于顶部的单元格C(1,1),现在如果我更改文件并将薪水列移动到其他位置,比如F(1,1),那么我就必须修改代码,所以我希望代码能够检查薪水字段并找到相应的列号,然后根据该列号执行其他操作。 - Paritosh Ahuja
如果这个答案解决了您的问题,请务必将其选为最佳答案! - PsychoData
如果我有一个无效的列名,比如“SUJA”,我只想知道该列不存在。我们该如何实现这一点?提前感谢。 - KaviSuja
@KaviSuja:我不确定我理解你的问题。 - Siddharth Rout
@SiddharthRout 我已经在以下链接中找到了解决方案和我的实际问题: https://stackoverflow.com/questions/46660109/check-a-column-is-valid-in-excel-vb-macro/46661555#46661555 - KaviSuja
显示剩余2条评论

4
当你在寻找一个VBA解决方案的时候,我在寻找公式解决方案时通过谷歌搜索获得了我的最佳结果,所以我会为那些和我一样来到这里寻找公式解决方案的人添加以下内容:
Excel公式用于返回列字母中的数字(从@A.Klomp上面的评论),其中单元格A1保存您的列字母:
= column(indirect(A1&"1"))
由于indirect函数是易变的,每当更改任何单元格时它都会重新计算,因此如果您有很多这样的问题,它可能会减慢您的工作簿。考虑另一个解决方案,例如“code”函数,它为ASCII字符提供数字,从65开始的“A”。请注意,要执行此操作,您需要检查列名称中有多少位数字,并根据“A”、“BB”或“CCC”更改结果。

Excel公式用于从数字返回列字母(来自先前的问题如何将列数(例如127)转换为Excel列(例如AA),由@Ian回答),其中A1保存您的列号:

=substitute(address(1,A1,4),"1","")

请注意,这两种方法都适用于列名中有多少个字母。

希望这能帮助其他人。


@ExcelHero,你没有理解上面的重点——在我的解决方案中,单元格A1包含列字母/数字。你的解决方案将“A”转换为1或1转换为“A”的解决方案是硬编码的。我的版本只是展示了如何动态地完成这个过程(当然,如果你想硬编码,也是可以的)。请亲自尝试一下,我已经确认它们是可行的。 - Grade 'Eh' Bacon

2
您可以跳过所有这些步骤,直接将数据放入表格中。然后引用表格和标题,它将完全动态化。我知道这是三年前的内容,但仍有人可能会发现它有用。
示例代码:
Activesheet.Range("TableName[ColumnName]").Copy

您也可以使用:


activesheet.listobjects("TableName[ColumnName]").Copy

你甚至可以在工作表公式中使用此参考系统。它非常灵活。
希望这能帮到你!

2
以下是一种纯VBA解决方案,因为Excel可以保存合并的单元格:
Public Function GetIndexForColumn(Column As String) As Long
    Dim astrColumn()    As String
    Dim Result          As Long
    Dim i               As Integer
    Dim n               As Integer

    Column = UCase(Column)
    ReDim astrColumn(Len(Column) - 1)
    For i = 0 To (Len(Column) - 1)
        astrColumn(i) = Mid(Column, (i + 1), 1)
    Next
    n = 1
    For i = UBound(astrColumn) To 0 Step -1
        Result = (Result + ((Asc(astrColumn(i)) - 64) * n))
        n = (n * 26)
    Next
    GetIndexForColumn = Result
End Function

基本上,这个函数与任何十六进制转十进制的函数相同,只不过它只接受字母字符(A=1,B=2,...)。 最右边的字符计为1,每个向左的字符计为其右侧字符的26倍(这使得AA=27 [1 + 26],AAA=703 [1 + 26 + 676])。 使用UCase()使该函数不区分大小写。


1

在即时窗口中编写并运行以下代码

?cells(,"type the column name here").column

例如,?cells(,"BYL").column将返回2014。该代码不区分大小写,因此您可以编写?cells(,"byl").column,输出仍将相同。

1
根据Anastasiya的回答,我认为这是最短的vba命令:
Option Explicit

Sub Sample()
    Dim sColumnLetter as String
    Dim iColumnNumber as Integer

    sColumnLetter = "C"
    iColumnNumber = Columns(sColumnLetter).Column

    MsgBox "The column number is " & iColumnNumber
End Sub

注意:此代码的唯一条件是一个工作表处于活动状态,因为“Columns”等同于“ActiveSheet.Columns”。;)

-4
在我看来,获取列号最简单的方法是:
Sub Sample() ColName = ActiveCell.Column MsgBox ColName End Sub


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