运行 VB 脚本时禁用 Excel 中的所有对话框?

Posted

技术标签:

【中文标题】运行 VB 脚本时禁用 Excel 中的所有对话框?【英文标题】:Disable all dialog boxes in Excel while running VB script? 【发布时间】:2014-08-01 20:33:32 【问题描述】:

我在 VB 中有一些将所有 XLSM 文件保存为 XLSX 的代码。我已经有了可以为我执行此操作的代码,但是每个操作都会显示对话框。这对于几十个文件来说很好。但是,我将一次在数百个 XLSM 文件上使用它,我不能整天坐在我的电脑前一遍又一遍地点击对话框。

我试过的代码差不多:

Application.DisplayAlerts = False

虽然这不会导致错误,但它也不起作用。

这些框会发出有关启用宏的警告,并警告另存为 XLSX 会删除所有宏的文件。考虑到警告的类型,我怀疑由于安全风险,他们已经限制关闭这些对话框。

由于我在 Excel 的 VB 编辑器中运行此代码,是否有允许我禁用对话框进行调试的选项?

我也试过了:

Application.DisplayAlerts = False       
Application.EnableEvents = False        
' applied code
Application.DisableAlerts = True
Application.EnableEvents = True

这些都不起作用。

编辑:

这是上面代码在我当前代码中的样子:

Public Sub example()
Application.DisplayAlerts = False
Application.EnableEvents = False

For Each element In sArray
    XLSMToXLSX(element)
Next element

Application.DisplayAlerts = False
Application.EnableEvents = False
End Sub

Sub XLSMToXLSX(ByVal file As String)
    Do While WorkFile <> ""
        If Right(WorkFile, 4) <> "xlsx" Then
            Workbooks.Open Filename:=myPath & WorkFile

            Application.DisplayAlerts = False
            Application.EnableEvents = False

            ActiveWorkbook.SaveAs Filename:= _
            modifiedFileName, FileFormat:= _
            xlOpenXMLWorkbook, CreateBackup:=False

            Application.DisplayAlerts = True
            Application.EnableEvents = True

            ActiveWorkbook.Close
        End If
        WorkFile = Dir()
    Loop
End Sub

我还包围了For 循环,而不是ActiveWorkbook.SaveAs 行:

Public Sub example()
For Each element In sArray
    XLSMToXLSX(element)
Next element
End Sub

最后,我将Application.DisplayAlerts 移到Workbooks.Open 行上方:

Sub XLSMToXLSX(ByVal file As String)
    Do While WorkFile <> ""
        If Right(WorkFile, 4) <> "xlsx" Then
            Workbooks.Open Filename:=myPath & WorkFile

            Application.DisplayAlerts = False
            Application.EnableEvents = False

            ActiveWorkbook.SaveAs Filename:= _
            modifiedFileName, FileFormat:= _
            xlOpenXMLWorkbook, CreateBackup:=False

            Application.DisplayAlerts = True
            Application.EnableEvents = True

            ActiveWorkbook.Close
        End If
        WorkFile = Dir()
    Loop
End Sub

这些都不起作用。

编辑:

如果有帮助,我正在使用 Excel for Mac 2011。

【问题讨论】:

这可能有效:mrexcel.com/forum/excel-questions/… 我已经有了工作代码(它的工作方式与链接代码类似,虽然我的代码是循环遍历并以这种方式执行保存),我只需要取消对话框。 Suppress dialog when using VBA to save a macro containing Excel file (.xlsm) as a non macro containing file (.xlsx)的可能重复 【参考方案1】:

您是否尝试过在 SaveAs 方法中使用 ConflictResolution:=xlLocalSessionChanges 参数?

这样:

Public Sub example()
Application.DisplayAlerts = False
Application.EnableEvents = False

For Each element In sArray
    XLSMToXLSX(element)
Next element

Application.DisplayAlerts = False
Application.EnableEvents = False
End Sub

