Как определить открыта ли книга Excel пошаговое руководство

Открыта или закрыта книга Excel? Проверяем с помощью кода VBA по краткому или полному имени файла, используя объектную переменную, цикл или оператор Open.

Проверка по краткому имени

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

Использование объектной переменной

Вариант пользовательской функция VBA Excel, предназначенной для проверки, открыта или закрыта рабочая книга, путем определения результата присвоения ссылки на нее объектной переменной. Присвоение состоялось (BookOpenClosed = True) – книга открыта, произошла ошибка и присвоение не состоялось (BookOpenClosed = False) – книга закрыта.

FunctionBookOpenClosed(wbName AsString)AsBoolean

    DimmyBook AsWorkbook

    On ErrorResumeNext

        SetmyBook=Workbooks(wbName)

    BookOpenClosed=NotmyBook IsNothing

EndFunction

Аргумент функции:

  • WbName – краткое имя проверяемой рабочей книги.

Перебор открытых книг циклом

Этот вариант функции BookOpenClosed перебирает с помощью цикла все открытые книги Excel и проверяет их краткие имена на совпадение с кратким именем проверяемой книги. Совпадение найдено (BookOpenClosed = True) – книга открыта, совпадение не найдено (BookOpenClosed = False) – книга закрыта.

FunctionBookOpenClosed(wbName AsString)AsBoolean

    DimmyBook AsWorkbook

    ForEachmyBook InWorkbooks

        IfmyBook.Name=wbName Then

            BookOpenClosed=True

            ExitFor

        EndIf

    Next

EndFunction

В коллекцию Workbooks входят и скрытые книги, в том числе Личная книга макросов, и книга с функцией.

3 ответа

Лучший ответ

Я бы немного перевернул твой код

Заставить функцию Wb Open() f возвращать открытую книгу, если она найдена, через ее аргументы

Function wbOpen(wbName As String, wbO As Workbook) As Boolean On Error Resume Next Set wbO = Workbooks(wbName) wbOpen = Not wbO Is NothingEnd Function

И тогда в вашем основном коде просто перейдите:

MasterFile = Dir(path & “*Master data*.xls*”)If Not wbOpen(MasterFile, wb) Then Set wb = Workbooks.Open(path & “” & MasterFile)

Редактировать

Добавить расширенную версию для обработки книги с одинаковыми именами, но разными путями

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

Поэтому функция WbOpen() становится:

Function wbOpen(wbName As String, wbPath As String, wbO As Workbook) As Boolean On Error Resume Next Set wbO = Workbooks(wbName) On Error GoTo 0 ‘ restore error handling back If Not wbO Is Nothing Then ‘ in current excel session there already is an open workbook with same name (path excluded) as the searched one If wbO.path = wbPath Then ‘ the already open workbook has the same path as the searched one -> we got it! wbOpen = True Else ‘ the already open workbook has a different path from the searched one -> we must investigate … If MsgBox(“A workbook named after:” _ & vbCrLf & vbCrLf & vbTab & wbName _ & vbCrLf & vbCrLf & ” is already open but its path is different from:” _ & vbCrLf & vbCrLf & vbTab & wbPath _ & vbCrLf & vbCrLf & “If you want to open the new found one, the already open one will be closed” _ & vbCrLf & vbCrLf & vbCrLf & “Do you want to open the new found one?”, vbQuestion + vbYesNo) = vbYes Then wbO.Close True ‘ close the currently opened workbook with same name but different path from searched one ‘ the opening of the new one will be made in the main sub, after this function returning ‘False’ Else wbOpen = True ‘ you chose not to open the searched one and stay with the currently open one -> return ‘True’ to say you are done End If End If End IfEnd Function

И соответствующая часть вашего основного кода изменится на:

MasterFile = Dir(path & “*.xls*”)If Not wbOpen(MasterFile, path, wb) Then Set wb = Workbooks.Open(path & “” & MasterFile)

Описание функции

Функция =КНИГАОТКРЫТА(ИМЯ) определяет открыта ли заданная книга или нет. Если книга с указанным именем открыта, то функция возвратит значение ИСТИНА, если книга закрыта, то ЛОЖЬ. Функция имеет только один аргумент:

  • ИМЯ – название книги Excel (вместе с расширением), открытие которой необходимо проверить.

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

