Visual basic excel если не открыт файл то открыть

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Здравствуйте.
Подскажите пожалуйста, как избавиться от ошибки. Если файл открыт, то не отрывать, если закрыт, то
Workbooks.Open FileName:=»F:ЛогистикаКнига.XLSM»

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Ёк-Мок

Пользователь

Сообщений: 1775
Регистрация: 16.01.2013

«on error resume next»?

Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#3

14.04.2015 10:20:18

1 способ

Код
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks("Книга.XLSM")
If Err Then 'книга не открыта
  Err.Clear
  Set wb = Workbooks.Open(Filename:="F:ЛогистикаКнига.XLSM")
End If
On Error GoTo 0
'...

2 способ

Код
Set wb = GetObject("F:ЛогистикаКнига.XLSM")
wb.Windows(1).Visible = True

Если книга не открыта, она будет открыта, но в невидимом режиме, и лучше сделать ее видимой.

Изменено: Казанский14.04.2015 10:23:31

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

#5

14.04.2015 11:06:36

Вроде ошибка исчезла, но теперь копирование на Лист «Шате-М» не происходит.
???

Скрытый текст

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#6

14.04.2015 11:20:22

Код
Set Wb = GetObject("F:ЛогистикаКнига.XLSM")
Wb.Windows(1).Visible = True 
Workbooks.Open FileName:="F:ЛогистикаКнига.XLSM"

Либо Open, либо GetObject

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Спасибо большое. Заработало.
:)

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Бывает GetObject() барахлит… Вдруг и неожиданно на файлах, которые (другие оттуда же) ранее открывались без проблем.
Ктоб сказал почему?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Тоже с этим сталкивался. Теперь всегда делаю через Workbooks.Open

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Нет, при открытом файле «F:ЛогистикаКнига.XLSM» всё-таки не работает, при закрытом полный порядок.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#11

14.04.2015 12:23:45

Как проверить открыта ли книга?

Берете оттуда функцию IsBookOpen. Далее:

Код
If IsBookOpen("Книга.XLSM")Then
    Set Wb = Workbooks("Книга.XLSM")
Else
    Set Wb = Workbooks.Open FileName:="F:ЛогистикаКнига.XLSM"
EndIf

и потом уже к Wb обращаетесь. Все должно работать.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#12

14.04.2015 13:13:32

Доброе время суток
Владимир, попробуйте такой функцией определить открыт ли файл

Код
Public Function IsFileOpen(ByVal FileName As String) As Boolean
On Error GoTo errHandle
    Dim fso As Object, pStream As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set pStream = fso.OpenTextFile(FileName, 8)
    pStream.Close
    IsFileOpen = False
Exit Function
errHandle:
    IsFileOpen = True
End Function
 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

#13

14.04.2015 13:37:27

IsBookOpen всё время артачится — ошибку выдаёт, чем только не обзывал — Boolean, Srting, Workbook, Name

Код
...
On Error Resume Next
    If IsBookOpen("Книга.xlsm") Then
        Set Wb = Workbooks("Книга.xlsm")
    Else
        Workbooks.Open FileName:="F:ЛогистикаКнига.xlsm"""
    End If
Set Wb = GetObject("F:ЛогистикаКнига.xlsm")
Wb.Windows(1).Visible = True
....

Изменено: Владимир14.04.2015 13:38:20

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#14

14.04.2015 13:49:00

Владимир, немного не так

Код
Public Sub Test()
    'если файл не открыт, то открыть его
    If Not IsFileOpen("F:ЛогистикаКнига.xlsm") Then
        Workbooks.Open FileName:="F:ЛогистикаКнига.xlsm"
        'иначе, по условию #1, ничего не делаем (не открываем)
    End If
End Sub
 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

Никак не пойму, зачем в данном случае огород с IsFileOpen?
В #3 вполне рабочий код, и без всяких выкрутасов.
Только не надо было его кастрировать, и применять оба способа одновременно.

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Андрей, теперь на IsFileOpen ругается. Да как же их объявить?

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#17

14.04.2015 14:00:17

RAN, А если файл открыт в другом экземпляре Excel?
Владимир, а как ругается? Для страховки код полностью

Код
Public Function IsFileOpen(ByVal FileName As String) As Boolean
On Error GoTo errHandle
    Dim fso As Object, pStream As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set pStream = fso.OpenTextFile(FileName, 8)
    pStream.Close
    IsFileOpen = False
