列名中的Excel列号


72

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


1
看看这个问题:stackoverflow.com/q/22708/390819那里也有一个VBA解决方案
Cristian Lupascu 2012年

1
列名是字母还是标题?
Fionnuala 2012年

2
@wolf:这与OP想要的相反:)
Siddharth Rout

1
我知道您要求一个宏,并且您得到了一个很好的答案,但是作为注释,您可以在Excel中使用=COLUMN(INDIRECT("C"&1))。有可能是一个更简单的方法..
猛犸跳线

Answers:


161

我想你要这个吗?

列名到列号

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

快照

在此处输入图片说明


就像如果我在最顶部有薪水字段,现在让我们在单元格C(1,1)说,如果我更改文件并将薪水列移动到其他地方说F(1,1),那么我将不得不修改代码我希望代码检查薪水并找到列号,然后根据该列号执行其余操作。
Paritosh Ahuja

如果此答案满足您的问题,请确保选择最佳答案!
PsychoData

如果我有无效的clumn名称,例如“ SUJA”,我只想知道该列不存在。如何实现?在此先感谢
KaviSuja

@KaviSuja:我不确定我是否理解您的问题
Siddharth Rout

@SiddharthRout我在以下链接中找到了解决方案和我的实际问题:stackoverflow.com/questions/46660109/…–
KaviSuja

4

当您在寻找VBA解决方案时,这是我在Google上寻找公式解决方案时的最高结果,因此,我将为所有来这里的人添加此内容,就像我所做的那样:

Excel公式返回列字母数字(来自@A。Klomp的上述注释),其中单元格A1保存您的列字母:

=列(间接(A1&“ 1”))

由于间接函数是易失性的,因此只要更改了任何单元格,它都会重新计算,因此,如果您有很多这样的函数,可能会降低工作簿的速度。考虑另一种解决方案,例如“代码”功能,该功能为您提供ASCII字符的数字,以65处的“ A”开头。请注意,要执行此操作,您需要检查列名中的位数,以及根据“ A”,“ BB”或“ CCC”更改结果。

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

= substitute(address(1,A1,4),“ 1”,“”)

请注意,无论列名中包含多少个字母,这两种方法均有效。

希望这对其他人有帮助。


@ExcelHero您缺少上述要点-在我的解决方案中,单元格A1包含字母/数字列。您的解决方案会对解决方案进行硬编码,以将“ A”转换为1,或将1转换为“ A”。我的版本仅显示了如何动态执行此操作(尽管如果您想进行硬编码,是的,这也是可能的)。我已经确认它们可以正常工作,请您亲自尝试一下。
级“呃,”培根

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。;)


0

您可以跳过所有这些操作,而只是将数据放在表中。然后,参考表和标题,它将是完全动态的。我知道这是3年前的事,但有人可能仍然觉得这很有用。

示例代码:

Activesheet.Range("TableName[ColumnName]").Copy

您也可以使用:

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

您甚至还可以在工作表公式中使用此参考系统。它非常动态。

希望这可以帮助!


0

这是一个纯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

基本上,此函数与任何Hex to Dec函数相同,除了它只接受字母字符(A = 1,B = 2,...)。最右边的char计数为单个,左边的每个char计数为右边的char的26倍(这使AA = 27 [1 + 26],AAA = 703 [1 + 26 + 676])。UCase()的使用使此函数不区分大小写。


-4

我认为获取列号的最简单方法是:
Sub Sample() ColName = ActiveCell.Column MsgBox ColName End Sub

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.