分享

VBA执行宏无效后(Automationsecurity)打开另外一个文件

 Excel实用知识 2022-01-25

如果一个excel文档含有宏——尤其是该文档中含有Workbook_Open()函数——那么宏有效打开将会比无效打开慢很多。当这样的文档仅仅是用来参照的时候,采用宏无效打开的方式就会加快速度。手动控制的方法是:将excel的宏安全性设置成“中”,这样就会在打开文件的时候弹出询问是否有效打开该文件的对话框,在对话框中选择无效打开就可以了。

     假设VBA在执行过程中需要参照另一个含有宏的工作簿,那么为了提高效率,也可以试着用宏无效的方式来打开它。问题在于,在VBA的打开文件语句中没有指定宏无效的属性,因此要想达到预期的效果并不像指定文件只读打开那样简单。

○解决——AutomationSecurity属性
     既然文件打开语句中没有控制宏无效的属性,那就考虑能不能在程序执行中用其他的语句改变excel的宏安全性设置。AutomationSecurity是application的属性,它的三个值就对应着excel的三种宏安全性配置。在excel帮助中是这样解释这个属性的:

---○ ---↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓--- ○---
・AutomationSecurity指定了在程序执行过程中打开文件时的安全模式,该属性在application启动时自动将MsoAutomationSecurity初始化为常量msoAutomationSecurityLow(=1)。这个属性值可以根据需要在程序中重新设置,因此为了避免出错应该在改动该值后将其还原为初期值,并且最好在改动该值后立即执行文件打开语句,并紧随其后将该属性还原。

・MsoAutomationSecurity类的三个常量:
      msoAutomationSecurityByUI(=2):使用安全性警告对话框中指定的安全级别打开文件。
      msoAutomationSecurityForceDisable(=3):不显示安全性警告对话框,宏无效打开文件。
      msoAutomationSecurityLow(=1):宏有效打开文件,application启动初始值。

・语法:expression.AutomationSecurity

・下面的例子实现了将程序启动时设定的安全级别改为“宏无效”后显示打开文件对话框,并在用户选择了要打开的文件后将安全级别还原成初始值。

Sub Security()
    Dim secAutomation As MsoAutomationSecurity
    secAutomation = Application.AutomationSecurity
    Application.AutomationSecurity = msoAutomationSecurityForceDisable
    Application.FileDialog(msoFileDialogOpen).Show
    Application.AutomationSecurity = secAutomation
End Sub
---○ ---↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑--- ○---

     帮助中的例子首先声明了一个MsoAutomationSecurity类型的变量,并且用它来暂存当前的安全模式,然后更改当前安全模式级别,并在显示“打开文件”对话框之后将安全模式还原。

     不过,这个例子只适用于显示“打开文件”对话框,如果已知文件的路径和文件名而使用Workbooks.Open直接打开它(如下例),那程序执行时将会出错。

Sub Security()
    Dim secAutomation As MsoAutomationSecurity
    secAutomation = Application.AutomationSecurity
    Application.AutomationSecurity = msoAutomationSecurityForceDisable
    Application.Workbooks.Open fileName:=文件路径 & 文件名, ReadOnly:=True
    Application.AutomationSecurity = secAutomation
    MsgBox "End."
End Sub

     这段程序执行的结果是可以正常打开文件,但打开后程序将自动停止,后面的MsgBox将永远也不会看到。

○解决——要Workbooks.Open,也要“宏无效”
     excel帮助里面得例子适用于文件名未知的情况,但在已知文件名的情况下就需要使用Workbooks.Open,要在这种情况下宏无效,那只能放弃当前的application。

     一个application中可以打开多个文件,当我们把各个工作簿都关闭后会出现excel进程还没结束,屏幕上一片灰色的情况,这就是因为application还没有关闭。VBA代码在excel启动时自动创建的application中执行,更改AutomationSecurity属性后程序停止说明VBA所在的application失去了对程序的控制权,那么补救的办法就是通过当前application创建另外一个application,并控制在自建的application中无效打开带有宏的工作簿。当然,在代码执行结束前还要关闭自建的application。

     下面是一段可以使用Workbooks.Open无效打开文件的代码。

Sub Security()
    Dim book       As Excel.Workbook
    Dim app         As Excel.Application
    Set app = CreateObject("Excel.Application")        ’新建一个application
    app.AutomationSecurity = msoAutomationSecurityForceDisable        ’更改为宏无效
    app.Workbooks.Open fileName:=文件路径 & 文件名, ReadOnly:=True        ’无效打开带有宏的参照文件
    Set book = app.Workbooks(文件名)        
    app.AutomationSecurity = msoAutomationSecurityLow        ’还原安全性模式
    MsgBox book.Sheets(1).Cells(1,1).Value        ’打印参照文件中的数据
    app.Quit        ’关闭新建的application
    Set app = Nothing
End Sub

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多