好的,所以我正在尝试编写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")")
但是,这会导致错误。 (我假设它实际上是将文本放在引号内,而不是调用我的函数)
如何在其他子菜单中使用此功能,以选择具有适当标题的列?预先感谢您的帮助!
答案 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,您的方法也有效,而且我了解到返回列字母只是不必要的工作。