Владимир Пользователь Сообщений: 8196 |
Здравствуйте. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Ёк-Мок Пользователь Сообщений: 1775 |
«on error resume next»? Удивление есть начало познания © Surprise me! |
Казанский Пользователь Сообщений: 8839 |
#3 14.04.2015 10:20:18 1 способ
2 способ
Если книга не открыта, она будет открыта, но в невидимом режиме, и лучше сделать ее видимой. Изменено: Казанский — 14.04.2015 10:23:31 |
||||
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
|
Владимир Пользователь Сообщений: 8196 |
#5 14.04.2015 11:06:36 Вроде ошибка исчезла, но теперь копирование на Лист «Шате-М» не происходит.
«..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
|
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#6 14.04.2015 11:20:22
Либо Open, либо GetObject Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Владимир Пользователь Сообщений: 8196 |
Спасибо большое. Заработало. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Hugo Пользователь Сообщений: 23249 |
Бывает GetObject() барахлит… Вдруг и неожиданно на файлах, которые (другие оттуда же) ранее открывались без проблем. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Тоже с этим сталкивался. Теперь всегда делаю через Workbooks.Open |
Владимир Пользователь Сообщений: 8196 |
Нет, при открытом файле «F:ЛогистикаКнига.XLSM» всё-таки не работает, при закрытом полный порядок. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#11 14.04.2015 12:23:45 Как проверить открыта ли книга?
Берете оттуда функцию IsBookOpen. Далее:
и потом уже к Wb обращаетесь. Все должно работать. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#12 14.04.2015 13:13:32 Доброе время суток
|
||
Владимир Пользователь Сообщений: 8196 |
#13 14.04.2015 13:37:27 IsBookOpen всё время артачится — ошибку выдаёт, чем только не обзывал — Boolean, Srting, Workbook, Name
Изменено: Владимир — 14.04.2015 13:38:20 «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#14 14.04.2015 13:49:00 Владимир, немного не так
|
||
RAN Пользователь Сообщений: 7091 |
Никак не пойму, зачем в данном случае огород с IsFileOpen? |
Владимир Пользователь Сообщений: 8196 |
Андрей, теперь на IsFileOpen ругается. Да как же их объявить? «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#17 14.04.2015 14:00:17 RAN, А если файл открыт в другом экземпляре Excel?
с моими проверочными данными |
||
Владимир Пользователь Сообщений: 8196 |
Открываю с web_a исходный файл, параллельно открыт файл «Книга.xlsm» куда копируются данные. Запускаю макрос и происходит выделение «IsFileOpen».. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
RAN Пользователь Сообщений: 7091 |
#19 14.04.2015 14:20:02
А если на другом компьютере? |
||
Hugo Пользователь Сообщений: 23249 |
Ещё вариант — перебрать все открытые книги и у каждой проверить полный путь (совпадает ли с нужным) — так не спутаете книги, если у них одинаковые названия, но лежат в разных папках (и открыта например ненужная). |
Владимир Пользователь Сообщений: 8196 |
Да это в примере он называется просто Книга, а в реальности — Что пора заказать. Этот файл у меня постоянно открыт, т.к. он является основным рабочим. Поэтому его специально закрывать, чтоб скопировать туда данные будет очень неудобно. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Hugo Пользователь Сообщений: 23249 |
Вообще-то у меня нет никакой ошибки в первоначальном коде (и ранее помню не было ошибок). Проверьте путь. |
RAN Пользователь Сообщений: 7091 |
#23 14.04.2015 14:46:33
Код из #3 как раз именно для этого случая. |
||
Hugo Пользователь Сообщений: 23249 |
Да, там не ошибка выскакивает, а предупреждение, что если есть несохранённые изменения, то они будут потеряны при переоткрытии файла. Если же его только смотрели (или сохранились) — то всё происходит молча. |
Владимир Пользователь Сообщений: 8196 |
А там на строке With Sheets(«Шате-М») спотыкается. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Hugo Пользователь Сообщений: 23249 |
Где там? |
RAN Пользователь Сообщений: 7091 |
#27 14.04.2015 15:00:09
или
) |
||||
Владимир Пользователь Сообщений: 8196 |
Андрей, точно. Вот где собакин порылся. Приставку забыл. Спасибо. Теперь с открытой книгой тоже работает. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
#29 19.02.2016 11:49:11 Алексей, спасибо. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Открыта или закрыта книга Excel? Проверяем с помощью кода VBA по краткому или полному имени файла, используя объектную переменную, цикл или оператор Open.
Проверка по краткому имени
Способ проверки по краткому имени, открыта ли рабочая книга, позволяет определить состояние проверяемой книги в том же экземпляре приложения Excel, в котором открыта книга с проверяющим кодом.
Использование объектной переменной
Вариант пользовательской функция VBA Excel, предназначенной для проверки, открыта или закрыта рабочая книга, путем определения результата присвоения ссылки на нее объектной переменной. Присвоение состоялось (BookOpenClosed = True) – книга открыта, произошла ошибка и присвоение не состоялось (BookOpenClosed = False) – книга закрыта.
Function BookOpenClosed(wbName As String) As Boolean Dim myBook As Workbook On Error Resume Next Set myBook = Workbooks(wbName) BookOpenClosed = Not myBook Is Nothing End Function |
Аргумент функции:
- wbName – краткое имя проверяемой рабочей книги.
Перебор открытых книг циклом
Этот вариант функции BookOpenClosed перебирает с помощью цикла все открытые книги Excel и проверяет их краткие имена на совпадение с кратким именем проверяемой книги. Совпадение найдено (BookOpenClosed = True) – книга открыта, совпадение не найдено (BookOpenClosed = False) – книга закрыта.
Function BookOpenClosed(wbName As String) As Boolean Dim myBook As Workbook For Each myBook In Workbooks If myBook.Name = wbName Then BookOpenClosed = True Exit For End If Next End Function |
В коллекцию Workbooks входят и скрытые книги, в том числе Личная книга макросов, и книга с функцией.
Проверка по полному имени
Проверка по полному имени с помощью оператора Open позволяет узнать, открыта ли рабочая книга каким-либо другим процессом: текущим экземпляром Excel, в котором открыта книга с проверяющим кодом, другим экземпляром Excel или сторонним приложением.
Function BookOpenClosed(wbFullName As String) As Boolean Dim ff As Integer ff = FreeFile On Error Resume Next Open wbFullName For Random Access Read Write Lock Read Write As #ff Close #ff BookOpenClosed = (Err.Number <> 0) End Function |
Аргумент функции:
- wbFullName – полное имя проверяемой рабочей книги.
Эта функция открывает с помощью оператора Open файл проверяемой книги с разрешением чтения и записи (параметр access) и запретом чтения и записи, если этот файл уже открыт другим процессом (параметр lock).
Если файл уже открыт другим процессом, а указанный тип доступа (параметр access) не разрешен (параметр lock), операция открытия завершится с ошибкой, а выражение (Err.Number <> 0) возвратит значение True.
Примеры проверки состояния книги
По краткому имени
Sub Primer1() If BookOpenClosed(«Книга1.xlsx») Then MsgBox «Книга открыта» Else MsgBox «Книга закрыта» End If End Sub |
По полному имени
Sub Primer2() If BookOpenClosed(«C:Папка1Папка2Папка3Книга1.xlsx») Then MsgBox «Книга открыта» Else MsgBox «Книга закрыта» End If End Sub |
|
I use extensive Excel-Word linking, updated manually with VBA code. If the Excel file is not open, Word attempts to open it, warns that opening it again is trouble, requires a dialog box be answered, then go to the next link and starts again. Since there are usually 100 links, this is a big problem.
I found simple VBA code that calls a function to check if Excel is running.
Dim sApp As String
sApp = "Excel.Application"
If IsAppRunning(sApp) = True Then
MsgBox "Excel is Running, continue" & SourceFileName
Else
MsgBox "Excel is NOT Running, abort"
Exit Sub
End If
I want to check if the RIGHT Excel file is open. The «right» file will have the same name as the Word file, e.g., MyDocSample.doc will be linked to MyDocSample.xls.
If MyDocSample.xls is open, then continue, if not, a warning should be posted saying «MyDocSample.xls» is not open, and offer an Abort selection.
На чтение 3 мин. Просмотров 4.3k.
Что делает макрос: При автоматическом открытии книги, необходимо учитывать, что может произойти при попытке открытия книги, которая уже открыта. Обычно 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 на клавиатуре.
- Щелкните правой кнопкой мыши имя проекта или рабочей книги в окне проекта.
- Выбрать Вставку Модуля➜.
- Введите или вставьте код в созданный модуль.
- При необходимости можно назначить макрос для кнопки