Vba excel проверить открыта ли книга

Обновлено: 12.05.2024

В VBA я программно открыл файл MS Excel с именем «myWork.XL».

Для своих приложений я обычно хочу работать с книгой, а не просто определять, открыта ли она. В этом случае я предпочитаю пропустить Булевой функции и просто вернуть книгу.

Если он открыт, он будет в коллекции Workbooks:

Я бы пошел с этим:

в качестве sFileName вы должны указать прямой путь в файл, например:

Что делать, если вы хотите проверить, не создавая еще один экземпляр Excel?

Например, у меня есть макрос Word (который запускается повторно) который должен извлекать данные из электронной таблицы Excel. Если электронная таблица уже открыта в существующем экземпляре Excel, я бы предпочел не создавать новый экземпляр.

Благодаря MikeTheBike и kirankarnati

Это немного легче понять:

Проверить эту функцию

Как быстро проверить, находится ли файл (книга) открыт или закрыт в Excel?

Как быстро проверить, есть ли файл (w orkbook) открыт или закрыт в Excel?

Ежедневная работа в Excel, вы одновременно открываете несколько книг для работы, но иногда сотни книг могут запутать вашу голову, чтобы вспомнить, если конкретная книга открыто или закрыто. Откажитесь от традиционного метода проверки файлов по одному, здесь я познакомлю вас с приемами, позволяющими быстро обнаружить, что книга открыта или закрыта.

Проверьте, открыта или закрыта книга с помощью VBA


Проверьте, открыта или закрыта книга, с помощью Kutools for Excel

Проверить, открыта ли книга или закрыто с помощью VBA

Вот код VBA, который вы можете запустить, чтобы проверить, открыта или закрыта конкретная книга.

1. Нажмите клавиши Alt + F11 , чтобы открыть окно Microsoft Visual Basic для приложений .

2. Нажмите Вставить > Module , а затем скопируйте и вставьте VBA в новое окно Module .

VBA: проверьте, открыта или закрыта книга.

3. И нажмите клавишу F5 , чтобы запустить этот vba, и появится диалоговое окно, напоминающее вам, открыта конкретная книга или нет.

Проверьте, открыта или закрыта книга с помощью Kutools for Excel

Если вы не знакомы с VBA, вы можете проверить, открыта ли книга с помощью Kutools for Excel , с его панелью навигации , которая поможет вы можете четко просматривать все открытые книги в списке книг на панели.

Бесплатная загрузка
Бесплатная полнофункциональная версия через 30 дней

После бесплатной установки Kutools for Excel, сделайте следующее:


1. Нажмите Kutools > Навигация , чтобы включить панель навигации. См. Снимок экрана:


2. Затем нажмите кнопку Книга и лист , чтобы развернуть панель и перейти в раздел Книга и лист . И вы можете просмотреть все открытые книги в верхнем списке. См. Снимок экрана:

С панелью навигации , вы также можете быстро переключаться между книгами или листами в списке.

Щелкните здесь, чтобы узнать больше о навигации.

Демо

Лучшие инструменты для повышения производительности офиса

Kutools for Excel решает большинство ваших проблем и увеличивает вашу производительность на 80%

Что делает макрос: При автоматическом открытии книги, необходимо учитывать, что может произойти при попытке открытия книги, которая уже открыта. Обычно Excel пытается открыть файл еще раз, с предупреждением, что любые несохраненные изменения будут потеряны. В VBA есть хороший инструмент, которые знает, как определить открыта ли книга, прежде чем пытаться открыть его снова.

Как макрос работает

Первое, что надо заметить, что это функция, а не процедура Sub. Мы проверяем файл, чтобы увидеть, назначен ли он переменной объекта. Только открытые книги могут быть присвоены переменной объекта. Когда мы пытаемся назначить закрытую книгу для переменной, возникает ошибка. Так что, если данная книга может быть назначена, книга открыта, если возникает ошибка, книга закрыта.

Код макроса

Как работает этот код

  1. Первое, что макрос делает – указывает переменную строку, содержащую имя файла, который выбирает пользователь. TestBook это имя переменной строки.
  2. В шаге 2, мы проверяем Excel на ошибки. В случае ошибки, возобновить код. Без этой строки код остановится при возникновении ошибки. Опять же, мы проводим тестирование данного файла, чтобы увидеть, назначен ли он переменной объекта. Поэтому, если данная книга может быть назначена, она открыта, если возникает ошибка, она закрыта. Если возникла ошибка, нам нужно знать код.
  3. На шаге 3, присваиваем книге переменную объекта TestBook. Сама строка переменной называется TargetWorkbook. TargetWorkbook передает функции в объявлении функции (см. первую строку кода). Данная функция устраняет необходимость жесткого кодирования имени книги, что позволяет нам передать его в качестве переменной.
  4. На шаге 4, проверяем, произошла ли ошибка. Если ошибки не произошло, книга открыта, поэтому мы устанавливаем FileIsOpenTest в True. Если произошла ошибка, это означает, что книга не открыта. В этом случае мы устанавливаем FileIsOpenTest значение false.

Код макроса

Как использовать

Чтобы реализовать этот макрос, вы можете скопировать и вставить в обе части кода в стандартном модуле:

Нужно узнать открыт ли в Excele нужный мне файл или нет. Если открыт то активизировать его и работать с ним. А вообще даже не знаю как проверить запущен ли сам Excel.

Проблема в том, что vba крутится под другим приложением, хотя наверно это не проблема.

Я бы сделал бы так

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

первый вариант работает на ура, но проблемы начинаются после нескольких программных пусков excel'я и ручных закрытий. потом он перестаёт его видеть и начинает постоянно открывать новые копии книги. со вторым вариантом дело обстоит также.

