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

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

Код, который я пробовал, довольно много:

Application.DisplayAlerts = False

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

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

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

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

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 для Mac 2011, если это поможет.


person NJP    schedule 01.08.2014    source источник
comment
Это может сработать: mrexcel.com/forum/excel-questions/   -  person CactusCake    schedule 02.08.2014
comment
У меня уже есть рабочий код (который работает аналогично связанному коду, хотя мой повторяет цикл и таким образом выполняет сохранение), мне просто нужно подавить диалоговые окна.   -  person NJP    schedule 02.08.2014


Ответы (5)


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

As so:

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
person LetEpsilonBeLessThanZero    schedule 21.12.2017
comment
На самом деле Application.EnableEvents = False помог мне. Он отключает все события/всплывающие окна. - person IGRACH; 13.09.2018

Из Excel Macro Security — www.excelfunctions.net:

Макробезопасность в Excel 2007, 2010 и 2013:

.....

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

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

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

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

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

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

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

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

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

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

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

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

Что касается диалога для сохранения, заметив, что он работает в Excel для Mac 2011, я столкнулся со следующим вопросом на SO: StackOverflow — подавление диалогового окна при использовании VBA для сохранения макроса, содержащего файл Excel (.xlsm), как файла, не содержащего макросов (. xlsx). Из него удаление диалога кажется невозможным, за исключением, возможно, некоторой имитации ввода с клавиатуры. Я бы разместил еще один вопрос, чтобы узнать об этом. Извини, что смог помочь тебе только наполовину. Другой вариант — использовать компьютер Windows с Microsoft Excel, хотя я не уверен, что в данном случае это вариант для вас.

person jordanhill123    schedule 01.08.2014
comment
Отключение макросов сработало хорошо, но диалоговое окно «Сохранить» все еще появляется. - person NJP; 02.08.2014
comment
Я тоже не мог заставить этот пример работать. Похоже, что в рабочей книге копирования также есть макросы, что по-прежнему вызывает всплывающее диалоговое окно сохранения. - person NJP; 02.08.2014
comment
Похоже, проблема связана с Excel для Mac 2011. У меня нет этого приложения, но я посмотрю, смогу ли я придумать что-нибудь еще. - person jordanhill123; 02.08.2014
comment
@ jordanhill123 Ваш ответ очень длинный (поэтому на первый взгляд он кажется актуальным/полезным для начинающих пользователей), но на самом деле ничто в вашем ответе не связано с проблемой, кроме Edit 3, где вы нашли повторяющийся вопрос о переполнении стека. . Ничто из того, что вы скопировали из других источников в свой ответ, не имеет отношения к проблеме ОП, и поэтому ответ вреден, потому что он заставит будущих читателей тратить много времени на обдумывание ваших предложений, которые на самом деле не имеют отношения к проблема. Я проголосовал за удаление этого ответа. - person GSerg; 02.08.2014
comment
@GSerg Отредактировано, чтобы удалить весь контент, не относящийся к вопросу ОП. Оставлено исправление для удаления диалогового окна макроса безопасности и содержимого из дубликата. - person jordanhill123; 02.08.2014

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

Похоже, вам было бы полезно использовать утилиту автоматизации. Если вы используете ПК с Windows, я бы рекомендовал AutoHotkey. Я не использовал утилиты автоматизации на Mac, но это сообщение "Спроси у другого" есть несколько предложений, хотя ни одно из них не является бесплатным.

Это не решение 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
}
person ChrisB    schedule 11.07.2017

Чтобы обойти подсказку «Включить макрос», я предлагаю

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
person Joshua Fenner    schedule 21.09.2017

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

DoCmd.SetWarnings False

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

DoCmd.SetWarnings True

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

person tysonwright    schedule 12.01.2018