Что делает макрос: При автоматическом открытии книги, необходимо учитывать, что может произойти при попытке открытия книги, которая уже открыта. Обычно Excel пытается открыть файл еще раз, с предупреждением, что любые несохраненные изменения будут потеряны. В VBA есть хороший инструмент, которые знает, как определить открыта ли книга, прежде чем пытаться открыть его снова.
Как макрос работает
Первое, что надо заметить, что это функция, а не процедура Sub. Мы проверяем файл, чтобы увидеть, назначен ли он переменной объекта. Только открытые книги могут быть присвоены переменной объекта. Когда мы пытаемся назначить закрытую книгу для переменной, возникает ошибка. Так что, если данная книга может быть назначена, книга открыта, если возникает ошибка, книга закрыта.
Код макроса
Function FileIsOpenTest(TargetWorkbook As String) As Boolean
'Шаг 1: Объявить переменные
Dim TestBook As Workbook
'Шаг 2: проверка на ошибки
On Error Resume Next
'Шаг 3: Попробуйте проверить книгу
Set TestBook = Workbooks(TargetWorkbook)
'Шаг 4: Если ошибки не произошло, книга уже открыта
If Err.Number = 0 Then
FileIsOpenTest = True
Else
FileIsOpenTest = False
End If
End Function
Как работает этот код
- Первое, что макрос делает – указывает переменную строку, содержащую имя файла, который выбирает пользователь. TestBook это имя переменной строки.
- В шаге 2, мы проверяем Excel на ошибки. В случае ошибки, возобновить код. Без этой строки код остановится при возникновении ошибки. Опять же, мы проводим тестирование данного файла, чтобы увидеть, назначен ли он переменной объекта. Поэтому, если данная книга может быть назначена, она открыта, если возникает ошибка, она закрыта. Если возникла ошибка, нам нужно знать код.
- На шаге 3, присваиваем книге переменную объекта TestBook. Сама строка переменной называется TargetWorkbook. TargetWorkbook передает функции в объявлении функции (см. первую строку кода). Данная функция устраняет необходимость жесткого кодирования имени книги, что позволяет нам передать его в качестве переменной.
- На шаге 4, проверяем, произошла ли ошибка. Если ошибки не произошло, книга открыта, поэтому мы устанавливаем FileIsOpenTest в True. Если произошла ошибка, это означает, что книга не открыта. В этом случае мы устанавливаем FileIsOpenTest значение false.
Это функция может быть использована для оценки любого файла, который передаст к нему, через его TargetWorkbook аргумент. Мы будем использовать затем эту функцию в макросе. Следующий макрос показывает, как реализовать эту функцию. Здесь мы используем одни и те же макросы, которые вы видели в предыдущем разделе, «Как открыть конкретную книгу, определенную пользователем», но на этот раз, мы создаем новую функцию FileIsOpenTest, чтобы убедиться, что пользователь не может открыть уже открытый файл.
Код макроса
Sub MacroOtkritaLiKniga()
'Шаг 1: Определить переменную строки.
Dim FName As Variant
Dim FNFileOnly As String
'Шаг 2: Метод GetOpenFilename активизирует диалоговое окно.
FName = Application.GetOpenFilename( _
FileFilter:="Excel Workbooks,*.xl*", _
Title:="Выберите книгу, которую нужно открыть", _
MultiSelect:=False)
'Шаг 3: Откройте файл, если он еще не открыт.
If FName <> False Then
FNFileOnly = StrReverse(Left(StrReverse(FName), _
InStr(StrReverse(FName), "\") - 1))
If FileIsOpenTest(FNFileOnly) = True Then
MsgBox "Данный файл уже открыт"
Else
Workbooks.Open Filename:=FName
End If
End If
End Sub
Как использовать
Чтобы реализовать этот макрос, вы можете скопировать и вставить в обе части кода в стандартном модуле:
- Активировать визуальный элемент базовый редактор, нажав клавиши Alt+F11 на клавиатуре.
- Щелкните правой кнопкой мыши имя проекта или рабочей книги в окне проекта.
- Выбрать Вставку Модуля➜.
- Введите или вставьте код в созданный модуль.
- При необходимости можно назначить макрос для кнопки