【问题标题】:VBA Subscript out of range, name resolution problem?VBA 下标超出范围,名称解析问题?
【发布时间】: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 中)是你最好的新朋友 ;-)

标签: excel vba


【解决方案1】:

遗憾的是无法发表评论,但您实际上收到了 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

【讨论】:

  • 哇,好球!确认重现(一旦错字被修复,抛出错误 91,没有添加 Set)。在模块顶部指定 Option Explicit 可以防止这种情况发生。
  • 我还怀疑Sheets(shtName) 可能存在错误#9,如果该代码未写入ThisWorkbook 模块和ActiveWorkbook(不合格的Sheets 调用是那么隐式/间接引用)没有该名称的工作表。我还提倡改用Worksheets 集合,以排除当给定名称拉出一些Chart 表时类型不匹配的可能性 - 但不太可能。
  • 另外,恭喜!您现在有足够的代表在任何地方发表评论! =)
  • 缺少的SetxlValues 已经解决了这个问题,大大,谢谢。也欣赏精致的代码。我实际上已经将.Select 语句作为可见的“调试”标志放入,所以是的,是多余的。 @Mathieu 您的有用建议已被及时记录,VBA 对象和变量范围让我抓狂!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多