【问题标题】:Find() results in Object variable or With Block variable not setFind() 导致 Object 变量或 With Block 变量未设置
【发布时间】:2015-03-31 08:50:14
【问题描述】:

感谢您阅读我的帖子。我是 Excel VBA 的新手,在调试 Find() 调用时遇到了麻烦。我已经浏览了这个网站和其他网站上的几篇文章,但到目前为止,我尝试的每一个修复都没有成功。

我正在编写代码来处理财务报告中的元素。每个报告包含一个或多个多行和多列单元格块,其中包含描述项目的详细信息。每个块的大小不一致,但每个块总是以“客户端名称”开头。所以我想遍历这些块,关闭文本,然后提取需要的元素。

这里还没有 while 循环,因为我在设置第一个条件时遇到了错误。

运行时错误“91”:对象变量或未设置块变量

这是 Sub 中的代码部分,错误出现在分配 cursorProject 的最后一行:

' store the next report to process
Dim nextReport As String
Dim sourceSheetName As String
Dim sheetSource As Worksheet
nextReport = rptMedia
' copy the worksheet into rptBurn and get that worksheet's name
sourceSheetName = GetSheet(nextReport)
Set sheetSource = Workbooks(rptBurn).Worksheets(sourceSheetName)
sheetSource.Cells.EntireRow.Hidden = False
sheetSource.Cells.EntireColumn.Hidden = False
Workbooks(rptBurn).Activate

' process the sheetSource into sheetCurrent
' set constants
Const constCursorKey As String = "Client Name"
Const constClientColumn As String = "B"
Const constClientNameOffset As Integer = 2
Const constProjectLeft As Integer = 2
Const constProjectRight As Integer = 52
' get range in Client Name column of project entries
Dim cursorStart As Long
Dim cursorEnd As Long
Dim cursorProject As Range
Dim rangeProject As Range
Dim rangeSearch As Range

cursorStart = sheetSource.Columns(2).Find(constCursorKey).Row + constClientNameOffset
' find the last project entry in the sheet 
cursorEnd = sheetSource.Range("B" & Rows.Count).End(xlUp).Row
Set rangeSearch = sheetSource.Range(Cells(cursorStart + 1, constProjectLeft), _
                        Cells(cursorEnd, constProjectLeft))
cursorProject = rangeSearch.Find(What:=constCursorKey, LookIn:=xlValues, LookAt:=xlPart, _
                    SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, _
                    SearchFormat:=False)

目前这是非常草率的,因为在迭代报告时,部分将被移出到它自己的 Sub 调用中(因此 nextReport 在此处被硬编码为特定的报告名称)。各种常数是报告的固定参数。像“rptBurn”这样的未列出值是全局值。 GetSheet 函数运行良好,但如果您想查看它:

Private Function GetSheet(rpt As String) As String
   Workbooks.Open rootPath + rpt
   ActiveSheet.Copy after:=Workbooks(rptBurn).Sheets(Workbooks(rptBurn).Sheets.Count)
   GetSheet = ActiveSheet.Name
   Workbooks(rpt).Close
End Function

我已经尝试了几种变体。当地人看起来都对这个错误充满希望。我根据另一篇文章将 Hidden 属性设置为 False。我尝试将调用简化为基础并使用 With,如下所示:

    Set rangeSearch = Sheets(3).Range("B:B")
    rangeSearch.Select
    With rangeSearch
      cursorProject = .Find("Client Name")
    End With

但我总是在 cursorProject 上遇到错误。我正在测试的工作表中肯定有很多“客户名称”条目。我输入了 Select 以验证我获取了正确的范围;奇怪的是,我发现“B:AX”在简单版本中被突出显示(AX 是报告中最右边使用的列),但我期望在原始版本中进行选择。无论在任一选择中是否有“客户名称”实例——我都可以选择 B4 并查看“客户名称”。

我做错了什么?

【问题讨论】:

  • 请尝试将cursorProject = 替换为Set cursorProject =
  • 这个问题做了很多工作,令人钦佩,而且做得很好。但是有很多不必要的文本/信息。请阅读How to create a Minimal, Complete, and Verifiable example。在我看来,主要描述和发生错误的最后一个代码块以及一些附加信息就足够了。但是,我再次钦佩你的努力。 @user3964075 顺便说一句。 cursorProject 是一个范围。您需要将 set 关键字分配给它。
  • 谢谢两位。既然您指出了这一点,那么错误就是前额拍板。我盯着它看了太久。并感谢您编写示例的指针。我在搜索时看到了几个非常简短的问题,并想留下足够的信息。
  • 重复Object variable or With block variable not set (Error 91) ...和其他一百个问题,只需简单搜索即可轻松找到:stackoverflow.com/…
  • Jean,是的,我的帖子中不明显的是 Stackoverflow 之前通过已有帖子为我解决的多个其他错误。这是我第一次没有找到答案;我的询问/不询问百分比是个位数。在经历了多次死胡同后,我到达了准备寻求帮助的地步。您的搜索字符串将适用的帖子返回为 #2(超过 300 次点击),但我的没有。我感谢社区的帮助,不要把任何人的时间视为理所当然。

标签: vba excel find


【解决方案1】:

Cursorproject 是一个对象变量(范围)。您不能简单地为对象变量赋值,您必须对其进行设置。

dim strSomeTextVarible as string
dim rngSomeCellsObjectVariable as range

strSomeTextVarible = "abc"

set rngSomeCellsObjectVariable = range("a1:c3")

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2018-12-11
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多