我在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,如果这有帮助的话。
答案 0 :(得分:1)
您是否尝试过使用SaveAs方法中的ConflictResolution:= xlLocalSessionChanges参数?
如此:
cmp = compare(Name[j].nume, Name[j+1].nume);
答案 1 :(得分:1)
在Access VBA中,我使用它在运行一系列更新时关闭所有对话框:
DoCmd.SetWarnings False
运行所有更新后,我的VBA脚本中的最后一步是:
DoCmd.SetWarnings True
希望这有帮助。
答案 2 :(得分:0)
来自Excel Macro Security - www.excelfunctions.net:
Excel 2007,2010中的宏安全性&amp; 2013:强>
.....
最新版本提供的不同Excel文件类型 当工作簿包含宏时,Excel会清楚显示,因此本身就是这样 是一种有用的安全措施。但是,Excel也有可选的宏 安全设置,通过选项菜单控制。这些 是:
'禁用所有宏而不通知'
此设置不允许运行任何宏。当你打开一个新的 Excel工作簿,您不会注意到它包含的事实 宏,所以你可能不知道这就是工作簿的原因 没有按预期工作。
'禁用所有带通知的宏
此设置可防止宏运行。但是,如果有的话 工作簿中的宏,会显示一个弹出窗口,以警告您 宏存在并已被禁用。
'禁用除数字签名宏之外的所有宏
此设置仅允许来自可信来源的宏运行。所有其他 宏不运行。当您打开一个新的Excel工作簿时,您不是 警告它包含宏,因此您可能不知道 这就是工作簿无法按预期工作的原因。
'启用所有宏'
此设置允许所有宏运行。当您打开一个新的Excel 工作簿,你不会被告知它包含宏和 在打开文件时可能不知道宏正在运行。
如果您信任这些宏并且可以启用它们,请选择此选项:
'启用所有宏'
并且此对话框不应显示为宏。
至于保存对话框,注意到它在Excel for Mac 2011上运行后,我在SO StackOverflow - Suppress dialog when using VBA to save a macro containing Excel file (.xlsm) as a non macro containing file (.xlsx)上遇到了以下问题。除此之外,删除对话框似乎是不可能的,除非可能通过某些键盘输入模拟。我会发布另一个问题来询问。对不起我只能半途而废。另一个选择是使用带有Microsoft Excel的Windows计算机,但在这种情况下我不确定这是否适合您。
答案 3 :(得分:0)
听起来您可以从使用自动化实用程序中受益。如果您使用的是Windows PC,我建议使用AutoHotkey。我没有在Mac上使用自动化实用程序,但this Ask Different post有几个建议,但似乎都没有。
这不是VBA解决方案。这些宏在Excel之外运行,可以使用键盘敲击,鼠标移动和点击与程序进行交互。
基本上,您记录或编写一个简单的自动化宏,等待Excel“另存为”对话框变为活动状态,点击进入/返回以完成保存操作,然后等待“另存为”窗口关闭。您可以将其设置为以连续循环方式运行,直到您手动结束宏。
这是Windows AutoHotkey脚本的简单版本,可以完成您尝试在Mac上执行的操作。它应该让你了解所涉及的逻辑。
; ' 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 :(得分:0)
为了解决启用宏提示,我建议
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