Excel / VBA:使用函数检索基于列标题的列字母

时间:2018-08-13 18:22:35

标签: excel vba excel-vba

好的,所以我正在尝试编写VBA代码,该代码将返回一个列字母,以后可用于选择要使用的列:

For Each cell In Columns("AC")

而不是“ AC”,而是调用函数以基于标题返回列字母。

现在我的返回字母的功能正在运行,它将在第一行中搜索所需的标题(文本),如果匹配则返回列字母

Public Function ColFind(colName As String)
    Dim cell As Range
    For Each cell In Rows("1").Cells.SpecialCells(xlCellTypeConstants)
        If cell.Value = colName Then
            ColFind = Split(cell.Address, "$")(1)
        End If
    Next cell
End Function

现在,当尝试使用此功能时...

For Each cell In Columns(ColFind("Email Address"))

此方法似乎无效...

我尝试过

For Each cell In Columns("ColFind("Email Address")")

但是,这会导致错误。 (我假设它实际上是将文本放在引号内,而不是调用我的函数)

如何在其他子菜单中使用此功能,以选择具有适当标题的列?预先感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

您可以重写以使用Range.Find并在找不到标头的情况下返回变体吗?

Option Explicit
Public Sub test()
    Dim iCell As Range, result As Variant

    With ActiveSheet
        'Debug.Print ColFind("Email Address")
        result = ColFind("Email Address")
        If Not IsError(result) Then
            For Each iCell In Intersect(.Columns(result), .UsedRange)
                Debug.Print iCell.Address
            Next iCell
        Else
            MsgBox "Header not found"
        End If
    End With
End Sub

Public Function ColFind(colName As String) As Variant  
    Dim rng As Range
    Set rng = ActiveSheet.Rows(1).Find(colName)
    If Not rng Is Nothing Then
        ColFind = rng.Column
    Else
        ColFind = CVErr(xlErrNA)
    End If 
End Function

答案 1 :(得分:1)

可能的原因

For Each cell In Columns(ColFind("Email Address"))

不起作用是因为Columns希望您将其传递给字符串。但是,您尚未告诉VBA ColFind函数输出字符串。您可以通过将函数定义为以下方式来解决此问题:

Public Function ColFind(colName As String) as String
    ...
End Function

答案 2 :(得分:0)

感谢所有帮助,我终于使它起作用了!原来我的代码确实有效,但是我犯了一个菜鸟错误。我使用alt-enter格式化了我试图在Excel中选择的列标题。我以为标题是“客户电子邮件”,但实际上由于我的错误而只是“客户”。我告诉程序寻找不存在的东西。还要感谢QHarr,您的方法也有效,而且我了解到返回列字母只是不必要的工作。