Пример

Пример проверки открытия книги.

Проверка открытия книги

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

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

Открыт ли файл?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.

Правила форума

Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут

закрыты

.

Читайте

требования к создаваемым темам

.

bam Начинающий
Начинающий   Сообщения: 17Зарегистрирован: 04.02.2008 (Пн) 19:56

Открыт ли файл?

Сообщение bam » 20.05.2008 (Вт) 20:13

Подскажите как узнать открыт ли файл?

Есть файл “qqq.txt”, лежит на “Комп3”. Есть две проги “П1” и “П2” (написанные на VB), которые запущены на компах “Комп1” и “Комп2”. Проги о существовании друг друга не знают. Как прогой “П1” определить открыт ли файл “qqq.txt” прогой “П2”?

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

В проге “П2” писал:

Код: Выделить всёPrivate F As Integer
Private Sub Form_Load()
   F = FreeFile
   Open “C:tools.pmf” For Input As F
   Timer1.Interval = 30000
   Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
   Close F
End Sub

В проге “П1” и в течении 30 секунд запускал ее:

Код: Выделить всёPrivate F As Integer
Private Sub Form_Load()
   F = FreeFile
   Open “C:tools.pmf” For Input As F
End Sub

но, данные действия не привели ни к какой ошибке.

ANDLL Великий гастроном
Великий гастроном Аватара пользователя
  Сообщения: 3450Зарегистрирован: 29.06.2003 (Вс) 18:55
  • ICQ

Сообщение ANDLL » 20.05.2008 (Вт) 20:35

CreateFile с SHARE_NONE

Гастрономия – наука о пище, о ее приготовлении, употреблении, переварении и испражнении.

Блог

bam Начинающий
Начинающий   Сообщения: 17Зарегистрирован: 04.02.2008 (Пн) 19:56

Сообщение bam » 20.05.2008 (Вт) 20:42

ANDLL, кодом помоги, а то я не работал с CreateFile.

Денис Доктор VB наук
Доктор VB наук Аватара пользователя
  Сообщения: 2734Зарегистрирован: 07.11.2006 (Вт) 13:55Откуда: Ейск, Краснодарский край
  • ICQ

Сообщение Денис » 21.05.2008 (Ср) 8:48

bam

VBA Help писал(а):Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

VBA Help писал(а):lock Optional. Keyword specifying the operations restricted on the open file by other processes: Shared, Lock Read, Lock Write, and Lock Read Write.

Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister Теоретик
Теоретик Аватара пользователя
  Сообщения: 2251Зарегистрирован: 28.06.2005 (Вт) 12:32Откуда: Алматы
  • Сайт
  • ICQ

Сообщение Twister » 21.05.2008 (Ср) 14:32

http://twister.rootkits.ru/articles/han … um.php#p_3

Это вариант локального перечисления хэндлов открытых файлов. Честно говоря, даже не знаю, будет ли присутствовать в полученном списке хэндл файла, открытого с другого компа. Но ты можешь это проверить – по идее должен.

А я все практикую лечение травами…

bam Начинающий
Начинающий   Сообщения: 17Зарегистрирован: 04.02.2008 (Пн) 19:56

Сообщение bam » 21.05.2008 (Ср) 20:12

Денис, громадное спасибо, именно то что нужно.

Денис Доктор VB наук
Доктор VB наук Аватара пользователя
  Сообщения: 2734Зарегистрирован: 07.11.2006 (Вт) 13:55Откуда: Ейск, Краснодарский край
  • ICQ

Сообщение Денис » 22.05.2008 (Чт) 8:32

bam
Пжалуйста.
Я может уже говорил, но повторюсь: Широко известно, что в vb6 нету офлайн-справки. Мой вариант решения – юзать hlp-файлы от vb5 или (если vb5 тоже нету под рукой) справку по VBA из Word например. Справка по office vba имеет неоспоримое преимущество – это контекстная справка, то есть мы тупо пишем Open в любом модуле и жмем F1. Появляется окошко с описанием. В hlp-файлах vb5 нужно уже юзать встроенный рубрикатор.

Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

bam Начинающий
Начинающий   Сообщения: 17Зарегистрирован: 04.02.2008 (Пн) 19:56

Сообщение bam » 24.05.2008 (Сб) 10:04