Sub XLSMToXLSX(ByVal file As String)
    Do While WorkFile <> ""
        If Right(WorkFile, 4) <> "xlsx" Then
            Workbooks.Open Filename:=myPath & WorkFile

            Application.DisplayAlerts = False
            Application.EnableEvents = False

            ActiveWorkbook.SaveAs Filename:= _
            modifiedFileName, FileFormat:= _
            xlOpenXMLWorkbook, CreateBackup:=False, _
            ConflictResolution:=xlLocalSessionChanges

            Application.DisplayAlerts = True
            Application.EnableEvents = True

            ActiveWorkbook.Close
        End If
        WorkFile = Dir()
    Loop
End Sub

【讨论】:

实际上Application.EnableEvents = False 帮了我大忙。它禁用所有事件/弹出窗口。【参考方案2】:

来自Excel Macro Security - www.excelfunctions.net:

Excel 2007、2010 和 2013 中的宏安全性:

.....

最新版本提供的不同 Excel 文件类型 当工作簿包含宏时,Excel 会很清楚,所以这本身 是一种有用的安全措施。但是,Excel 也有可选的宏 安全设置,通过选项菜单控制。这些 是:

'禁用所有宏而不通知'

此设置不允许运行任何宏。当你打开一个新的 Excel 工作簿,您不会注意到它包含 宏,所以您可能不知道这是工作簿的原因 没有按预期工作。

'禁用所有带有通知的宏'

此设置可防止宏运行。但是,如果有 工作簿中的宏,将显示一个弹出窗口,警告您 宏存在并且已被禁用。

'禁用除数字签名宏之外的所有宏'

此设置仅允许运行来自受信任来源的宏。所有其他 宏不运行。当您打开一个新的 Excel 工作簿时,您不会 提醒它包含宏,因此您可能不知道 这就是工作簿无法按预期工作的原因。

'启用所有宏'

此设置允许所有宏运行。当你打开一个新的 Excel 工作簿,您不会注意到它包含宏和 在您打开文件时可能不知道正在运行的宏。

如果您信任宏并且可以启用它们,请选择此选项:

'启用所有宏'

这个对话框不应该出现在宏中。

至于保存对话框,在注意到这是在 Excel for Mac 2011 上运行后,我在 SO 上遇到了以下问题,*** - Suppress dialog when using VBA to save a macro containing Excel file (.xlsm) as a non macro containing file (.xlsx)。从中删除对话框似乎是不可能的,除非可能通过一些键盘输入模拟。我会发布另一个问题来询问。对不起,我只能让你半途而废。另一种选择是使用带有 Microsoft Excel 的 Windows 计算机,但我不确定在这种情况下这是否适合您。

【讨论】:

禁用宏运行良好,但仍会弹出保存对话框。 我也无法让该示例工作。看来复制工作簿中也有宏,仍然会弹出保存对话框。 似乎可能是 Excel for Mac 2011 的问题。我没有这个应用程序,但我会看看我是否能想到其他任何东西。 @jordanhill123 您的答案很长(因此对于新手用户来说,乍一看似乎相关/有用),但实际上您的答案与问题无关,除了编辑 3,其中你在 Stack Overflow 上发现了一个重复的问题。您从其他来源复制到您的答案的任何内容都与 OP 的问题无关,因此答案是有害的,因为它会使未来的读者花费大量时间思考您的建议,这些建议实际上与问题。我已投票删除此答案。 @GSerg 已编辑删除所有不适用于 OP 问题的内容。离开修复以删除宏安全对话框和副本中的内容。【参考方案3】:

解决方案:自动化宏

听起来您会从使用自动化实用程序中受益。如果您使用的是 Windows PC,我会推荐 AutoHotkey。我没有在 Mac 上使用自动化实用程序,但this Ask Different post 有几个建议,但似乎没有一个是免费的。

这不是 VBA 解决方案。这些宏在 Excel 之外运行,可以使用键盘敲击、鼠标移动和点击与程序交互。