Exit Function
errHandle:
    IsFileOpen = True
End Function

Public Sub Test()
    'если файл не открыт, то открыть его
    If Not IsFileOpen("c:IntelxlIns.xlsb") Then
        Workbooks.Open FileName:="c:IntelxlIns.xlsb"
        'иначе по условию #1 ничего не делаем (не открываем)
    End If
End Sub

с моими проверочными данными

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Открываю с web_a  исходный файл, параллельно открыт файл «Книга.xlsm» куда копируются данные. Запускаю макрос и происходит выделение «IsFileOpen»..

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#19

14.04.2015 14:20:02

Цитата
Андрей VG написал: RAN, А если файл открыт в другом экземпляре Excel?

А если на другом компьютере? :D
Тогда без огорода никак.
Конкретизировать надо, однако.

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Ещё вариант — перебрать все открытые книги и у каждой проверить полный путь (совпадает ли с нужным) — так не спутаете книги, если у них одинаковые названия, но лежат в разных папках (и открыта например ненужная).

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Да это в примере он называется просто Книга, а в реальности — Что пора заказать. Этот файл у меня постоянно открыт, т.к. он является основным рабочим. Поэтому его специально закрывать, чтоб скопировать туда данные будет очень неудобно.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Вообще-то у меня нет никакой ошибки в первоначальном коде (и ранее помню не было ошибок). Проверьте путь.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#23

14.04.2015 14:46:33

Цитата
Владимир написал: Этот файл у меня постоянно открыт, т.к. он является основным рабочим.

Код из #3 как раз именно для этого случая.

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Да, там не ошибка выскакивает, а предупреждение, что если есть несохранённые изменения, то они будут потеряны при переоткрытии файла. Если же его только смотрели (или сохранились) — то всё происходит молча.

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

А там на строке With Sheets(«Шате-М») спотыкается.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Где там? :)

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#27

14.04.2015 15:00:09

Код
With Wb.Sheets("Шате-М") 

или

Код
With oWb.Sheets("Шате-М"

)
В зависимости от того, в какой книге нужный лист.

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Андрей, точно. Вот где собакин порылся. Приставку забыл.
Вот я балбес..:D

Спасибо. Теперь с открытой книгой тоже работает.
Ребята, всем спасибо.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

#29

19.02.2016 11:49:11

Алексей, спасибо.
..давеча твой метод освоил.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

китин Дата: Среда, 17.02.2021, 08:29 | Сообщение № 10
Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

Ответить

dmtgrs Дата: Четверг, 18.02.2021, 10:43 | Сообщение № 11

Чтоб окно о повторном открытии не выскочило.

Макрос прекрасно работает! Огромное спасибо! В 2019 офисе все работает как часы! Но вот в 2010 офисе если открыть основной файл, из него открыть с помощью макроса второстепенный файл, во второстепенном файле внести какие то изменения, но еще не сохранить, то при работе макроса excel начинает ругаться, что второстепенный файл уже открыт и предупреждает, что если нажать «ОК» все несохранившиеся изменения потеряются. 2019 офис просто активирует второстепенный файл, тк он уже открыт, а 2010 офис посему то не активирует его, а пытается открыть заново

Чтоб окно о повторном открытии не выскочило.

Макрос прекрасно работает! Огромное спасибо! В 2019 офисе все работает как часы! Но вот в 2010 офисе если открыть основной файл, из него открыть с помощью макроса второстепенный файл, во второстепенном файле внести какие то изменения, но еще не сохранить, то при работе макроса excel начинает ругаться, что второстепенный файл уже открыт и предупреждает, что если нажать «ОК» все несохранившиеся изменения потеряются. 2019 офис просто активирует второстепенный файл, тк он уже открыт, а 2010 офис посему то не активирует его, а пытается открыть заново dmtgrs

Чтоб окно о повторном открытии не выскочило.

Макрос прекрасно работает! Огромное спасибо! В 2019 офисе все работает как часы! Но вот в 2010 офисе если открыть основной файл, из него открыть с помощью макроса второстепенный файл, во второстепенном файле внести какие то изменения, но еще не сохранить, то при работе макроса excel начинает ругаться, что второстепенный файл уже открыт и предупреждает, что если нажать «ОК» все несохранившиеся изменения потеряются. 2019 офис просто активирует второстепенный файл, тк он уже открыт, а 2010 офис посему то не активирует его, а пытается открыть заново Автор — dmtgrs
Дата добавления — 18.02.2021 в 10:43

