I have some code in VB that saves all XLSM files as XLSX. I already have the code that will do that for me, but dialog boxes show up for every action. This was fine for a few dozen files. However, I’m going to use this on hundreds of XLSM files at once, and I can’t just sit at my computer all day clicking dialog boxes over and over.
The code I’ve tried is pretty much:
Application.DisplayAlerts = False
While this doesn’t cause an error, it also doesn’t work.
The boxes give a warning about enabling macros, and also warn that saving as XLSX strips the file of all macros. Considering the type of warnings, I suspect that they’ve restricted turning off those dialog boxes due to the security risk.
Since I’m running this code in Excel’s VB editor, is there perhaps an option that will allow me to disable dialog boxes for debugging?
I’ve also tried:
Application.DisplayAlerts = False
Application.EnableEvents = False
' applied code
Application.DisableAlerts = True
Application.EnableEvents = True
Neither of those worked.
Edit:
Here’s what the code above looks like in my current code:
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
I also surrounded the For
loop, as opposed to the ActiveWorkbook.SaveAs
line:
Public Sub example()
For Each element In sArray
XLSMToXLSX(element)
Next element
End Sub
Finally, I shifted the Application.DisplayAlerts
above the Workbooks.Open
line:
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
None of those work as well.
Edit:
I’m using Excel for Mac 2011, if that helps.
Необходимо избавится от системных диалоговых окон. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
У меня есть код в 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, если это поможет.
5 ответов
Решение: макросы автоматизации
Похоже, вам было бы полезно использовать утилиту автоматизации. Если вы используете ПК с 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
}
0
ChrisB
11 Июл 2017 в 21:42
Чтобы обойти подсказку «Включить макрос», я предлагаю
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 MacrosStack Overflow QuestionsWhen changing type xlsm to
xlsx stop popup"
Workbooks.Open ("Book1.xlsm")
ActiveWorkbook.SaveAs Filename:= _
"F:VBA MacrosStack Overflow QuestionsWhen changing type xlsm to xlsx_
stop popupBook1.xlsx" _
, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close
Application.AutomationSecurity = msoAutomationSecurityLow
'make sure you set this up when done
Kill ("F:VBA MacrosStack Overflow QuestionsWhen changing type xlsm_
to xlsx stop popupBook1.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
0
Tim Cooper
22 Сен 2017 в 02:53
В Access VBA я использовал это, чтобы отключить все диалоги при запуске множества обновлений:
DoCmd.SetWarnings False
После запуска всех обновлений последний шаг в моем сценарии VBA:
DoCmd.SetWarnings True
Надеюсь это поможет.
0
tysonwright
12 Янв 2018 в 20:09
Из 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, хотя я не уверен, что в данном случае это вариант для вас.
0
Community
23 Май 2017 в 15:10
Пробовали ли вы использовать параметр 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
3
LetEpsilonBeLessThanZero
21 Дек 2017 в 23:30
Работа с диалогами
Несомненно каждый разработчик делает работу простого пользователя хоть немного, но проще. И конечно, порой просто необходима обратная связь от пользователя при выполнении некоторых программ. О ней и хочу сегодня рассказать.
Что я имею ввиду: есть ситуации, когда необходимо:
- сообщить пользователю о выполнении кода;
- получить от пользователя подтверждение на выполнение того или иного действия;
- запросить какие-то данные(число, текст для поиска, диапазон поиска и т.п.).
Простейшие запросы и подтверждения можно сделать при помощи уже встроенных диалоговых окон.
Из основных можно выделить три типа:
MsgBox — окно информирования пользователя с возможностью запроса действия (Да, Нет, Отмена и т.п.);
InputBox — окно запроса текстовой информации от пользователя (текст для поиска, дата, число и т.п.);
Application.InputBox — чуть более расширенная версия InputBox с возможностью указания не только текста и чисел, но и выделения диапазона ячеек (например для указания ячеек, в которых осуществлять поиск значения или которые необходимо закрасить).
ИНФОРМАЦИОННЫЙ ДИАЛОГ MSGBOX
Самый простой тип. Используется для информирования пользователя. Как правило применяется по окончании выполнения кода:
MsgBox Promt, [Buttons], [Title], [HelpFile], [Context]
Обязательным к указанию является только первый параметр — Promt , в котором указывается непосредственно сообщение для вывода:
MsgBox «Обработка завершена»
Все остальные параметры указывать не обязательно, но их использование несколько расширяет возможности данного диалогового окна.
Buttons — указывается тип выводимых кнопок и стиль окна. По умолчанию применяется vbOKOnly — одна только кнопка Ок:
‘показываем окно с кнопкой по умолчанию и типом важного сообщения MsgBox «Обработка завершена», vbCritical
Значение | Числовая константа | Описание |
---|---|---|
vbOKOnly | 0 | Отображает только кнопку OK |
vbOKCancel | 1 | Отображает кнопки ОК и Отмена |
vbAbortRetryIgnore | 2 | Отображает кнопки Прервать, Повтор и Пропустить |
vbYesNoCancel | 3 | Отображает кнопки Да, Нет и Отмена |
vbYesNo | 4 | Отображает кнопки Да и Нет |
vbRetryCancel | 5 | Отображает кнопки Повтор и Отмена |
vbCritical | 16 | Отображает значок важного сообщения |
vbQuestion | 32 | Отображает значок важного запроса |
vbExclamation | 48 | Отображает значок предупреждающего сообщения |
vbInformation | 64 | Отображает значок информационного сообщения |
vbDefaultButton1 | 0 | По умолчанию выделена первая кнопка |
vbDefaultButton2 | 256 | По умолчанию выделена вторая кнопка |
vbDefaultButton3 | 512 | По умолчанию выделена третья кнопка |
vbDefaultButton4 | 768 | По умолчанию выделена четвертая кнопка |
vbApplicationModal | 4098 | Все приложения приостанавливают свою работу до момента, пока пользователь ответит на запрос в окне сообщения (работает не во всех случаях) |
vbMsgBoxHelpButton | 16384 | Показываются кнопки Ок и Help |
Константы Buttons могут быть объединены между собой. Ниже приведен код, который показывает диалоговое окно с возможностью выбора одного из трех вариантов — Прервать, Повтор, Пропустить:
‘————————————————————————————— ‘ Procedure : test ‘ DateTime : 19.10.2014 19:24 ‘ Author : The_Prist(Щербаков Дмитрий) ‘ WebMoney — R298726502453; Яндекс.Деньги — 41001332272872 ‘ http://www.excel-vba.ru ‘ Purpose : Процедура показывает диалоговое окно с возможностью выбора одного из трех вариантов: ‘ Прервать, Повтор, Пропустить ‘ По умолчанию выделена кнопка Прервать, т.к. иное не указано ‘————————————————————————————— Sub test() Dim lRetVal As Long ‘для получения выбранного значения Retry_: lRetVal = MsgBox(«Обработка завершена», vbAbortRetryIgnore + vbQuestion) Select Case lRetVal Case vbAbort ‘3/Прервать/Abort Exit Sub ‘выходим из процедуры Case vbRetry ‘4/Повтор/Retry GoTo Retry_ ‘переход на метку Retry_ Case vbIgnore ‘5/Пропустить/Ignore End Select End Sub
Следующий код показывает то же окно, но по умолчанию выделяет кнопку Пропустить
‘————————————————————————————— ‘ Procedure : test ‘ DateTime : 19.10.2014 19:24 ‘ Author : The_Prist(Щербаков Дмитрий) ‘ WebMoney — R298726502453; Яндекс.Деньги — 41001332272872 ‘ http://www.excel-vba.ru ‘ Purpose : Процедура показывает диалоговое окно с возможностью выбора одного из трех вариантов: ‘ Прервать, Повтор, Пропустить ‘ По умолчанию выделена кнопка Пропустить(3-я по счету — значит vbDefaultButton3) ‘————————————————————————————— Sub test() Dim lRetVal As Long ‘для получения выбранного значения Retry_: lRetVal = MsgBox(«Обработка завершена», vbAbortRetryIgnore + vbQuestion + vbDefaultButton3) Select Case lRetVal Case vbAbort ‘3/Прервать/Abort Exit Sub ‘выходим из процедуры Case vbRetry ‘4/Повтор/Retry GoTo Retry_ ‘переход на метку Retry_ Case vbIgnore ‘5/Пропустить/Ignore End Select End Sub
Вместо текстового представления констант можно применить их числовые значения:
Sub test() Dim lRetVal As Long ‘для получения выбранного значения Retry_: lRetVal = MsgBox(«Обработка завершена», 2 + 32 + 512) Select Case lRetVal Case 3 ‘vbAbort Exit Sub ‘выходим из процедуры Case 4 ‘vbRetry GoTo Retry_ ‘переход на метку Retry_ Case 5 ‘vbIgnore End Select End Sub
Нетрудно после этого предположить, что можно указать просто сумму данных чисел:
MsgBox «Обработка завершена», 546
Доступные константы значений возврата:
Константа | Значение | Нажатая кнопка |
---|---|---|
vboK | 1 | ОК |
vbCancel | 2 | Отмена |
vbAbort | 3 | Прервать |
vbRetry | 4 | Повтор |
vblgnore | 5 | Пропустить |
vbYes | 6 | Да |
vbNo | 7 | Нет |
Title — указывается текст заголовка окна. Например, можно указать либо что это ошибка, либо имя своего приложения:
MsgBox «Обработка завершена», vbOKOnly, «Мое приложение»
HelpFile — указывается имя файла-справки в формате HLP. Применяется, если параметр Buttons указан как vbMsgBoxHelpButton . Файл справки должен существовать.
Context — целое число. Указывается индекс страницы файла-справки, которую необходимо открыть. Указывается только если указан параметр HelpFile .
Небольшой практический пример применения простого диалогового окна MsgBox.
Цель процедуры(макроса): очистить все ячейки листа.
Согласитесь, что неплохо бы перед этим запросить у пользователя решение — он согласен с этим и это является обдуманным решением или случайностью?
‘————————————————————————————— ‘ Procedure : ClearRange ‘ DateTime : 19.10.2014 20:06 ‘ Author : The_Prist(Щербаков Дмитрий) ‘ WebMoney — R298726502453; Яндекс.Деньги — 41001332272872 ‘ http://www.excel-vba.ru ‘ Purpose : ‘————————————————————————————— Sub ClearRange() Dim lRetVal As Long ‘для получения выбранного значения lRetVal = MsgBox(«Все данные выделенных ячеек будут удалены.» & _ Chr(10) & «Действительно хотите продолжить?», _ vbYesNo + vbQuestion, «Запрос на выполнение») If lRetVal = vbNo Then Exit Sub ‘выходим из процедуры без выполнения End If Selection.Clear End Sub
Так же на странице Полезные программы для Excel и VBA можно найти программу MsgBox Generator , которая просто и наглядно формирует коды показа MsgBox.
MsgBox, автоматически закрываемый по истечении указанного времени
Диалог MsgBox удобен, если надо проинформировать пользователя о каких-то событиях или предоставить ему выбор Да или Нет. Но в тоже время есть один недостаток: этот диалог не закроется, пока пользователь не нажмет хоть какую-то кнопку. Но бывает необходимо просто проинформировать и закрыть окно независимо от реакции пользователя. Показали окно, подождали секунд 5-7 и даже если пользователь ничего не нажал — закрыли окно и продолжили выполнение кода. Стандартно такой опции в MsgBox нет. Однако можно использовать функции API(это встроенные в ОС Windows функции, которые можно вызывать из любого языка программирования).
Код такого диалога:
Declare Function MessageBoxTimeOut Lib «User32» Alias «MessageBoxTimeoutA» _ (ByVal hwnd As Long, ByVal lpText As String, _ ByVal lpCaption As String, ByVal uType As VbMsgBoxStyle, _ ByVal wLanguageId As Long, ByVal dwMilliseconds As Long) As Long Sub AutoCloseMsgBox() Const lSeconds As Long = 5 MessageBoxTimeOut 0, «Отчет сформирован. Это окно закроется автоматически через 5 секунд», «www.excel-vba.ru», _ vbInformation + vbOKOnly, 0&, lSeconds * 1000 End Sub
Основную роль здесь играет строка:
Declare Function MessageBoxTimeOut Lib «User32» Alias «MessageBoxTimeoutA» _ (ByVal hwnd As Long, ByVal lpText As String, _ ByVal lpCaption As String, ByVal uType As VbMsgBoxStyle, _ ByVal wLanguageId As Long, ByVal dwMilliseconds As Long) As Long
это и есть сама функция, создающая MsgBox.
Главное: эта строка должна располагаться в самом верху стандартного модуля(в области объявлений, перед всеми процедурами и функциями).
Так же следует помнить, что это функция API и в некоторых версиях Excel именно в таком виде может не работать — вся строка будет подсвечена красным. Если проявился такой эффект, то можно просто добавить ключевое слово PtrSafe, отвечающее за совместимость функции с 64-битными ОС:
Declare PtrSafe Function MessageBoxTimeOut Lib «User32» Alias «MessageBoxTimeoutA» _ (ByVal hwnd As Long, ByVal lpText As String, _ ByVal lpCaption As String, ByVal uType As VbMsgBoxStyle, _ ByVal wLanguageId As Long, ByVal dwMilliseconds As Long) As Long
Помимо очевидного текста сообщения и заголовка, который можно заменить на свой, главное внимание уделим константе lSeconds . Она отвечает за количество секунд показа сообщения. В примере выше сообщение будет показано на 5 секунд, после чего закроется само собой, если ранее не была нажата кнопка Ок.
Если необходимо показать сообщение на 10 секунд, то надо лишь заменить 5 на 10:
Const lSeconds As Long = 10
Параметр uType работает точно так же, как параметр Buttons у стандартного MsgBox. Т.е. можно комбинировать различные виды кнопок и использовать этот MsgBox как стандартный, но при этом закрыть его автоматически, если пользователь случайно «уснул» или ему лень/некогда что-то нажимать:
Sub AutoCloseMsgBox() Const lSeconds As Long = 10 Dim retval retval = MessageBoxTimeOut(0, «Файлы обработаны. Вывести список?» & vbNewLine & _ «Если действие не будет выбрано окно закроется через 10 секунд», «www.excel-vba.ru», _ vbInformation + vbYesNo, 0&, lSeconds * 1000) If retval = 6 Then ‘была нажата кнопка Да(Yes) ‘выводим отчет Else ‘была нажата кнопка Нет(No) или окно закрылось само ‘другое действие End If End Sub
ДИАЛОГ ВВОДА ИНФОРМАЦИИ ПОЛЬЗОВАТЕЛЕМ — INPUTBOX
InputBox позволяет запросить от пользователя любую текстовую информацию.
InputBox Promt, [Title], [DefaultValue], [XPos], [YPos], [HelpFile], [Context]
Так же как и с MsgBox обязательным аргументом для указания является только Promt — это тот текст, который будет расположен непосредственно на самой форме диалога. Как правило это пояснение, что должен ввести пользователь.
Dim vRetVal ‘для получения выбранного значения vRetVal = InputBox(«Укажите значение для поиска:», «Запрос данных», «») If vRetVal = «» Then Exit Sub ‘завершаем процедуру, если строка пуста
Title — текст, отображаемый в заголовке окна. В приведенном выше примере это «Запрос данных».
DefaultValue — значение, которое будет показано в поле ввода до указания значения пользователем. Как правило оно указывается в случаях, когда требуемое значение изменяется редко по запросу пользователя, но возможность такую оставить все же требуется.
Пример: необходимо по нажатию кнопки удалять всегда столбец 5. Но иногда столбец в отчете смещается и требуется запрашивать у пользователя реальный номер столбца:
Sub DelCols() Dim vRetVal ‘для получения выбранного значения vRetVal = InputBox(«Укажите номер столбца для удаления(целое число):», «Запрос данных», 5) ‘используем Val для преобразования текста vRetVal в число ‘Val() преобразует число как текст в число. ‘Если указан текст(например «третий») — он будет преобразован в 0 vRetVal = Val(vRetVal) If Val(vRetVal) = 0 Then MsgBox «Номер столбца должен быть целым числом больше нуля!», vbCritical, «DelCols» Exit Sub End If Columns(vRetVal).Delete End Sub
Важно знать: InputBox всегда возвращает только текст. Даже если указать — 5 — он вернет «5». В некоторых случаях это может привести к ошибке типов данных, поэтому я привел выше один из примеров преобразования типов данных к нужному.
Так же по прошествии какого-то времени появится вопрос, как отследить нажатие кнопки Отмена. Ведь ориентир на vRetVal = «» не всегда верен, иногда надо принять пустое значение(в случаях, скажем, замены значений) и отследить именно нажатие Отмена. Сделать это можно так:
vRetVal = InputBox(«Укажите номер столбца для удаления(целое число):», «Запрос данных», «») If StrPtr(vRetVal) = 0 Then MsgBox «Нажата кнопка Отмена. Процедура прервана», vbCritical, «DelCols» Exit Sub End If
Больше всего вопросов здесь явно вызовет StrPtr . Эта специальная функция VBA, которая указывает, что переданы некие строковые данные. Если никаких данных не передавалось(а в случае с нажатием кнопки Отмена так и есть) указатель вернет 0. Если какие-то данные были переданы или нажата кнопка Ок(автоматом будет передана строка нулевой длины) — указатель StrPtr вернет значение отличное от нуля.
XPos — положение окна InputBox в твипах по горизонтали относительно левого края экрана. Следует учитывать, что именно относительно экрана, а не окна Excel.
YPos — положение окна InputBox в твипах по вертикали относительно верхнего края экрана.
HelpFile — указывается имя файла-справки в формате HLP. В отличие от MsgBox указание файла допускается при любых значениях. При этом к уже имеющимся в InputBox кнопкам добавляется еще одна — Help, которая и отвечает за вызов справки.
Context — целое число. Указывается индекс страницы файла-справки, которую необходимо открыть при нажатии кнопки Help. Указывается только если указан параметр HelpFile.
В дополнение приведу классический пример применения InputBox — выполнение процедуры только после введения пароля:
Sub ClearAllCells() Dim vRetVal vRetVal = InputBox(«Введите пароль:», «Авторизация», «») If StrPtr(vRetVal) = 0 Then ‘Нажата кнопка Отмена Exit Sub End If ‘если пароль неверный — завершаем процедуру без выполнения действий If vRetVal <> «1234» Then MsgBox «Введенный пароль неверный», vbCritical, «ClearAllCells» Exit Sub End If ‘будет выполнено только если введен правильный пароль — 1234 ‘полная очистка всех ячеек активного листа ActiveSheet.Cells.Clear End Sub
А вот еще один пример применения — запрос имени пользователя и запись его в лист LOG, чтобы можно было отследить кто и когда открывал файл. При этом если пользователь нажал Отмена, то книга закроется, а если не укажет имя пользователя — появится сообщение и заново запрос. И так до тех пор, пока имя пользователя не будет введено или не будет нажата кнопка Отмена:
Private Sub Workbook_Open() ‘ThisWorkbook — Обращение к книге с кодом ‘Но из модуля самой книги можно обращаться и проще — Me ThisWorkbook.Visible = False Dim user As String, lastrow As Long ‘цикл, пока не будут указаны данные пользователя Do While user = «» user = InputBox(«Введите имя пользователя:», «Авторизация», «») If StrPtr(user) = 0 Then MsgBox «Приложение будет закрыто», vbCritical, «Авторизация» ThisWorkbook.Close Exit Sub End If If user = «» Then MsgBox «Не указано имя пользователя!», vbCritical, «Авторизация» End If Loop With ThisWorkbook.Worksheets(«LOG») ‘получаем последнюю заполненную ячейку на листе «LOG» lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row ‘записываем имя пользователя .Cells(lastrow + 1, 1) = user ‘записываем время входа .Cells(lastrow + 1, 2) = Now End With End Sub
Что важно: этот код записывается в модуль ЭтаКнига(ThisWorkbook) и тогда при любом открытии книги будет появляться запрос на имя пользователя.
Так же некоторые примеры применения InputBox можно найти в статьях на сайте. Например:
Как удалить строки по условию?
Как массово изменить гиперссылки?
ДИАЛОГ ВВОДА ИНФОРМАЦИИ ПОЛЬЗОВАТЕЛЕМ — APPLICATION.INPUTBOX
В общем-то данный диалог мало отличается от обычного InputBox, за исключением типов возвращаемых данных. У данного диалога намного богаче функционал определения типов данных.
InputBox Promt, [Title], [DefaultValue], [Left], [Top], [HelpFile], [HelpContextID], [Type]
почти все параметры аналогичны таким же параметрам в InputBox.
Promt — текст, отображаемый на самой форме. Иначе говоря — сама суть показа диалога.
Title — текст, отображаемый в заголовке окна. В приведенном выше примере это «Запрос данных».
DefaultValue — значение, которое будет показано в поле ввода до указания значения пользователем.
Left — положение окна InputBox в поинтах по горизонтали относительно левого края экрана. В отличие от простого InputBox положение определяется на основании расположения самого окна Excel, а не экрана.
Top — положение окна InputBox в твипах по вертикали относительно верхнего края экрана.
HelpFile — указывается имя файла-справки в формате HLP. В отличие от MsgBox указание файла допускается при любых значениях. При этом к уже имеющимся в InputBox кнопкам добавляется еще одна — Help, которая и отвечает за вызов справки. Сам вызов справки осуществляется путем нажатия на иконку со знаком вопроса в заголовке диалога.
HelpContextID — целое число. Указывается индекс страницы файла-справки, которую необходимо открыть при нажатии кнопки Help. Указывается только если указан параметр HelpFile.
Type — целое число. Указывается одно из предустановленных значений, указывающих диалогу Application.InputBox тип данных, которые предполагается получить от пользователя. Ниже приведен листинг кода, демонстрирующий запрос данных всех типов с описанием ограничений и нюансов.
Dim vRetVal ‘для получения выбранного значения ‘запрос формулы — Type:=0 ‘возвращает либо произвольный текст, указанный в поле или ссылку на указанную ячейку в стиле R1C1 vRetVal = Application.InputBox(«Укажите формулу:», «Запрос данных», «», Type:=0) ‘запрос числа — Type:=1 ‘возвращает число. Не даст ввести текст, выдав сообщение об ошибке vRetVal = Application.InputBox(«Укажите любое число:», «Запрос данных», «», Type:=1) ‘запрос текст — Type:=2 ‘возвращает указанный текст. При указании числа оно будет в виде текста: 1=»1″ vRetVal = Application.InputBox(«Укажите любой текст:», «Запрос данных», «», Type:=2) ‘запрос логического значения True или False — Type:=4 ‘значение указывает в текущей локализации офиса ‘для русской это ИСТИНА или ЛОЖЬ ‘так же можно указать универсальные числовые константы — 1 или 0. 1 — ИСТИНА; 0 — ЛОЖЬ ‘Не даст ввести иные значения, выдав сообщение об ошибке ‘возвращает указанное логическое значение в английской локализации vRetVal = Application.InputBox(«Укажите ИСТИНА или ЛОЖЬ:», «Запрос данных», «», Type:=4) ‘запрос диапазона — Type:=8 ‘возвращает ссылку на диапазон ‘При получении такого значения обязательно следует использовать оператор Set ‘В противном случае вернет значение массива(Array), содержащего значения указанных ячеек ‘при указании через Set и нажатии Отмена будет ошибка VBA Set vRetVal = Application.InputBox(«Укажите диапазон для очистки ячеек:», «Запрос данных», «», Type:=8) ‘запрос значения ошибки #Н/Д — Type:=16 ‘всегда возвращает значение ошибки #Н/Д независимо от введенного значения vRetVal = Application.InputBox(«Укажите диапазон для очистки ячеек:», «Запрос данных», «», Type:=16) ‘запрос диапазона ячеек для создания массива — Type:=64 ‘возвращает массив ячеек с границами начала от 1(Option Base 1) ‘если указать всего одну ячейку vRetVal будет содержать значение этой ячейки, а не массив vRetVal = Application.InputBox(«Укажите диапазон для создания массива:», «Запрос данных», «», Type:=64)
Конечно, чаще всего используют Type:=8 , т.к. это избавляет от необходимости рисования своих форм и прочих заморочек для запроса указания диапазона от пользователя. Еще раз обращаю внимание, что для Type:=8 необходим ключевой оператор присвоения Set , т.к. в результате необходимо получить именно диапазон(т.е. объект). Ниже приведена процедура, которая запрашивает диапазон для очистки и корректно обрабатывает ситуацию при нажатии кнопки Отмена(т.е. не показывает никаких ошибок пользователю, а просто не выполняется). Стандартно при нажатии Отмена процедура завершается с ошибкой VBA вида Type Mismatch , что не очень грамотно с точки зрения взаимодействия с пользователем — он не должен видеть внутренние ошибки:
Источник
Безопасность макросов в Excel 2007, 2010 и 2013:.
…..
Различные типы файлов Excel, предоставляемые последними версиями
Excel дают понять, когда рабочая книга содержит макросы, поэтому это само по себе
является полезной мерой безопасности. Однако Excel также имеет дополнительные макросы
параметры безопасности, которые управляются через меню параметров. Эти
являются:
‘Отключить все макросы без уведомления’
-.
Эта настройка не позволяет запускать макросы. При открытии новой
рабочую книгу Excel, вас не предупреждают о том, что она содержит
макросы, поэтому вы можете не знать, что именно по этой причине рабочая книга
работает не так, как ожидалось.
‘Отключить все макросы с уведомлением’
-.
Эта настройка предотвращает запуск макросов. Однако если в программе есть
макросы в рабочей книге, отображается всплывающее окно, предупреждающее о том, что > макросы существуют и отключены.
макросы существуют и были отключены.
‘Отключить все макросы, кроме макросов с цифровой подписью’
-.
Эта настройка позволяет запускать только макросы из доверенных источников. Все остальные
макросы не запускаются. Когда вы открываете новую рабочую книгу Excel, вы не > > > предупреждаетесь о том.
предупреждается о том, что она содержит макросы, поэтому вы можете не знать.
что именно по этой причине рабочая книга работает не так, как ожидалось.
‘Включить все макросы’
-.
Этот параметр позволяет запускать все макросы. При открытии новой рабочей книги Excel
рабочую книгу, вы не предупреждаетесь о том, что она содержит макросы и
вы можете не знать о запущенных макросах, пока файл открыт.
и это диалоговое окно не будет отображаться для макросов.
Что касается диалога для сохранения, то, отметив, что это происходит в Excel для Mac 2011, я наткнулся на следующий вопрос на SO, StackOverflow — Suppress dialog when using VBA to save a macro containing Excel file (.xlsm) as a non macro containing file (.xlsx). Из него следует, что удаление диалога не представляется возможным, за исключением, возможно, некоторой имитации ввода с клавиатуры. Я бы опубликовал еще один вопрос, чтобы узнать об этом. Извините, что я смог помочь вам только наполовину. Другим вариантом может быть использование компьютера с Windows и Microsoft Excel, хотя я не уверен, что это возможно в данном случае.