【问题标题】:excel 2007 Workbook_open not workingexcel 2007 Workbook_open 不工作
【发布时间】:2013-06-12 19:56:54
【问题描述】:

我正在尝试在打开 excel 时清除打印区域和自动筛选: 我是 Excel vba 的新手,所以从谷歌搜索中组装了以下代码 这段代码我已将 Personal.xlsb 的 ThisWorkbook 放入 XLstart 文件夹中,当然宏安全性已设置为启用所有宏

Option Explicit
Public WithEvents xlApp As Excel.Application
Private Sub Workbook_Open()
Set xlApp = Application
End Sub
Private Sub Workbook_Close()
Set xlApp = Nothing
End Sub

Private Sub xlApp_WorkbookOpen(ByVal Wb As Workbook)
Application.EnableEvents = False
Call ClrPrntArea
Application.EnableEvents = True
End Sub

这里是 ClrPrntArea

Sub ClrPrntArea()
Dim ws As Object


For i = 1 To ActiveWorkbook.Worksheets.count
    With Worksheets(i)
        .PageSetup.PrintArea = ""
        .PageSetup.FitToPagesWide = 1
    End With
Next
End Sub

我还将在个人 xlsb 中对模块进行另一个宏调用,以便在上述开始工作后重置自动调整器。任何输入都会非常有帮助

【问题讨论】:

  • 为什么需要一个新的 Excel 实例并使用该实例打开工作簿?开/关EnableEvents有什么用?
  • 嘿 Kalpesh,我的印象是我们需要启用事件以在工作表上执行某些操作...
  • 不,没有必要。事件是一个钩子,可以为对象上调用的某些方法编写代码。

标签: excel vba


【解决方案1】:

PERSONAL.xlsb,模块ThisWorkbook,试试下面的;它与您的请求中的代码几乎相同,但有一些修改:

  • 应用程序对象声明为私有
  • 事件例程使用作为参数传递的本地WB对象变量,而不是ActiveWorkbook对象
  • For ... Next 替换为 For Each ... Next 并使用局部对象变量
  • PERSONAL.xlsb 自身的陷阱处理

一旦您愿意删除所有 MsgBox 语句(和 Else),它们只是为了显示正在发生的事情和时间。

Private WithEvents Excel_App As Excel.Application

' runs when Excel_App encounters a Workbook_Open() event
Private Sub Excel_App_WorkbookOpen(ByVal WB As Workbook)
Dim WS As Worksheet

    If WB.Name <> "PERSONAL.xlsb" Then
        MsgBox "PERSONAL.xlsb: Excel_App_WorkbookOpen(): " & WB.Name
        For Each WS In WB.Worksheets
            WS.PageSetup.PrintArea = ""
            WS.PageSetup.FitToPagesWide = 1
            If WS.FilterMode Then
                WS.ShowAllData
            End If
        Next
    Else
        MsgBox "PERSONAL.xlsb: Excel_App_WorkbookOpen(): myself"
    End If
End Sub

' runs when PERSONAL.xlsb is opened
' assign current Excel application to object variable Excel_App
Private Sub Workbook_Open()
    MsgBox "PERSONAL.xlsb: Workbook_Open()"
    Set Excel_App = Application
End Sub

注意

当您双击 Excel 文件(例如在您的桌面上)时,如果事件处理程序没有启动,请关闭所有 Excel 应用程序并检查任务管理器中是否有其他孤立的 Excel 进程需要被杀。在玩这个代码时发生在我身上

【讨论】:

  • 感谢迈克的快速回复...但是当我将上面的代码放在我的 Personal.xlsm 中时,它得到运行时错误 91:Object Variable or With Block variable not set..当我做对此进行调试它指向“For i = 1 To ActiveWorkbook.Worksheets.count”这一行,我尝试在没有从 VB 编辑器进行任何编辑的情况下运行它,它工作正常......有什么想法吗?
  • 嗯我似乎无法重现此错误 91;我编辑了我的答案并提供了我测试的完整代码
  • 嘿迈克当我实现你的代码现在我得到运行时错误 9 subscript out of range at this line With Worksheets(i)...
  • 您能否编辑您的问题并粘贴您的完整代码
  • 我使用了您发布的相同代码: Option Explicit Private Sub Workbook_Open() Dim i As Integer Stop ' 进入调试模式 For i = 1 To ActiveWorkbook.Worksheets.Count With Worksheets(i) 。 PageSetup.PrintArea = "" .PageSetup.FitToPagesWide = 1 If .FilterMode Then .ShowAllData ' 如果处于过滤模式,则显示所有 End With Next End Sub
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 2014-03-03
  • 2012-12-26
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2018-09-21
  • 2011-01-23
相关资源
最近更新 更多