VBA下标超出范围,名称解析有问题吗?

时间:2019-01-23 19:53:06

标签: excel vba

尝试编写一个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向下移动到该行。如果我用字符串替换参数,错误仍然存​​在。 我在这里缺少什么吗?一些帮助将不胜感激。

1 个答案:

答案 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