Источник

Метод OpenTextFile

Открывает указанный файл и возвращает объект TextStream , который можно использовать для чтения, записи в файл или добавления к нему.

Синтаксис

object. OpenTextFile (filename, [ iomode, [ create, [ format ]]])

Синтаксис метода OpenTextFile состоит из следующих элементов.

Part Описание
object Обязательно. Всегда имя объекта FileSystemObject.
Имени файла Обязательно. Строковое выражение, определяющее файл, который будет открыт.
iomode Необязательный параметр. Указывает режим ввода-вывода. Может соответствовать одной из трех констант: ForReading, ForWriting или ForAppending.
создать Необязательный параметр. Значение типа Boolean, которое указывает, можно ли создать новый файл, если файл, указанный параметром filename, не существует. Значение True позволяет создать новый файл, а значение False — нет. По умолчанию используется значение False.
format Необязательный параметр. Одно из трех значений Tristate, используемых, чтобы указать формат открытого файла. Если отсутствует, открытый файл имеет формат ASCII.

Settings

Аргумент iomode может иметь любой из следующих параметров:

Константа Значение Описание
ForReading 1 Открытие файла только для чтения. Запись в этот файл невозможна.
ForWriting 2 Откройте файл только для записи. Используйте этот режим для замены существующего файла новыми данными. Невозможно выполнить чтение из этого файла.
ForAppending 8 Открытие файла и запись в конец файла. Невозможно выполнить чтение из этого файла.

Аргумент format может иметь одно из следующих значений.

Константа Значение Описание
TristateUseDefault –2 Открывает файл с помощью системного значения по умолчанию.
TristateTrue –1 Открывает файл в формате Юникод.
TristateFalse 0 Открывает файл в формате ASCII.

Замечания

В следующем коде показано использование метода OpenTextFile для открытия файла для добавления текста.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Метод Workbooks.Open (Excel)

Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.

Синтаксис

expression. Открыть (FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Разделитель, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)

Выражение Переменная, представляющая объект Workbooks .

Параметры

Имя Обязательный или необязательный Тип данных Описание
FileName Необязательный Variant Строка. Имя файла открываемой книги.
UpdateLinks Необязательный Variant Указывает способ обновления внешних ссылок (ссылок) в файле, например ссылки на диапазон в книге Budget.xls в следующей формуле =SUM([Budget.xls]Annual!C10:C25) . Если этот аргумент опущен, пользователю будет предложено указать, как будут обновляться ссылки. Дополнительные сведения о значениях, используемых этим параметром, см. в разделе Примечания.

Если Microsoft Excel открывает файл в формате WKS, WK1 или WK3 и аргумент UpdateLinks имеет значение 0, диаграммы не создаются; В противном случае Microsoft Excel создает диаграммы из диаграмм, присоединенных к файлу.

ReadOnly Необязательно устанавливать. Variant Значение true, чтобы открыть книгу в режиме только для чтения.
Format Необязательный Variant Если Microsoft Excel открывает текстовый файл, этот аргумент задает символ разделителя. Если этот аргумент опущен, используется текущий разделитель. Дополнительные сведения о значениях, используемых этим параметром, см. в разделе Примечания.
Password Необязательный Variant Строка, содержащая пароль, необходимый для открытия защищенной книги. Если этот аргумент опущен, а для книги требуется пароль, пользователю будет предложено ввести пароль.
WriteResPassword Необязательный Variant Строка, содержащая пароль, необходимый для записи в книгу, зарезервированную для записи. Если этот аргумент опущен, а книге требуется пароль, пользователю будет предложено ввести пароль.
IgnoreReadOnlyRecommended Необязательный Variant Значение true , чтобы Microsoft Excel не отображал рекомендуемое сообщение только для чтения (если книга была сохранена с параметром «Только для чтения рекомендуется «).
Происхождения Необязательный Variant Если файл является текстовым файлом, этот аргумент указывает, где он возник, чтобы кодовые страницы и возврат/строка каретки (CR/LF) можно было правильно сопоставить. Может быть одной из следующих констант XlPlatform : xlMacintosh, xlWindows или xlMSDOS. Если этот аргумент опущен, используется текущая операционная система.
Разделитель Необязательный Variant Если файл является текстовым файлом, а аргумент Format равен 6, этот аргумент представляет собой строку, указывающую символ, который будет использоваться в качестве разделителя. Например, используйте Chr(9) для вкладок, «,» для запятых, «;» для точки с запятой или используйте пользовательский символ. Используется только первый символ строки.
Изменяемость Необязательный Variant Если файл является надстройкой Microsoft Excel 4.0, этот аргумент имеет значение True , чтобы открыть надстройку, чтобы она была видимым окном. Если этот аргумент имеет значение False или опущен, надстройка открывается как скрытая и не может быть раскрыта. Этот параметр не применяется к надстройкам, созданным в Microsoft Excel 5.0 или более поздней версии.

