【问题标题】:Excel column number from column name列名中的 Excel 列号
【发布时间】:2012-04-23 18:56:19
【问题描述】:

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

【问题讨论】:

  • 看看这个问题:stackoverflow.com/q/22708/390819 那里也有 VBA 解决方案
  • 列名是字母还是标题?
  • @wolf:这与 OP 想要的相反 :)
  • 我知道您要求宏,并且您有一个很好的答案,但作为旁注,在 Excel 中您可以使用 =COLUMN(INDIRECT("C"&1))。可能有更简单的方法..

标签: vba excel


【解决方案1】:

我想你想要这个?

列名到列号

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),那么我将不得不修改代码,所以我希望代码检查 Salary 并找到列号,然后根据该列号执行其余操作。

在这种情况下,我建议使用.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) 然后我将不得不修改代码,因此我希望代码检查 Salary 并找到列号,然后根据该列号执行其余操作。
  • 如果这个答案能满足你的问题,请务必选为最佳!
  • 如果我的列名无效,如“SUJA”,我只想知道该列不存在。我们怎样才能做到这一点?提前致谢
  • @KaviSuja:我不确定我是否理解你的问题
  • @SiddharthRout 我在以下链接中找到了解决方案和我的实际问题:stackoverflow.com/questions/46660109/…
【解决方案2】:

当您在寻找 VBA 解决方案时,这是我在 google 上寻找公式解决方案时的最佳结果,所以我会为像我一样来到这里的任何人添加这个:

Excel 公式从列字母返回数字(来自@A. Klomp 上面的评论),其中单元格 A1 包含您的列字母:

=column(间接(A1&"1"))

由于间接函数是易失性的,它会在任何单元格更改时重新计算,因此如果您有很多这样的函数,它可能会减慢您的工作簿。考虑另一种解决方案,例如“code”函数,它为您提供 ASCII 字符的数字,从 65 处的“A”开始。请注意,要执行此操作,您需要检查列名中有多少位数字,并且根据“A”、“BB”或“CCC”改变结果。

Excel 公式返回 来自数字的列字母(来自上一个问题 How to convert a column number (eg. 127) into an excel column (eg. AA),由 @Ian 回答),其中 A1 包含您的列号:

=substitute(地址(1,A1,4),"1","")

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

希望这对其他人有所帮助。

【讨论】:

  • @ExcelHero 您错过了上述要点 - 在我的解决方案中,单元格 A1 包含 列字母/数字。您的解决方案将解决方案硬编码以将“A”转换为 1,或将 1 转换为“A”。我的版本只是展示了如何动态地执行此操作(尽管如果您想硬编码,是的,这也是可能的)。请亲自尝试一下,因为我已经确认它们有效。
【解决方案3】:

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

示例代码:

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

你也可以使用:

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

您甚至可以在工作表公式中使用此参考系统。它非常有活力。

希望这会有所帮助!

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          这是一个纯 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 到 Dec 函数的功能相同,只是它只需要字母字符(A = 1,B = 2,...)。 最右边的 char 计为单个,左边的每个 char 是右边 char 的 26 倍(这使得 AA = 27 [1 + 26],AAA = 703 [1 + 26 + 676])。 UCase() 的使用使得这个函数不区分大小写。

          【讨论】:

            猜你喜欢
            • 2013-10-09
            • 2019-11-01
            • 2012-12-25
            • 1970-01-01
            • 1970-01-01
            • 2013-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多