В продолжение разбора доступа к файлу.

Столкнулся с такой проблемой:

Открываю файл и блокирую его на запись

Код: Выделить всёOpen Adres For Append Lock Write As F

затем пытаюсь его программно скопировать с помощью FileCopy, а VB его не копирует, хотя если просто (в проводнике) скопировать, то копирует. В чем моя ошибка?

Хакер Телепат
Телепат Аватара пользователя
  Сообщения: 16374Зарегистрирован: 13.11.2005 (Вс) 2:43Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Сообщение Хакер » 24.05.2008 (Сб) 10:20

что в vb6 нету офлайн-справки.

С чего бы это?

—We separate their smiling faces from the rest of their body, Captain.
—That’s right! We decapitate them.

bam Начинающий
Начинающий   Сообщения: 17Зарегистрирован: 04.02.2008 (Пн) 19:56

Сообщение bam » 24.05.2008 (Сб) 10:27

Хакер, получается открытый файл средствали VB вообще нельзя скопировать?

Хакер Телепат
Телепат Аватара пользователя
  Сообщения: 16374Зарегистрирован: 13.11.2005 (Вс) 2:43Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Сообщение Хакер » 24.05.2008 (Сб) 10:28

bam
Не получается. Как ты на основании того, что фраза “в VB6 нет офлайн спраки” – ложь, сделал вывод, что нельзя скопировать файл?

—We separate their smiling faces from the rest of their body, Captain.
—That’s right! We decapitate them.

bam Начинающий
Начинающий   Сообщения: 17Зарегистрирован: 04.02.2008 (Пн) 19:56

Сообщение bam » 24.05.2008 (Сб) 10:30

Хакер

,

:)

залез в справку… и на FileCopy пишет,

Remarks

If you try to use the FileCopy statement on a currently open file, an error occurs.

Но ведь должен быть способ скопировать файл, если проводник его копирует…

bam Начинающий
Начинающий   Сообщения: 17Зарегистрирован: 04.02.2008 (Пн) 19:56

Сообщение bam » 01.06.2008 (Вс) 16:36

Ну что, никто не знает что ли?? не верю… помогите, плиз…

Wolfie Бывалый
Бывалый Аватара пользователя
  Сообщения: 213Зарегистрирован: 06.03.2006 (Пн) 18:52Откуда: Россия, Москва, СЗАО
  • ICQ

Сообщение Wolfie » 04.06.2008 (Ср) 3:56

Попробуй CopyFile из API

··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:> per asper ad astra
‘ASTRA’ answer: Path ‘ASPER’ Not Found
684 Errare humanum est!
C:> _

ZOD Обычный пользователь
Обычный пользователь   Сообщения: 75Зарегистрирован: 24.03.2004 (Ср) 19:54Откуда: Barnaul

Сообщение ZOD » 04.06.2008 (Ср) 18:52

Вот это должно помочь.

В модуль:

Код: Выделить всёPublic Const OPEN_EXISTING = 3
Public Const FILE_ATTRIBUTE_NORMAL = &H80&
Public Const GENERIC_READ = &H80000000

Public Declare Function CreateFile Lib “kernel32” _
            Alias “CreateFileA” _
            (ByVal lpFileName As String, _
            ByVal dwDesiredAccess As Long, _
            ByVal dwShareMode As Long, _
            ByVal lpSecurityAttributes As Long, _
            ByVal dwCreationDisposition As Long, _
            ByVal dwFlagsAndAttributes As Long, _
            ByVal hTemplateFile As Long) As Long
           
Public Declare Function CloseHandle Lib “kernel32” (ByVal hObject As Long) As Long

Сама функция проверки: если занят – false, нет – true.

