运行 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 中的所有对话框?的主要内容,如果未能解决你的问题,请参考以下文章