Робот еще не может заменить человека полностью, поэтому бывают ситуации, когда человеку нужно вносить какие-то корректировки прямо в процесс выполнения макроса. Как это сделать?
Представим ситуацию, когда макрос в процессе своего выполнения использует какой-то файл, который либо называется всё время по-разному, либо лежит всё время в разных папках. Что делать? Прописать заранее его в макрос в такой ситуации мы не можем, а переименовывать каждый раз или переписывать путь в теле макроса лень или просто невозможно по каким-либо причинам.
В таком случае очень удобно сделать так, чтобы в процессе выполнения макрос запрашивал бы у вас выбрать его через стандартное окно выбора файла. Как это сделать?
Чтобы вы понимали, чего от вас ожидается, сначала лучше вывести msgbox, например, такой:
MsgBox ("Выберите нужный файл")
Затем нужно запомнить выбранный файл. Точнее в переменную помещается полное имя файла, т.е. включая весь путь:
bfName = Application.GetOpenFilename()
И после этого нам остается только открыть его:
Workbooks.Open(bfName)
В принципе, после того, как вы получили полное имя нужного файла, вы можете и не открывать его, а сделать что-то другое. Всё на ваше усмотрение.
По такому же принципу работает метод Application.GetSaveAsFilename(). Если в процессе работы макроса какой-то файл нужно сохранить и путь и имя файла нужно каждый раз задавать вручную, то удобно использовать этот метод. Он так же вызывает стандартное окно, записывает указанный пользователем путь в переменную, а потом под этим именем нужно сохранить файл:
bfName = Application.GetSaveAsFilename()
Workbooks.SaveAs(bfName)
Есть и другие способы "общения" пользователя с макросом. Например, очень полезным может оказаться окно подтверждения действия. Например, если макрос безвозвратно удаляет какие-то данные или если какое-то действие нужно делать не на всех перебираемых объектах (например, изменять не все кубы ). Особенно это полезно, когда программист и пользователь макроса - разные люди.
Итак, окно подтверждения вызывается так:
If MsgBox("Вы уверены, что хотите удалить все данные?", vbYesNo, "Confirm") = vbYes Then
MsgBox ("ok, i will do") ' т.е. код, выполняемый, если человек подтвердил выполнение
Else
MsgBox ("I will sleep") ' действие, если человек отменил выполнение.
End If
Обычно при отмене действия выдается просто сообщение о том, что макрос не будет выполнен и затем выход из программы. Но подобную конструкцию можно использовать и для получения макросом ответов на другие вопросы. Например, если существует кусок кода, который не всегда нужно выполнять.