基本上,您录制或编写一个简单的自动化宏,等待 Excel 的“另存为”对话框变为活动状态,按 Enter/Return 以完成保存操作,然后等待“另存为”窗口关闭。您可以将其设置为连续循环运行,直到您手动结束宏。

这是一个简单版本的 Windows AutoHotkey 脚本,可以完成您在 Mac 上尝试执行的操作。它应该让您了解所涉及的逻辑。

自动化宏示例:AutoHotkey

​​>
; ' Infinite loop.  End the macro by closing the program from the Windows taskbar.
Loop 

    ; ' Wait for ANY "Save As" dialogue box in any program.
    ; ' BE CAREFUL!
    ; '  Ignore the "Confirm Save As" dialogue if attempt is made
    ; '  to overwrite an existing file.
    WinWait, Save As,,, Confirm Save As
    IfWinNotActive, Save As,,, Confirm Save As
        WinActivate, Save As,,, Confirm Save As
    WinWaitActive, Save As,,, Confirm Save As

    sleep, 250 ; ' 0.25 second delay
    Send, ENTER ; ' Save the Excel file.

    ; ' Wait for the "Save As" dialogue box to close.
    WinWaitClose, Save As,,, Confirm Save As

【讨论】:

【参考方案4】:

为了绕过启用宏提示,我建议

Application.AutomationSecurity = msoAutomationSecurityForceDisable

完成后请务必将其恢复为默认值

Application.AutomationSecurity = msoAutomationSecurityLow

提醒.SaveAs 函数包含所有可选参数。我建议删除CreatBackup:= False,因为它没有必要。

我认为最有趣的方式是创建工作簿对象并以这种方式访问​​.SaveAs 属性。我尚未对其进行测试,但您从未使用过Workbooks.Open 渲染Application.AutomationSecurity 不适用。还可能节省资源和时间。

也就是说,我能够在 Excel 2013 windows 10 上执行以下操作而无需任何通知。

    Option Explicit

    Sub Convert()

    OptimizeVBA (True)  
    'function to set all the things you want to set, but hate keying in

    Application.AutomationSecurity = msoAutomationSecurityForceDisable  
    'this should stop those pesky enable prompts

    ChDir "F:\VBA Macros\Stack Overflow Questions\When changing type xlsm to 
    xlsx stop popup"

    Workbooks.Open ("Book1.xlsm")

    ActiveWorkbook.SaveAs Filename:= _
    "F:\VBA Macros\Stack Overflow Questions\When changing type xlsm to xlsx_ 
    stop popup\Book1.xlsx" _
    , FileFormat:=xlOpenXMLWorkbook

    ActiveWorkbook.Close

    Application.AutomationSecurity = msoAutomationSecurityLow 
    'make sure you set this up when done

    Kill ("F:\VBA Macros\Stack Overflow Questions\When changing type xlsm_ 
    to xlsx stop popup\Book1.xlsx") 'clean up

    OptimizeVBA (False)
    End Sub


    Function OptimizeVBA(ByRef Status As Boolean)

    If Status = True Then
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        Application.DisplayAlerts = False
        Application.EnableEvents = False
    Else
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic
        Application.DisplayAlerts = True
        Application.EnableEvents = True
    End If

    End Function

【讨论】:

【参考方案5】:

在 Access VBA 中,我使用它在运行大量更新时关闭所有对话框:

DoCmd.SetWarnings False

运行所有更新后,我的 VBA 脚本的最后一步是:

DoCmd.SetWarnings True

希望这会有所帮助。

【讨论】:

以上是关于运行 VB 脚本时禁用 Excel 中的所有对话框?的主要内容,如果未能解决你的问题,请参考以下文章

打开excel总是提示宏禁用的解决方法

VB脚本手动运行完美,但无法通过计划任务管理器更新excel文件

VB弹出打开对话框,选择文件excel文件

将 VB 代码转换为 VB 脚本

excel2016宏被禁用没有找到对应的杀毒软件

VB脚本按行循环Excel数据