Владимир Пользователь Сообщений: 8196 |
Здравствуйте. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Ёк-Мок Пользователь Сообщений: 1775 |
«on error resume next»? Удивление есть начало познания © Surprise me! |
Казанский Пользователь Сообщений: 8839 |
#3 14.04.2015 10:20:18 1 способ
2 способ
Если книга не открыта, она будет открыта, но в невидимом режиме, и лучше сделать ее видимой. Изменено: Казанский — 14.04.2015 10:23:31 |
||||
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
|
Владимир Пользователь Сообщений: 8196 |
#5 14.04.2015 11:06:36 Вроде ошибка исчезла, но теперь копирование на Лист «Шате-М» не происходит.
«..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
|
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#6 14.04.2015 11:20:22
Либо Open, либо GetObject Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Владимир Пользователь Сообщений: 8196 |
Спасибо большое. Заработало. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Hugo Пользователь Сообщений: 23251 |
Бывает GetObject() барахлит… Вдруг и неожиданно на файлах, которые (другие оттуда же) ранее открывались без проблем. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Тоже с этим сталкивался. Теперь всегда делаю через Workbooks.Open |
Владимир Пользователь Сообщений: 8196 |
Нет, при открытом файле «F:ЛогистикаКнига.XLSM» всё-таки не работает, при закрытом полный порядок. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для 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 Пользователь Сообщений: 23251 |
Ещё вариант — перебрать все открытые книги и у каждой проверить полный путь (совпадает ли с нужным) — так не спутаете книги, если у них одинаковые названия, но лежат в разных папках (и открыта например ненужная). |
Владимир Пользователь Сообщений: 8196 |
Да это в примере он называется просто Книга, а в реальности — Что пора заказать. Этот файл у меня постоянно открыт, т.к. он является основным рабочим. Поэтому его специально закрывать, чтоб скопировать туда данные будет очень неудобно. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Hugo Пользователь Сообщений: 23251 |
Вообще-то у меня нет никакой ошибки в первоначальном коде (и ранее помню не было ошибок). Проверьте путь. |
RAN Пользователь Сообщений: 7091 |
#23 14.04.2015 14:46:33
Код из #3 как раз именно для этого случая. |
||
Hugo Пользователь Сообщений: 23251 |
Да, там не ошибка выскакивает, а предупреждение, что если есть несохранённые изменения, то они будут потеряны при переоткрытии файла. Если же его только смотрели (или сохранились) — то всё происходит молча. |
Владимир Пользователь Сообщений: 8196 |
А там на строке With Sheets(«Шате-М») спотыкается. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Hugo Пользователь Сообщений: 23251 |
Где там? |
RAN Пользователь Сообщений: 7091 |
#27 14.04.2015 15:00:09
или
) |
||||
Владимир Пользователь Сообщений: 8196 |
Андрей, точно. Вот где собакин порылся. Приставку забыл. Спасибо. Теперь с открытой книгой тоже работает. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
#29 19.02.2016 11:49:11 Алексей, спасибо. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
|
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.
Открыта или закрыта книга 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 |
Открыть книгу если закрыта и активировать если открыта |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Хитрости »
4 Май 2011 93411 просмотров
Как проверить открыта ли книга?
Собственно суть темы отражена в названии. Как при выполнении кода из VBA узнать перед обращением к книге открыта она или нет? Ведь если книга закрыта, то обращение к ней вызовет ошибку, а если открывать без проверки — то это может повлечь за собой утерю данных, если предварительно эта книга не была сохранена. Ни один ни второй вариант, естественно, не устраивают. Я покажу два способа проверки через функции. Если функция вернет True — книга открыта, если False — закрыта. Для проверки функций используем проверочную процедуру Check_Open_Book:
Sub Check_Open_Book() If IsBookOpen("Книга1.xls") Then MsgBox "Книга открыта", vbInformation, "Сообщение" Else MsgBox "Книга закрыта", vbInformation, "Сообщение" 'открываем книгу Workbooks.Open "C:Книга1.xls" End If End Sub
Данная процедура вызывает функцию IsBookOpen, передавая ей в качестве параметра имя книги, «открытость» которой мы хотим проверить. Я приведу несколько вариантов самой функции IsBookOpen. Во всех вариантах действует один и тот же принцип: код любого из вариантов функции IsBookOpen необходимо скопировать и вставить в стандартный модуль. Модуль должен быть внутри той книги, в кодах которой планируется проверять открыта ли книга. Только тогда IsBookOpen будет доступна для вызова из любого кода этой же книги.
Если вдруг в момент выполнения на строке If IsBookOpen(«Книга1.xls») Then появится ошибка «Sub or function not defined» — значит функция IsBookOpen либо не была скопирована в стандартный модуль, либо она вообще не в стандартном модуле, а в модуле листа, формы или книги.
Вариант 1:
Function IsBookOpen(wbName As String) As Boolean Dim wbBook As Workbook For Each wbBook In Workbooks If wbBook.Name <> ThisWorkbook.Name Then If Windows(wbBook.Name).Visible Then If wbBook.Name = wbName Then IsBookOpen = True: Exit For End If End If Next wbBook End Function
Функция просматривает все открытые книги и если находит среди них книгу с указанным именем, то функция возвращает True. Есть небольшая особенность — функция исключает скрытые книги(это либо надстройки, либо PERSONAL.XLS). Так же из просмотра исключена та книга, в которой расположен сам код. Если Вам нужно проверить наличие книги независимо от её видимости, то необходимо просто заменить блок
If Windows(wbBook.Name).Visible Then If wbBook.Name = wbName Then IsBookOpen = True: Exit For End If
на одну строку(просто убрать лишнее условие проверки)
If wbBook.Name = wbName Then IsBookOpen = True: Exit For
Либо можно использовать
Вариант 2:
Function IsBookOpen(wbName As String) As Boolean Dim wbBook As Workbook: On Error Resume Next Set wbBook = Workbooks(wbName) IsBookOpen = Not wbBook Is Nothing End Function
Данный способ обращается к любой открытой книге, даже если она скрыта как PERSONAL.XLS или надстройка. Однако у данной функции есть недостаток — используется оператор On Error и если в настройках VBA(Tools —Options -вкладка General) установлено Break on All Errors — то этот код не сработает, если книга не открыта — получим ошибку. В то время как Вариант1 с циклом по всем открытым книгам сработает без ошибок.
Вариант 3:
По просьбам читателей решил добавить код, который проверяет открыта ли книга независимо от её месторасположения и используемого приложения Excel. Книга может быть открыта другим пользователем (если книга на сервере), в другом экземпляре Excel или в этом же экземпляре Excel.
Function IsBookOpen(wbFullName As String) As Boolean Dim iFF As Integer, retval As Boolean iFF = FreeFile On Error Resume Next Open wbFullName For Random Access Read Write Lock Read Write As #iFF retval = (Err.Number <> 0) Close #iFF IsBookOpen = retval End Function
Функция несколько отличается от приведенных выше — передается в неё не только имя книги, а полный путь к книге, включая имя и расширение:
Sub Test() MsgBox "Файл 'Книга1'" & IIf(IsBookOpen("C:Книга1.xls"), " уже открыт", " не занят") End Sub
Или более близкий к жизненной ситуации вариант: надо открыть книгу, внести в книгу изменения, сохранить и закрыть. Если книга кем-то уже открыта — получим ошибку на этапе сохранения или запрос на этапе открытия. Поэтому сначала проверяем доступность книги и если она доступна — вносим изменения и сохраняем.
Sub Test() Dim sWBFullName As String Dim wb As Workbook 'полный путь к проверяемой книге sWBFullName = "C:DocumentsКнига1.xls" 'если книга кем-то открыта - пропускаем обработку этой книги 'книга закрыта - вносим изменения, сохраняем, закрываем If IsBookOpen(sWBFullName) = False Then Set wb = Application.Workbooks.Open(sWBFullName) 'изменяем значение ячейки "A1" на первом листе книги wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru" ws.Close True End If End Sub
При использовании функции IsBookOpen так же надо учитывать, что она может посчитать книгу открытой не только если она реально кем-то открыта, а если к ней просто нет доступа(например, заблокирован доступ со стороны администратора и т.п.).
Также см.:
Как получить данные из закрытой книги?
Как узнать существует ли лист в книге?
Как узнать существует ли модуль в книге
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Нужно узнать открыт ли в Excele нужный мне файл или нет. Если открыт то активизировать его и работать с ним. А вообще даже не знаю как проверить запущен ли сам Excel.
Проблема в том, что vba крутится под другим приложением, хотя наверно это не проблема.
8 ответов
18K
06 июля 2007 года
pavel55
79 / / 14.05.2007
Я бы сделал бы так
Код:
Sub Макрос1()
Dim WB As Workbook
Dim myWorkBook As String
myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
On Error Resume Next
Windows(myWorkBook).Activate
If Err.Number = 9 Then
MsgBox «Книга » & myWorkBook & » не открыта!», , «»
End If
On Error GoTo 0
End Sub
или так
Код:
Sub Макрос2()
Dim WB As Workbook
Dim myWorkBook As String
myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
For Each WB In Application.Workbooks
If WB.Name = myWorkBook Then
Windows(WB.Name).Activate
End
End If
Next
If ActiveWorkbook.Name <> myWorkBook Then MsgBox «Книга » & myWorkBook & » не открыта!», , «»
End Sub
10K
09 июля 2007 года
NaeR
6 / / 06.04.2005
первый вариант работает на ура, но проблемы начинаются после нескольких программных пусков excel’я и ручных закрытий. потом он перестаёт его видеть и начинает постоянно открывать новые копии книги. со вторым вариантом дело обстоит также.
пробовал на двух машинах 2k sp4 и xp sp2. excel 2003(11).
31K
12 июля 2007 года
migor69
1 / / 09.07.2007
dim EX as Excel.Application
Dim WB As Workbook
………………………………
………………………….
открытие книги…
……работа
закрытие и сохранение книги
EX.Quit..Закрытие Excel …………Иначе книга остается открытой
15K
16 июля 2007 года
vkodor
41 / / 04.07.2006
Код:
Public Function WorkbookIsOpen(wbname) As Boolean
‘проверка открыт фаил или нет
Dim x
On Error Resume Next
Set x = Workbooks(wbname)
If Err = 0 Then WorkbookIsOpen = True
Set x = Nothing
End Function
10K
19 июля 2007 года
NaeR
6 / / 06.04.2005
проблема в том что всеми этими способами я не вижу была ли открыта книга до того как была запущена моя программа. а это очень важно т.к. книга повторно откроется только для чтения, а мне надо писать в неё данные каждые 2 часа. запретить открывать книгу я тоже не могу т.к. она может быть нужна для просмотра данных.
может есть какие другие способы, через winapi или еще как, чтобы можно было 100% определить открыта ли книга и если да то писать в неё
6.4K
19 июля 2007 года
Host
122 / / 22.09.2005
проблема в том что всеми этими способами я не вижу была ли открыта книга до того как была запущена моя программа…
Проверяй на существование экземпляр Excel.
Код:
Function CheckWorksheet(strName As String) As Boolean
On Error Resume Next
Dim pExcel As Excel.Application
‘Получаем объект
Set pExcel = GetObject(class:=»Excel.Application»)
If Not pExcel Is Nothing Then
Dim wb As Workbook
‘Проверяем наличие открытой книги
Set wb = pExcel.Workbooks(strName)
If Not wb Is Nothing Then
CheckWorksheet = True
Else
CheckWorksheet = False
End If
Exit Function
End If
CheckWorksheet = False
End Function
10K
20 июля 2007 года
NaeR
6 / / 06.04.2005
Host спасибо! похоже твой вариант работает. я уже было чуть не отчаялся
10K
21 июля 2007 года
NaeR
6 / / 06.04.2005
Host можешь объяснить какая разница между твоим примером и остальными, почему твой работает а предыдущие нет. хотя по логике вещей работать должны все примеры