Если файл является шаблоном Excel, значение True , чтобы открыть указанный шаблон для редактирования. Значение false , чтобы открыть новую книгу на основе указанного шаблона. Значение по умолчанию — False.

Уведомить Необязательный Variant Если файл не удается открыть в режиме чтения и записи, этот аргумент имеет значение True , чтобы добавить файл в список уведомлений о файлах. Microsoft Excel откроет файл как доступный только для чтения, опрашивает список уведомлений о файлах, а затем уведомляет пользователя, когда файл станет доступен. Если этот аргумент имеет значение False или опущен, уведомление не запрашивается, и любые попытки открыть недоступный файл завершатся ошибкой.
Конвертер Необязательный Variant Индекс первого преобразователя файлов, который следует попробовать при открытии файла. Сначала выполняется попытка указанного преобразователя файлов; Если этот преобразователь не распознает файл, все остальные преобразователи будут испытаны. Индекс преобразователя состоит из номеров строк преобразователей, возвращаемых свойством FileConverters .
AddToMru Необязательный Variant Значение true , чтобы добавить эту книгу в список недавно использовавшихся файлов. Значение по умолчанию — False.
Local Необязательный Variant Значение True сохраняет файлы на языке Microsoft Excel (включая параметры панели управления). Значение False (по умолчанию) сохраняет файлы на языке Visual Basic для приложений (VBA) (который обычно США английском языке, если проект VBA, из которого выполняется Workbooks.Open, не является старым проектом VBA с международной версией XL5/95).
Поврежденная загрузка Необязательный XlCorruptLoad Может быть одной из следующих констант: xlNormalLoad, xlRepairFile и xlExtractData. Поведение по умолчанию, если значение не указано, — xlNormalLoad и не пытается выполнить восстановление при инициировании с помощью OM.

Возвращаемое значение

Объект Workbook , представляющий открытую книгу.

Замечания

По умолчанию макросы включены при открытии файлов программным способом. Используйте свойство AutomationSecurity , чтобы задать режим безопасности макросов, используемый при программном открытии файлов.

Можно указать одно из следующих значений в параметре UpdateLinks , чтобы определить, обновляются ли внешние ссылки (ссылки) при открытии книги.

Значение Описание
0 Внешние ссылки (ссылки) не будут обновляться при открытии книги.
3 Внешние ссылки (ссылки) будут обновлены при открытии книги.

Можно указать одно из следующих значений в параметре Format , чтобы определить символ разделителя для файла.

Значение Разделитель
1 Вкладки
2 Запятыми
3 Пробелы
4 Точка с запятой
5 Отсутствует
6 Пользовательский символ (см. аргумент Разделитель )

Пример

В следующем примере кода открывается книга Analysis.xls, а затем выполняется ее макрос Auto_Open.

Следующий пример кода импортирует лист из другой книги на новый лист в текущей книге. Лист 1 в текущей книге должен содержать имя пути к книге для импорта в ячейку D3, имя файла в ячейке D4 и имя листа в ячейке D5. Импортированный лист вставляется после Листа1 в текущую книгу.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Читайте также:  Как настроить громкую связь на айфоне

Adblock
detector

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


Открыть книгу если закрыта и активировать если открыта

dmtgrs

Дата: Понедельник, 15.02.2021, 12:39 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Добрый день.
Есть главный файл Exсel (основной) и много файлов Excel (второстепенные) которые лежат в той же папке. Как сделать так, чтобы макрос в главном файле проверял отрыт ли второстепенный файл, если открыт, то просто активировать его, а если закрыт то открыть.

 

