【发布时间】: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 次点击),但我的没有。我感谢社区的帮助,不要把任何人的时间视为理所当然。