启用编辑时,受保护视图中的Workbook_Open()sheet.activate错误

时间:2017-03-07 10:43:43

标签: excel vba excel-vba

当文件处于保护模式(因为从互联网上下载)时, sheet.activate 包含在 Workbook_Open()中时出现问题。一旦“启用编辑”,就会执行Workbook_Open()并出现错误。

如果我使用此代码:

Private Sub Workbook_Open()
Sheets(2).Activate
End Sub

我有这个错误: 运行时错误1004工作表类的激活方法失败

在其他一些讨论中,我尝试使用 Workbook_Activate()方法,如果我在我的所有项目中只有一个简单的激活,它就可以工作。如果我使用以下示例可以修复:

Private Sub Workbook_Open()
a = True
End Sub
Private Sub Workbook_Activate()
If a Then
    Sheets(2).Activate
    a = False
End If
End Sub

但它部分解决了问题,这个代码可以工作,但下次我在我的项目中有另一个sheet.activate错误再次出现,(即,如果我单击按钮进入面板或如果我运行其他例程)。

此错误仅在您第一次打开文件时出现,如果您停止调试器,关闭文件而不保存并重新打开文件错误不会再次出现但我会避免它第一次出来

提前致谢

2 个答案:

答案 0 :(得分:1)

这看起来像是一个已知的问题:
Object Model calls may fail from WorkbookOpen event when exiting Protected View

它说......

  

解决
  您可以通过以下方式解决问题: -

     
      
  1. 如果信任打开工作簿的位置,请将该位置添加到Excel的受信任位置。

  2.   
  3. 将WorkbookOpen事件外部的对象模型调用推迟到WorkbookActivate事件。

  4.   

推迟对象模型调用的代码示例

Option Explicit

Public WithEvents oApp As Excel.Application
Private bDeferredOpen As Boolean

Private Sub oApp_WorkbookActivate(ByVal Wb As Workbook)
    If bDeferredOpen Then
        bDeferredOpen = False
        Call WorkbookOpenHandler(Wb)
    End If
End Sub

Private Sub oApp_WorkbookOpen(ByVal Wb As Workbook)
    Dim oProtectedViewWindow As ProtectedViewWindow
    On Error Resume Next
        'The below line will throw error (Subscript out of range) if the workbook is not opened in protected view.
        Set oProtectedViewWindow = oApp.ProtectedViewWindows.Item(Wb.Name)
    On Error GoTo 0 'Reset error handling

    If oProtectedViewWindow Is Nothing Then
        bDeferredOpen = False
        Call WorkbookOpenHandler(Wb)
    Else
        'Delay open actions till the workbook gets activated.
        bDeferredOpen = True
    End If
End Sub

Private Sub WorkbookOpenHandler(ByVal Wb As Workbook)
    'The actual workbook open event handler code goes here...
End Sub

答案 1 :(得分:0)

在打开文件之前检查文件属性。如果它来自互联网,通常在属性页上会显示一个“取消保护”复选框,您可以选中该复选框以取消保护它,然后它应该会像平常一样打开。

还有一个“只读”复选框,可能也对您有帮助。确保文件不是只读的。

只需在打开它之前执行此操作。