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

Excel VBA下标超出范围,名称解析问题?,excel,vba,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 Debu

尝试编写一个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函数语句未注释的情况下,使用我得到的debug.print语句,变量解析为OK

Find MidTemp on RawData
RawData:MidTemp
Col 0
让函数运行时出错发生在
Set wks=Sheets(shtName)
如果我将参数shtName替换为字符串“RawData”的实际工作表名称,那么错误将使用第二个参数
heading
向下移动到该行。如果我在这里用字符串替换参数,错误仍然存在。
这里有我遗漏的东西吗?我们将非常感谢您的帮助

遗憾的是,您无法发表评论,但实际上您得到的
超出了范围
错误,因为它应该是
LookIn:=xlValues
您有
LookIn:=xlValues

正如@Mathieu所指出的,您需要修复add
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

调用函数时,它假定您正在传递heading和shtname的变量。因为不存在,所以值为空,并且由于不存在此类工作表或标题,您将得到错误。
r=.Range(“1:1”)。Find(heading,LookIn:=xlValue)
缺少
Set
关键字。我很惊讶没有抛出错误91。我很好奇这些工作表是否在编译时存在于
此工作簿
,以及“标题”是否真正属于
列表对象
(表)对象。如果是这样的话,有一种非常简单的方法来实现这一点。@MathieuGuindon是的,在创建新工作表并应用来自
DataSht.
变量的名称后,工作表确实存在,因为我正在使用此函数。不过,我将接受建议,并进一步了解
ListObject
,因为我完全支持更简单的解决方案。ThanksCtrl+T(Excel)是您的新好友;-)哇,接球不错!已确认的重新编程(一旦排印被纠正,则抛出错误91,而不添加
设置
)。如果在模块顶部指定了
选项Explicit
,则可以防止出现这种情况。如果该代码未写入
ThisWorkbook
模块和
ActiveWorkbook
中,我还怀疑
工作表(shtName)
中可能存在错误9(不合格的
图纸
调用是对的隐式/间接引用)没有这个名字的工作表。我还建议使用
工作表
集合,以排除当给定名称拉取(例如,一些
图表
工作表)时,类型不匹配的可能性。而且,祝贺你!你现在有足够的代表到处发表评论了!)缺少的
集合
xlValues
已经解决了这个问题,非常感谢。也要欣赏经过改进的代码。实际上,我已经将
.Select
语句作为一个可见的“debug”标志放入,所以是的,是多余的@Mathieu您的有用建议得到了应有的注意,VBA对象和变量范围快把我逼疯了!!