尝试编写一个VBA函数,该函数将在给定标题单元格字符串和工作表名称的情况下返回列号,但出现下标超出范围错误。 这是函数:
Public Function namedColumnNo(heading As String, shtName As String) As Long
' Return the column number with named header text'
' on given worksheet.
Dim r As Range
Dim wks As Worksheet
Debug.Print shtName
'Exit Function
Set wks = Sheets(shtName)
wks.Range("1:1").Select
With wks
r = .Range("1:1").Find(heading, LookIn:=xlValue)
If r Is Nothing Then
namedColumnNo = -1
Else: namedColumnNo = r.Column
End If
End With
End Function
我正在使用此测试子调用功能:
Public Sub getCol()
Debug.Print "Find MidTemp on " & DataSht.RawDataSht
Debug.Print "Col " & namedColumnNo("MidTemp", DataSht.RawDataSht)
End Sub
我有一个用户定义的DataSht类型,其中有一些变量可以命名工作表,例如
Public Type dataShtNames
HeaderSht As String
RawDataSht As String
ResultDataSht As String
End Type
Public DataSht As dataShtNames
在没有注释Exit Function语句的情况下,变量使用我得到的debug.print语句解析OK。
Find MidTemp on RawData
RawData:MidTemp
Col 0
让函数运行通过错误发生在
Set wks = Sheets(shtName)
如果我用实际的工作表名称将参数shtName替换为字符串“ RawData”,则错误将使用第二个参数heading
向下移动到该行。如果我用字符串替换参数,错误仍然存在。
我在这里缺少什么吗?一些帮助将不胜感激。
答案 0 :(得分:3)
严重无法发表评论,但实际上您遇到了out of range
错误,因为它应该是LookIn:=xlValues
,您有LookIn:=xlValue
如@Mathieu所示,您需要修复添加Set r = Find(heading, LookIn:=xlValues)
才能将范围设置为返回的值。
作为旁注,您应该删除选择。它没有为您做任何事情。
With wks.Range("1:1")
Set r = .Find(heading, LookIn:=xlValues)
If r Is Nothing Then
namedColumnNo = -1
Else: namedColumnNo = r.Column
End If
End With