.find()触发运行时错误91即使所有变量都被设置为VBA可能是由于错误引用

时间:2017-07-06 19:58:04

标签: excel vba excel-vba

我正在编写代码来创建模板。此代码在同一wb中的不同选项卡上填充来自用户输入的名为“fullDistribution”的选项卡。我有一个代码的工作部分,我在一个单独的模块中(用于测试)远离我的主模块。代码运行正常并在单独时完全执行。当我将这段代码粘贴到我的主模块并运行它时,我开始在新粘贴的代码的开头接收“运行时错误91:对象变量或未设置块变量”。我没有使用任何块,并且我的所有变量都已设置。当我将代码转移到主模块时,我的代码没有变化,我继承了我创建的新变量。

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

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查看包含状态名称的动态范围,并选择要用作{{1}的状态的第一个实例}。同样,当它在主模块之外运行时,它也可以工作。

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

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

3 个答案:

答案 0 :(得分:2)

可能存在未完全引用工作表的问题,例如将blstate行修改为

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

然后它可能会找到值而不是错误。您应该查找如何使用Find方法,因为您的方式注定会让您头疼。

答案 1 :(得分:0)

bool checkwin(string player) {
    for (int i = 0; i<10; i++) {
        for (int j = 0; j<10; j++) {
            if (grid[i][j] == player && grid[i + 1][j] == player && grid[i + 2][j] == player && grid[i + 3][j] == player) {
                return 1;
            }
            if (grid[i][j] == player && grid[i][j + 1] == player && grid[i][j + 2] == player && grid[i][j + 3] == player) {
                return 1;
            }

            if (grid[i][j] == player && grid[i + 1][j + 1] == player && grid[i + 2][j + 2] == player && grid[i + 3][j + 3] == player) {
                return 1;
            }

            if (grid[i][j] == player && grid[i - 1][j + 1] == player && grid[i - 2][j + 2] == player && grid[i - 3][j + 3] == player) {
                return 1;
            }
        }
    }
}

您的代码假定blstate.Find(state).Select 找到了它正在寻找的内容。当.Find找不到它要查找的内容时,该函数返回Find,它本质上是一个 null对象引用 - 并且您无法在{{{{}上进行成员调用1}}没有得到运行时错误91。

拆分:

Nothing

至于为什么它没找到你要找的东西,Tim Williams already answered that

  

查找调用上次调用中使用的所有设置(即使您使用GUI执行查找),因此请确保在通过VBA调用时指定所需的设置。如果你不这样做,它可能无法正常工作...... - Tim Williams 42 mins ago

答案 2 :(得分:0)

我的问题与错误的引用有很大关系,但是,我能够通过将我正在测试的特定代码段保存在一个单独的子代码中,并从我的主代码中调用它来解决这个问题,“#full; full分布&#39;

Call test

&#39;测试&#39;是带有测试代码的sub的名称。这是对解决方案的临时修复,如果有人在引用方面苦苦挣扎,请试试这个。