【发布时间】:2019-06-17 11:35:32
【问题描述】:
尝试编写一个 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 语句可以解析变量
Find MidTemp on RawData
RawData:MidTemp
Col 0
让函数运行通过错误发生在
Set wks = Sheets(shtName)
如果我将参数 shtName 替换为作为字符串“RawData”的实际工作表名称,则错误会向下移动到使用第二个参数 heading 的行。如果我在这里用字符串替换参数,错误仍然存在。
我在这里缺少什么吗?一些帮助将不胜感激。
【问题讨论】:
-
当您调用该函数时,它假定您正在传递标题和 shtname 的变量。因为你不是,所以这些值什么都不是,你会得到错误,因为不存在这样的工作表或标题。
-
r = .Range("1:1").Find(heading, LookIn:=xlValue)缺少Set关键字。我很惊讶没有抛出错误 91。 -
我很好奇这些工作表在编译时是否存在于
ThisWorkbook,以及“标题”是否实际上属于ListObject(表)对象。如果是这样的话,有一个更简单的方法来解决这个问题。 -
@MathieuGuindon 是的,该工作表确实存在,因为我在创建新工作表并应用来自
DataSht.变量的名称后使用此函数。但是,我会接受建议并了解更多关于ListObject的信息,因为我完全支持更简单的解决方案。谢谢 -
Ctrl+T(在 Excel 中)是你最好的新朋友 ;-)