Отключить все диалоговые окна в Excel во время работы VB script?

У меня есть код в VB, который сохраняет все файлы XLSM как XLSX. У меня уже есть код, который будет делать это для меня, но диалоговые окна отображаются для каждого действия. Это было хорошо для нескольких десятков файлов. Тем не менее, я собираюсь использовать это на сотнях XLSM файлов одновременно, и я не могу просто сидеть за компьютером весь день, щелкая диалоговые окна снова и снова.

Код, который я пробовал, в значительной степени:

Application.DisplayAlerts = False

Хотя это не вызывает ошибки, оно также не работает.

Ящики предупреждают о включении макросов, а также предупреждают, что сохранение, поскольку XLSX разбивает файл всех макросов. Учитывая тип предупреждений, я подозреваю, что они запретили отключать эти диалоговые окна из-за угрозы безопасности.

Так как я запускаю этот код в редакторе Excel VB, возможно, есть опция, которая позволит мне отключить диалоговые окна для отладки?

Я также пробовал:

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

Ни один из них не работал.

Edit:

Вот что выглядит код выше в моем текущем коде:

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

Ни один из них не работает.

Edit:

Я использую Excel для Mac 2011, если это помогает.

Ответ 1

В Access VBA я использовал это, чтобы отключить все диалоги при запуске обновлений:

DoCmd.SetWarnings False

После запуска всех обновлений последний шаг в моем VBA script:

DoCmd.SetWarnings True

Надеюсь, что это поможет.

Ответ 2

От Excel Macro Security - www.excelfunctions.net:

Macro Security в Excel 2007, 2010 и 2013:

.....

Различные типы файлов Excel, предоставленные последними версиями Excel дает понять, когда рабочая тетрадь содержит макросы, поэтому это само по себе является полезной мерой безопасности. Однако Excel также имеет необязательный макрос параметры безопасности, которые контролируются через меню опций. Эти:

'Отключить все макросы без уведомления'

  • Этот параметр не позволяет запускать макросы. Когда вы открываете новый Excel, вы не будете предупреждены о том, что он содержит макросов, поэтому вы можете не знать, что это причина, по которой книга не работает должным образом.

'Отключить все макросы с уведомлением

  • Этот параметр запрещает запуск макросов. Однако, если есть макросов в рабочей книге, отображается всплывающее окно, чтобы предупредить вас, что макросы существуют и были отключены.

'Отключить все макросы, кроме макросов с цифровой подписью

  • Этот параметр позволяет запускать макросы из доверенных источников. Все остальные макросы не запускаются. Когда вы открываете новую книгу Excel, вы не предупреждает о том, что он содержит макросы, поэтому вы не можете быть в курсе что это причина, по которой рабочая книга работает не так, как ожидалось.

"Включить все макросы"

  • Этот параметр позволяет запускать все макросы. Когда вы открываете новый Excel в книге вы не предупреждены о том, что он содержит макросы и может не знать о запуске макросов, пока вы открываете файл.

Если вы доверяете макросам и согласны с их включением, выберите эту опцию:

"Включить все макросы"

и это диалоговое окно не должно отображаться для макросов.

Что касается диалогового окна для сохранения, отметив, что это было выполнено в Excel для Mac 2011, я столкнулся с следующим вопросом о SO, fooobar.com/questions/495118/.... Из него удаление диалогового окна кажется невозможным, за исключением, возможно, некоторых симуляторов ввода клавиатуры. Я бы поставил еще один вопрос, чтобы узнать об этом. Извините, я мог бы получить вас на полпути. Другой вариант - использовать компьютер Windows с Microsoft Excel, хотя я не уверен, что это вариант для вас в этом случае.

Ответ 3

Решение: Макросы автоматизации

Похоже, вам будет полезно использовать утилиту автоматизации. Если бы вы использовали Windows-компьютер, я бы рекомендовал AutoHotkey. Я не использовал автоматические утилиты на Mac, но this Ask Different post имеет несколько предложений, хотя ни один из них не является бесплатным.

Это не решение VBA. Эти макросы работают за пределами Excel и могут взаимодействовать с программами с использованием штрихов клавиатуры, движений мыши и кликов.

В основном вы записываете или записываете простой макрос автоматизации, который ожидает, что диалоговое окно Excel "Сохранить как" станет активным, нажмите Enter/Return, чтобы завершить действие сохранения, а затем ждет закрытия окна "Сохранить как". Вы можете настроить его на непрерывный цикл, пока вы не закончите вручную макрос.

Вот простая версия Windows AutoHotkey script, которая выполнит то, что вы пытаетесь сделать на 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

Чтобы обойти подсказку Enable Macro, я предлагаю

Application.AutomationSecurity = msoAutomationSecurityForceDisable

Обязательно верните его по умолчанию, когда вы закончите

Application.AutomationSecurity = msoAutomationSecurityLow

Напоминание о том, что функция .SaveAs содержит все необязательные аргументы. Я рекомендую удалить CreatBackup:= False, поскольку это необязательно.

Наиболее интересным способом, я думаю, является создание объекта книги и доступ к свойству .SaveAs таким образом. Я не тестировал его, но вы никогда не используете Workbooks.Open рендеринг Application.AutomationSecurity неприменимо. Возможно, экономия ресурсов и времени.

Сказано, что я смог выполнить следующие действия без каких-либо уведомлений о Windows Excel 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\Qaru Questions\When changing type xlsm to 
    xlsx stop popup"

    Workbooks.Open ("Book1.xlsm")

    ActiveWorkbook.SaveAs Filename:= _
    "F:\VBA Macros\Qaru 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\Qaru 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

Вы пытались использовать параметр ConflictResolution: = xlLocalSessionChanges в методе SaveAs?

Итак:

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