Код: Выделить всё
Public Function IsFreeFile(ByVal sLongFileName As String) As Boolean
     Dim hfile As Long
     IsFreeFile = False
     hfile = CreateFile(sLongFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
     
     If hfile <> -1 Then
         IsFreeFile = True
     End If
     CloseHandle hfile
End Function

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Проверьте наличие файла с помощью Excel VBA

VBA Check File Exists помогает проверить, существует ли файл в Location с помощью Excel VBA. После упоминания пути к файлу на компьютере, что если кто-то удалит файл или изменит путь к папке с файлом, очевидно, что в этом случае наш код выдаст ошибку. Чтобы решить эту проблему, мы можем сделать одну вещь, прежде чем мы действительно откроем файл, мы можем проверить, существует ли упомянутый файл или нет.

В этой статье мы покажем вам, как проверить, существует ли указанный файл или нет.

Как проверить, существует файл или нет?

  • Как Excel VBA знает, существует ли файл или нет ??
  • По умолчанию это не может !!!
  • Так как же тогда ??
  • Нам нужно использовать функцию под названием «Dir», чтобы проверить, существует файл или нет.

Что делает функция DIR?

Функция VBA DIR возвращает имя имени файла с его расширением в указанном пути к папке. Если в папке нет файла, она возвращает пустую строку.

Таким образом, используя эту функцию, мы можем на самом деле проверить, существует файл или нет. Даже без функции DIR мы можем проверить, существует файл или нет. Мы увидим некоторые примеры ниже.

Как использовать файл проверки VBA в Excel?

Мы узнаем, как использовать функцию проверки наличия файлов VBA, с несколькими примерами в Excel.

Вы можете скачать этот файл Excel с шаблоном проверки VBA здесь – Шаблон проверки VBA с файлом Excel существует

Пример № 1 – файл проверки VBA существует

Хорошо, давайте напишем некоторый код, чтобы проверить, существует файл или нет. Выполните следующие шаги, чтобы написать код самостоятельно.

Шаг 1: Для этого перейдите в окно VBA и в меню «Вставка» выберите «Модуль», как показано ниже.

vba-check-file-exists.jpg.webp

Шаг 2: Запустите подпроцедуру.

Код:

Sub File_Example () End Sub

vba-check-file-exists-2.png.webp

Шаг 3: Определите переменную как String.

Код:

Sub File_Example () Dim FilePath As String End Sub

vba-check-file-exists-3.png.webp

Шаг 4: Теперь я хочу протестировать файл с именем «Глава-11. InputBoxes.xlsm ”в моем E-Drive”. Я назначу свой путь к файлу этой переменной.

Код:

Sub File_Example () Dim FilePath As String FilePath = “D: Test File.xlsx” End Sub

vba-check-file-exists-4.png.webp

Шаг 5: Теперь определите еще одну переменную для применения функции DIR.

Код:

Sub File_Example () Dim FilePath As String Dim FileExists As String FilePath = “D: Test File.xlsx” End Sub

vba-check-file-exists-5.png.webp

Шаг 6: Теперь для второй переменной откройте функцию DIR.

Код:

Sub File_Example () Dim FilePath As String Dim FileExists As String FilePath = “D: Test File.xlsx” FileExists = Dir (End Sub

vba-check-file-exists-6.png.webp

Шаг 7: Функция DIR требует путь к файлу. Поскольку мы уже присвоили путь к файлу переменной «FilePath», мы можем просто передать эту переменную в функцию DIR.

Код:

Sub File_Example () Dim FilePath As String Dim FileExists As String FilePath = “D: Test File.xlsx” FileExists = Dir (FilePath) End Sub

vba-check-file-exists-7.png.webp

Шаг 8: Теперь функция DIR возвращает только имя файла как «Глава-11. InputBoxes »из указанного пути к файлу. Итак, давайте покажем результат в окне сообщения.

Код:

Sub File_Example () Dim FilePath As String Dim FileExists As String FilePath = “D: Test File.xlsx” FileExists = Dir (FilePath) MsgBox FileExits End Sub

vba-check-file-exists-8.png.webp

Шаг 9: Теперь запустите макрос, чтобы увидеть результат.

vba-check-file-exists.gif

Поскольку в указанном пути существует файл, наша функция DIR отфильтровывает имя файла по огромному пути.

Шаг 10: Теперь я изменю имя файла на другое, чего нет в указанном пути.

Код:

Sub File_Example () Dim FilePath As String Dim FileExists As String FilePath = “D: File.xlsx” FileExists = Dir (FilePath) MsgBox (FileExists) End Sub

vba-check-file-exists-9.png.webp

Шаг 11: Если я сейчас запусту код, он вернет пустую строку в окне сообщения.

vba-check-file-exists-10.png.webp

Функция DIR лучше всего подходит для использования с оператором IF в VBA. Выше мы могли видеть только имя файла с его расширением, если оно существует, иначе мы могли видеть только пустую строку.

Пример № 2 – DIR с условием IF

Шаг 1: Но используя оператор IF с функцией DIR, мы можем изменить наши результаты. Для примера посмотрите на код ниже.

Код:

Sub File_Example1 () Dim FilePath As String Dim FileExists As String FilePath = “C: Users cba_28 Desktop Alex Final Input.xlsm” FileExists = Dir (FilePath) Если FileExists = “” Then MsgBox “, файл не существует в упомянутый путь “Else MsgBox” Файл существует в упомянутом пути “End If End Sub

vba-check-file-exists-11.png.webp

Шаг 2: Здесь условие IF проверяет, является ли значение переменной «FileExists» ничем («») или нет. Если значение переменной – ничто («»), то он вернет результат как «Файл не существует в указанном пути», либо он вернет результат как «Файл существует в указанном пути»

Ниже приведен пример того же скриншота.

vba-check-file-exists-12.png.webp

vba-check-file-exists-13.png.webp

Используя функцию DIR, мы можем проверить, существует файл или нет.

Рекомендуемые статьи

Это руководство к VBA Check File Exists. Здесь мы обсудим, как использовать функцию проверки наличия файла в Excel VBA, а также с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи –

  1. Функция копирования и вставки в VBA
  2. Функция подстроки Excel
  3. Индекс VBA вне диапазона
  4. Excel ISNUMBER Formula

Код макроса

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 ThenFileIsOpenTest = TrueElseFileIsOpenTest = FalseEnd IfEnd Function

Проверка по полному имени

Проверка по полному имени с помощью оператора Open позволяет узнать, открыта ли рабочая книга каким-либо другим процессом: текущим экземпляром Excel, в котором открыта книга с проверяющим кодом, другим экземпляром Excel или сторонним приложением.

FunctionBookOpenClosed(wbFullName AsString)AsBoolean

    Dimff AsInteger

    ff=FreeFile

        On ErrorResumeNext

        Open wbFullName ForRandom Access Read Write Lock Read Write As#ff

        Close#ff

    BookOpenClosed=(Err.Number<>0)

EndFunction

Аргумент функции:

  • wbFullName – полное имя проверяемой рабочей книги.

Эта функция открывает с помощью оператора Open файл проверяемой книги с разрешением чтения и записи (параметр access) и запретом чтения и записи, если этот файл уже открыт другим процессом (параметр lock).

Если файл уже открыт другим процессом, а указанный тип доступа (параметр access) не разрешен (параметр lock), операция открытия завершится с ошибкой, а выражение (Err.Number 0) возвратит значение True.

Примеры проверки состояния книги

По краткому имени

SubPrimer1()

    IfBookOpenClosed(“Книга1.xlsx”)Then

        MsgBox“Книга открыта”

    Else

        MsgBox“Книга закрыта”

    EndIf

EndSub

По полному имени

SubPrimer2()

    IfBookOpenClosed(“C:Папка1Папка2Папка3Книга1.xlsx”)Then

        MsgBox“Книга открыта”

    Else

        MsgBox“Книга закрыта”

    EndIf

EndSub

Код макроса

Sub MacroOtkritaLiKniga()’Шаг 1: Определить переменную строки.Dim FName As VariantDim FNFileOnly As String’Шаг 2: Метод GetOpenFilename активизирует диалоговое окно.FName = Application.GetOpenFilename( _FileFilter:=”Excel Workbooks,*.xl*”, _Title:=”Выберите книгу, которую нужно открыть”, _MultiSelect:=False)’Шаг 3: Откройте файл, если он еще не открыт.If FName <> False ThenFNFileOnly = StrReverse(Left(StrReverse(FName), _InStr(StrReverse(FName), “”) – 1))If FileIsOpenTest(FNFileOnly) = True ThenMsgBox “Данный файл уже открыт”ElseWorkbooks.Open Filename:=FNameEnd IfEnd IfEnd Sub

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

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

  1. Активировать визуальный элемент базовый редактор, нажав клавиши Alt+F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши имя проекта или рабочей книги в окне проекта.
  3. Выбрать Вставку Модуля➜.
  4. Введите или вставьте код в созданный модуль.
  5. При необходимости можно назначить макрос для кнопки
Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...