0

我在 Excel 工作簿中开发 VBA 功能时遇到问题。此工作簿适合没有管理权限的最终用户使用,他们需要激活此特定工作簿上的宏才能使用它。

为此,我做了以下工作:

  • 我创建了一个“临时家庭工作表”,要求用户激活宏(无代码,此工作表单元格中的简单消息),最初是可见的
  • 我创建了一个最初(非常)隐藏的“家庭工作表”,其中包含可以使用的按钮和其他控件
  • 我写了一个简单的子程序,称为:
    • 当工作簿打开并且活动表是“临时家庭工作表”时
    • 或当“临时家庭工作表”被激活时
  • 该子执行以下操作(请参见下面的代码):
    • 隐藏“临时家庭工作表”(非常隐藏)
    • 显示“家庭工作表”

这可以:

  • 如果他/她没有激活宏,则显示一条消息,要求用户激活宏
  • 如果用户在激活“临时主工作表”时激活宏,则重定向到目标“主工作表”
  • 如果激活了宏并且用户激活了“临时家庭工作表”,则重定向到目标“家庭工作表”
' Code to hide temporary ws and show target ws

Private Sub setTargetVisibility()

    Dim ws As Excel.Worksheet
    
    ThisWorkbook.Activate
    
    Set ws = ThisWorkbook.Sheets(getParm("tempHomeWSName"))
    With ws
        .Visible = xlSheetVeryHidden
    End With
    
    Set ws = ThisWorkbook.Sheets(getParm("homeWSName"))
    With ws
        .Visible = xlSheetVisible
        .Activate
    End With

End Sub

这在大多数情况下都可以正常工作,因为系统会提示用户通过消息栏激活宏:

消息栏

但是,他们有时会收到另一个激活宏的提示:一个 microsoft excel 安全通知弹出窗口。每当他们通过此弹出窗口激活宏时,就会在带有上述代码的子程序中收到运行时错误 1004(例如 _workbook 对象的方法 Activate 失败)。

在此处输入图像描述

编辑:需要注意的重要一点是,此 excel 文件在受保护的视图中打开,因为它是由 Web 应用程序生成并由用户在使用前下载的。

是什么导致在 excel 2013 中启用宏的这些不同方式(消息栏与弹出窗口)?它们之间的行为差​​异是什么?

提前致谢。

问候,

4

2 回答 2

1
于 2020-08-10T16:10:47.863 回答
0

正如@David Donayo 在接受的答案中提到的那样,触发 Microsoft Excel 安全通知弹出窗口与消息栏警告的原因是 VBA 编辑器已经为另一个 xlsm 文件打开。

是什么导致了我的问题(在 WorkbookOpen 事件中尝试进行对象模型调用(例如 Application.Calculate 或 ThisWorkbook.Activate)时出现运行时错误 1004)是此处描述的问题(https://support.microsoft.com/en-us/help /2745652/object-model-calls-may-fail-from-workbookopen-event-when-exiting-prote ) 在退出受保护的视图然后通过 Microsoft Excel 安全通知激活宏时仍然存在于 excel 2013 中。

当退出受保护的视图并通过消息栏警告激活宏时,不会出现此问题。

我没有实现上面链接中描述的解决方法(如果工作簿在受保护的视图中打开,则将对象模型调用从 WorkbookOpen 事件推迟到 WorkbookActivate 事件),因为在我的上下文中,最终用户不应该打开 VBA 编辑器。因此,我无法判断这种解决方法是否有效,但看不出它为什么不应该的原因。

于 2020-08-11T07:35:12.633 回答