【问题标题】:Activeworkbook - error 91 - Object Variable or with block variable not set - in Workbook_openActiveworkbook - 错误 91 - 对象变量或未设置块变量 - 在 Workbook_open
【发布时间】:2015-02-21 02:43:04
【问题描述】:

我看到了几个与使用 Activeworkbook 时未设置对象变量有关的问题,但在我的特定场景中没有。我在 workbook_open 中使用了一些代码来测试一个条件来决定是否应该向用户显示一个表单

If Len(ActiveWorkbook.Names("DCStype_Selected").RefersToRange.Value) = 0 Then

这对大多数用户来说在 99% 的情况下都能正常工作。但是,一些用户报告了错误 91 - 对象变量或未设置块变量,并且它位于 activeworkbook 行。
我相信我已经跟踪了发生这种情况的情况,并且它始终适用于在受信任位置没有我的 excel 工作簿的用户,因此会提示启用宏,并且当他们单击“启用”按钮时会发生此错误。
一旦我通过将文件夹设置为受信任位置并将工作簿移动到该文件夹​​来与他们交谈,就不会发生此问题。

  1. 谁能告诉我一种更具防御性的方式来对我的线路进行编码,以使其不受用户安全设置的影响?

  2. 谁能解释一下为什么这个错误只发生在这个特定的场景中?

【问题讨论】:

  • 不确定,但这可能会有所帮助。而不是ActiveWorkbook,而是在打开工作簿时将其分配给一个变量,例如Set wB = Workbooks.Open(Filename:=Path & Filename, ReadOnly:=True),然后测试wB。查看我对上一篇帖子的回答here
  • @DaveU - 将对此进行探索,但使用精确的语法是不可能的。这个工作簿被多个位置的多个客户使用,实际上没有一个在我们公司,所以我无法控制硬件、软件、文件位置等。所以如何在不使用“activeworkbook”的情况下检索当前工作簿的详细信息似乎是我的问题
  • 哦,我明白了。也许另一种方法是遍历所有打开的工作簿并将 wB 设置为名为“DCStype_Selected”的工作簿。然后测试 wB 并在 wB = Nothing 时采取适当的措施。
  • @DaveU - 谢谢戴夫,这听起来不错

标签: excel vba


【解决方案1】:

我会将 ActiveWorkbook.Names("DCStype_Selected").RefersToRange.Value 设置为变量并且出错

  • 要么设置一个消息框,告诉他们将文件移动到受信任的文件夹中
  • 或将变量设置为 0 以避免进一步损坏和调试模式

    订阅() 出错时转到错误
    ...'你的代码
    如果为假则
    错误:
    ... 'MsgBox 或将 var 设置为 0 结束如果
    结束子

【讨论】:

  • 谢谢,但这并不适合。我已经在所有模块中进行了广泛的错误处理,解释如何设置受信任位置的过程不适合消息框。我需要工作簿对象,因此不能设置为 0。认为 DaveU 的 cmets 是要走的路
【解决方案2】:

聚会有点晚了,但我遇到了完全相同的问题......最终像这样解决了它:

Dim wBook As Workbook

Do While wBook Is Nothing
    Set wBook = ActiveWorkbook
    DoEvents
    ' Prob. put a counter in here to prevent infinite looping...
Loop

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多