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

时间:2014-08-01 20:33:32

标签: excel vba excel-vba excel-2011

我在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,如果这有帮助的话。

5 个答案:

答案 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上执行的操作。它应该让你了解所涉及的逻辑。

示例自动化宏: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 :(得分: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