.find()触发运行时错误91,即使所有variables都设置VBA可能是由于错误的引用

我正在编写代码来创build一个模板。 此代码在同一个wb中的不同选项卡上填充用户input的名为“fullDistribution”的选项卡。 我有一段代码,我写在一个单独的模块(用于testing)远离我的主模块。 代码正常运行并在分开时完全执行。 当我将这段代码粘贴到我的主模块并运行它时,我开始在新粘贴的代码的开始处收到“运行时错误91:对象variables或块variables未设置”。 我没有使用任何块,我的所有variables都设置。 当我将代码转移到我的主模块时,我没有对代码做任何更改,并且inheritance了我创build的新variables。

这是我在一个单独的模块中编写的代码的select:

Worksheets("bls2016").Activate tcount = WorksheetFunction.CountA(Worksheets("detailedEntity").Range("D2:D" & Cells(Rows.Count, "D").End(xlUp).Row)) acount = WorksheetFunction.CountA(Worksheets("detailedEntity").Range("K2:K7")) Application.ScreenUpdating = False Dim h As Integer Dim f As Integer Dim blstate As Range Dim bl As Range Dim state As Range Dim deat As Range Dim agje As Range Dim e As Integer Dim r As Integer Dim ii As Integer Set blstate = Worksheets("bls2016").Range("D2:D" & Cells(Rows.Count, "D").End(xlUp).Row) Set state = Worksheets("detailedEntity").Range("Q1") Set deat = Worksheets("detailedEntity").Range("D2:D" & Cells(Rows.Count, "D").End(xlUp).Row) Set agje = Worksheets("detailedEntity").Range("L2:M" & Cells(Rows.Count, "M").End(xlUp).Row) h = Activecolumn f = Activerow r = 2 x = 120 For e = 1 To (acount * acount) blstate.Find(state).Select For ii = 1 To x 'ccnt = acst.Offset(0, 1) ccgv = ActiveCell.Offset(0, 2) acem = ActiveCell.Offset(0, 5) Do While True vl1 = Application.IfNa(Application.VLookup(Worksheets("fullDistribution").Cells(r, 2), deat, 1, False), 0) If vl1 = 0 Then Worksheets("fullDistribution").Cells(r, 4) = 0 Else: vl2 = Application.IfNa(Application.VLookup(Worksheets("fullDistribution").Cells(r, 1), agje, 2, False), 0) If ActiveCell.Offset(0, 1).Value = "Unknown Or Undefined" Then Exit Do Else: If vl2 = ccgv Then Worksheets("fullDistribution").Cells(r, 4) = acem ElseIf vl2 <> ccgv Then Worksheets("fullDistribution").Cells(r, 4) = ActiveCell.Offset(x + 1, 5) Else: End If End If End If Exit Do Loop ActiveCell.Offset(f + 1, h).Select r = r + 1 Next ii Next e 

错误在行“blstate.find(state).select”处触发,告诉excel在包含状态名称的dynamic范围内查找,并select用作Activecell的状态的第一个实例。 当它在主模块之外运行时,这又起作用了。

我相信这与一个参考区域有关。 当这个单独运行并完成时,我必须激活一个特定的工作表才能正常运行。 如果我的Excel工作簿打开到不同的选项卡,它将不会运行。 如果在特定的工作表/选项卡上运行,我的主模块也只能正常执行。

如果需要的话,我可以编辑我的文章,并提供我的整个主代码。

这可能是一个问题,不完全引用表,例如修改你的blstate

 with Worksheets("bls2016") Set blstate = .Range("D2:D" & .Cells(.Rows.Count, "D").End(xlUp).Row) end with 

那么它可能会find价值而不是错误。 你应该看看如何使用Find方法,因为你的方式注定会让你头疼。

 blstate.Find(state).Select 

您的代码假定.Findfind它正在寻找的东西。 当Find没有find它所要查找的内容时,函数返回Nothing ,这实际上是一个空对象引用 – 并且不能在Nothing得到运行时错误91的情况下在Nothing上进行成员调用。

拆分:

 Dim result As Range Set result = blstate.Find(state) If Not result Is Nothing Then result.Select 'questionable anyway, but that's another issue Else MsgBox "Value '" & state & "' was not found in " & blstate.Address(External:=True) & "." Exit Sub End If 

至于为什么找不到你要找的东西, Tim Williams已经回答说 :

查找调用上次调用中使用的所有设置(即使使用GUI执行查找),因此请确保在通过VBA调用时指定所需的设置。 如果你不这样做,它可能不会像你期望的那样工作。 – Tim Williams 42分钟前

我的问题与错误的引用有很大的关系,但是,我能够通过将我正在testing的特定代码保存在一个单独的子文件中,并从我的主代码“完全分发”中调用它来解决此问题。

 Call test 

“testing”是testing代码的子名称。 这是解决scheme的一个临时解决scheme,如果有人在引用中挣扎,试试这个。