VBA Run-Time 中未定义的 Object 出现问题错误 '91'
Trouble with undefined Object in VBA Run-Time error '91'
我整个星期都在努力准备一份 VBA 申请,我将在今天的会议中使用它。不幸的是,上周 运行 整整一周都没有问题的代码决定在周末中断。
我经常收到 Object 变量或未设置块变量 Run-time 错误 '91' 来自此语句:
With Sheet5
Set adjrng = .Range(.Cells(.Range("G43:G60").Find(.Range("H39").Value).Row, 10), .Cells(.Range("G43:G60").Find(.Range("H39").Value).Row, 21))
End With
想法是在范围G43:G60的行中设置一个范围,其中H39的值从第10列到第21列匹配。
有人发现问题了吗?我的大脑今天早上很紧张而且很困...
非常感谢
本
编辑:
在查找和替换之后,问题似乎是 excel 尚未正确计算 "lookin" 和 "lookup" 范围 G43:G60 和 H39 .简单的重新计算并没有使 excel 重新发现内容,但是当我使用我的输入切换之一在这些单元格中显示不同的值,然后返回到原始值时,它确实找到了它。
也许为此使用 find 是一种糟糕的风格,find 公式通常有这些问题或对此有任何其他评论?目前一切正常,但我担心 运行 再次陷入这些问题。因此,任何提示仍将不胜感激。
编辑:(来自下面的评论)
我们有一个动态范围 (G43:J60),其中唯一标识符列在 G 列中,数据在右侧。如果范围的数据部分发生了某些变化并且 G 列中的行唯一标识符与单元格 H39 中的行匹配,则通过 worksheet_change intersect(target, adjrng) 触发 sub() 定义 adjrng 是抛出错误的部分找到 returns 空值。
我相信您只是想设置一个范围,希望在 G43:G60 范围内有两个与 H39 中的值匹配。虽然我避免 on Error Resume Next
(永远无法适应打破某些东西以期完成某些事情的逻辑),但我总是在寻找它们时检查这些值是否存在。
Dim rwUNIQ as long
Set adjrng = nothing
With Sheet5
if cbool(application.countif(.Range("G43:G60"), .Range("H39").Value)) then
rwUNIQ = application.match(.Range("H39").Value, .Range("G43:G60"), 0)
Set adjrng = .Cells(42 + rwUNIQ, 10).resize(1, 11)
end if
if not adjrng is nothing then
'do something with adjrng
end if
Set adjrng = nothing
End With
在继续之前检查以确保 G43:G60 中至少有两个 H39 值。没有进一步的错误控制,因为我们至少计算了其中两个。如果没有,您可能想用 Else
进行补偿。如果找到单个 H39 值,您可能还需要 select 一行。
请记住,.Find
使用许多自上次使用 Find 时保留的参数,无论是在 VBA 中还是在工作表上的用户中。您确实缺少指定 Find 应该使用的选项的参数。例如xlPart 或 xlWhole,After:=what?,查看公式或值等。
编辑:* 修改代码以查找 H39 中值的单个实例和 .Resize
以扩展宽度(根据 OP 的评论)。
我整个星期都在努力准备一份 VBA 申请,我将在今天的会议中使用它。不幸的是,上周 运行 整整一周都没有问题的代码决定在周末中断。
我经常收到 Object 变量或未设置块变量 Run-time 错误 '91' 来自此语句:
With Sheet5
Set adjrng = .Range(.Cells(.Range("G43:G60").Find(.Range("H39").Value).Row, 10), .Cells(.Range("G43:G60").Find(.Range("H39").Value).Row, 21))
End With
想法是在范围G43:G60的行中设置一个范围,其中H39的值从第10列到第21列匹配。
有人发现问题了吗?我的大脑今天早上很紧张而且很困...
非常感谢
本
编辑:
在查找和替换之后,问题似乎是 excel 尚未正确计算 "lookin" 和 "lookup" 范围 G43:G60 和 H39 .简单的重新计算并没有使 excel 重新发现内容,但是当我使用我的输入切换之一在这些单元格中显示不同的值,然后返回到原始值时,它确实找到了它。
也许为此使用 find 是一种糟糕的风格,find 公式通常有这些问题或对此有任何其他评论?目前一切正常,但我担心 运行 再次陷入这些问题。因此,任何提示仍将不胜感激。
编辑:(来自下面的评论)
我们有一个动态范围 (G43:J60),其中唯一标识符列在 G 列中,数据在右侧。如果范围的数据部分发生了某些变化并且 G 列中的行唯一标识符与单元格 H39 中的行匹配,则通过 worksheet_change intersect(target, adjrng) 触发 sub() 定义 adjrng 是抛出错误的部分找到 returns 空值。
我相信您只是想设置一个范围,希望在 G43:G60 范围内有两个与 H39 中的值匹配。虽然我避免 on Error Resume Next
(永远无法适应打破某些东西以期完成某些事情的逻辑),但我总是在寻找它们时检查这些值是否存在。
Dim rwUNIQ as long
Set adjrng = nothing
With Sheet5
if cbool(application.countif(.Range("G43:G60"), .Range("H39").Value)) then
rwUNIQ = application.match(.Range("H39").Value, .Range("G43:G60"), 0)
Set adjrng = .Cells(42 + rwUNIQ, 10).resize(1, 11)
end if
if not adjrng is nothing then
'do something with adjrng
end if
Set adjrng = nothing
End With
在继续之前检查以确保 G43:G60 中至少有两个 H39 值。没有进一步的错误控制,因为我们至少计算了其中两个。如果没有,您可能想用 Else
进行补偿。如果找到单个 H39 值,您可能还需要 select 一行。
请记住,.Find
使用许多自上次使用 Find 时保留的参数,无论是在 VBA 中还是在工作表上的用户中。您确实缺少指定 Find 应该使用的选项的参数。例如xlPart 或 xlWhole,After:=what?,查看公式或值等。
编辑:* 修改代码以查找 H39 中值的单个实例和 .Resize
以扩展宽度(根据 OP 的评论)。