Ответить

Nic70y

Дата: Понедельник, 15.02.2021, 13:02 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

    On Error Resume Next
    Windows(«Êíèãà1.xls»).Activate
    Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]


ЮMoney 41001841029809

 

Ответить

Апострофф

Дата: Понедельник, 15.02.2021, 13:13 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

117

±

Замечаний:
0% ±


Excel 1997

[vba]

Код

    On Error Resume Next
    Windows(«Êíèãà1.xls»).Activate
    Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]

Может так?
[vba]

Код

    On Error Resume Next
    Windows(«Êíèãà1.xls»).Activate
    IF ERR THEN Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]
Чтоб окно о повторном открытии не выскочило.

 

Ответить

Nic70y

Дата: Понедельник, 15.02.2021, 13:48 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010


ЮMoney 41001841029809

 

Ответить

dmtgrs

Дата: Понедельник, 15.02.2021, 16:29 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Огромное всем спасисбо! Работает!

 

Ответить

RAN

Дата: Понедельник, 15.02.2021, 17:05 |
Сообщение № 6

Группа: Друзья

Ранг: Экселист

Сообщений: 5645


Но и заскакивает не открытая книга, а ее сохраненный экземпляр.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Nic70y

Дата: Понедельник, 15.02.2021, 19:35 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

Где это написано?


ЮMoney 41001841029809

 

Ответить

RAN

Дата: Понедельник, 15.02.2021, 19:45 |
Сообщение № 8

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Workbooks.Open Filename:=»D:Êíèãà1.xls»

книга открывается не зависимо от того, открыта она, или нет, а вот тут

 IF ERR THEN Workbooks.Open Filename:=»D:Êíèãà1.xls»

только при наличии ошибки (книга закрыта)

И попутно
в отличие от
[vba]

Код

Workbooks(«Êíèãà1.xls»).Activate

[/vba]
[vba]

Код

Windows(«Êíèãà1.xls»).Activate

[/vba]
выдаст ошибку, если книга открыта более, чем в одном окне. (Вид >> Новое окно)


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANПонедельник, 15.02.2021, 19:54

 

Ответить

probkinfeda

Дата: Среда, 17.02.2021, 07:34 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

5

±

Замечаний:
0% ±


Мне кажется что лучше будет так и никаких ошибок
[vba]

Код

Sub fdsg()
Dim XX As Workbook, ImaKnigi$
ImaKnigi$ = «Kniga1.xls»
For Each XX In Workbooks
If XX.Name = ImaKnigi Then XX.Activate: Exit Sub
Next XX
Workbooks.Open Filename:=ThisWorkbook.Path & «» & ImaKnigi
End Sub

[/vba]

 

Ответить

китин

Дата: Среда, 17.02.2021, 08:29 |
Сообщение № 10

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

probkinfeda, — Прочитайте Правила форума
— Оформите код тегами (в режиме правки поста выделите код и нажмите кнопку #, пояснялка здесь)


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

dmtgrs

Дата: Четверг, 18.02.2021, 10:43 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Может так?

[vba]

Код

On Error Resume Next
Windows(«Êíèãà1.xls»).Activate
IF ERR THEN Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]

Чтоб окно о повторном открытии не выскочило.

Макрос прекрасно работает! Огромное спасибо! В 2019 офисе все работает как часы! Но вот в 2010 офисе если открыть основной файл, из него открыть с помощью макроса второстепенный файл, во второстепенном файле внести какие то изменения, но еще не сохранить, то при работе макроса excel начинает ругаться, что второстепенный файл уже открыт и предупреждает, что если нажать «ОК» все несохранившиеся изменения потеряются. 2019 офис просто активирует второстепенный файл, тк он уже открыт, а 2010 офис посему то не активирует его, а пытается открыть заново

 

Ответить

Хитрости »

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(ToolsOptions -вкладка 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 можешь объяснить какая разница между твоим примером и остальными, почему твой работает а предыдущие нет. хотя по логике вещей работать должны все примеры

Понравилась статья? Поделить с друзьями:
  • Visual basic excel диапазон
  • Visual basic studio 2010 excel
  • Visual basic excel дата
  • Visual basic project in excel
  • Visual basic excel выпадающий список