пробовал на двух машинах 2k sp4 и xp sp2. excel 2003(11).

dim EX as Excel.Application
Dim WB As Workbook
.
.
открытие книги.
. работа
закрытие и сохранение книги
EX.Quit..Закрытие Excel . Иначе книга остается открытой 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

проблема в том что всеми этими способами я не вижу была ли открыта книга до того как была запущена моя программа. а это очень важно т.к. книга повторно откроется только для чтения, а мне надо писать в неё данные каждые 2 часа. запретить открывать книгу я тоже не могу т.к. она может быть нужна для просмотра данных.

может есть какие другие способы, через winapi или еще как, чтобы можно было 100% определить открыта ли книга и если да то писать в неё


Пополняемый список полезных отрывков кода VBA для выполнения часто востребованных действий в MS Excel.

Служебные команды для ускорения скорости выполнения макроса:

Проверка имени пользователя, запустившего макрос:

Чтобы проверить, какой пользователь открыл книгу Excel можно использовать один из следующих вариантов:

Поиск последней строки таблицы:

Set myWSheet = ThisWorkbook.Sheets("Имя_листа") With myWSheet 'Определение индекса последней строки таблицы lastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'Определение значения в ячейки последней строке столбца A lastARow = .Range("A" &amp; lastRow).Value End With

Замена формулы на значение:

Добавление нового листа с именем после всех существующих:

Worksheets.Add (After:=Worksheets(Worksheets.Count)).Name = "Имя_листа"

Как узнать последний день предыдущего месяца:

LastMonthDay = DateAdd("d", -1, DateSerial(Year(dtDate), Month(dtDate), 1))

Определение оставшихся дней месяца:

dToEndOfMonth = DateDiff("d", dFrom, DateAdd("d", -1, _ DateSerial(Year(dFrom), Month(dFrom) + 1, 1)))

DayOfWeek = DatePart("w", dToday)

Создание нового файла из текущего:

pathNewBook = "C:\Temp" nameNewBook = "Имя_нового_файла.xls" Workbooks.Add ActiveWorkbook.SaveAs Filename:=pathNewBook & nameNewBook ActiveWorkbook.Close True

Сохранить текущий файл в формате CSV

Чтобы при сохранении файла в формате CSV, вместо запятых в качестве разделителя использовалась точка с запятой, следует использовать подобный код:

ActiveWorkbook.SaveAs FileName:="Name.csv", FileFormat:=xlCSV, _ CreateBackup:=False, Local:=True ActiveWorkbook.Saved = True ActiveWorkbook.Close True

Копирование данных из одного файла в другой:

wbPath = "C:\Temp\" wbName = "Имя_файла_откуда_копируем.xls" Workbooks.Open (wbPath & wbName) Set WB = Workbooks(wbName) WB.Sheets("Лист 1").Range("A1:С10").Copy Sheet("Лист_в_текущем_файле").Range("A2").PasteSpecial xlPasteValues

Чтобы открыть файл только для чтения, следует использовать:

Workbooks.Open (Filename:=wbPath & wbName, ReadOnly:=True)

Предотвращение ошибки при неудачном поиске значения в таблице:

Set DateRowObj = WB.Sheets("Имя_листа").Range("A:A")._ Find(What:=dtToAsDate, LookIn:=xlFormulas) If (DateRowObj Is Nothing) Then WB.Close False MsgBox "Данные не найдены." Else DateRow = DateRowObj.Row 'Номер строки с искомым значением End If

Как получить имя активной книги Excel без его расширения (без .xls либо без .xlsx):

wbName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)

Проверка существования файла:

fPath = "C:\Temp\" fName = "Файл.txt" If Dir(fPath & fName) = "" Then MsgBox "Файл не найден:" & Chr(13) & fPath & fName Exit Sub End If

Кнопка, скрывающая/разворачивающая часть таблицы:

Private Sub tbVid_Click() Application.ScreenUpdating = False If tbVid Then tbVid.Caption = "Скрыть" ActiveSheet.Rows("2:29").Hidden = False Else tbVid.Caption = "Развернуть" ActiveSheet.Rows("2:29").Hidden = True End If End Sub

Обновление сводной таблицы:

Обращение к элементам Frame:

Количество строк в отфильтрованной таблице:

Быстро убрать лишние пробелы в диапазоне:

Программно снять защиту с листа:

Работа с диапазоном

Умножить диапазон на число:

ThisWorkbook.Sheets(1).Range("A1:A10") = _ ThisWorkbook.Sheets(1).Evaluate("A1:A10" & "*80")

Добавить ко всем значениям диапазона строку:

Сортировка выбранного столбца в сводной таблице

Col = Selection.Column 'Номер выбранного столбца ColMax = ActiveSheet.PivotTables("СводнаяТаблица").PivotColumnAxis. _ PivotLines.Count If Col - 1 &lt;= ColMax And Col 1 Then ActiveSheet.PivotTables("СводнаяТаблица").PivotFields("Label").AutoSort _ xlDescending, " ", ActiveSheet.PivotTables("СводнаяТаблица"). _ PivotColumnAxis.PivotLines(Col - 1), 1 End If

Счетчик времени выполнения процедуры

Функция транслитерации с русского на английский

Поиск файлов в папке

Dim strDirPath, strMaskSearch, strFileName as String strDirPath = "C:/test/" 'Папка поиска strMaskSearch = "*.xls*" 'Маска поиска 'Получаем первый файл соответствующий шаблону strFileName = Dir(strDirPath & strMaskSearch) Do While strFileName <> "" 'До тех пор пока файлы "не закончатся" MsgBox strFileName strFileName = Dir 'Следующий файл Loop

Читайте также: