Добрый вечер, нужна помощь. Есть макрос, который отображает список файлов в определённой папке, как можно сделать чтоб в списке отображались только те файлы, в которых есть лист с именем “Лист3”.
Public Function ExistsSheet(ByVal FileName As String, ByVal SheetName As String) As Boolean
Dim pConn As Object
Dim pRset As Object
Set pConn = CreateObject("ADODB.Connection")
pConn.CursorLocation = 3
pConn.Open "DBQ=" & FileName & ";Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};ReadOnly=1;"
Set pRset = pConn.OpenSchema(20)
pRset.Filter = "TABLE_NAME = '" & SheetName & "$'"
ExistsSheet = pRset.RecordCount > 0
pRset.Close: pConn.Close
Set pRset = Nothing: Set pConn = Nothing
End Function
Успехов.
Изменено: Андрей VG - 23.11.2017 19:13:37(Переделал, чтоб библиотеку не спрашивал)
eska написал: Куда ее вставлять, какие у нее аргументы?
1. В обычный модуль. 2. Первый аргумент FileName - путь и имя файла-книги с расширением 3. SheetName - имя проверяемого на существование рабочего листа книги. 4. Возвращает True, если рабочий лист с таким именем в книге есть, иначе - False. Успехов.
Еще вариант: Перехватить ошибку и получить значение любой ячейки из требуемого листа закрытой книги. Если получилось - значит лист существует, иначе - не существует.
Код
Public Function ExistsSheet(ByVal p As String, ByVal f As String, s As String) As Boolean
Dim arg As String, q
arg = "'" & p & "\[" & f & "]" & s & "'!" & Range("A1").Range("A1").Address(, , xlR1C1)
On Error Resume Next
q = ExecuteExcel4Macro(arg)
If Err = 0 Then ExistsSheet = True Else ExistsSheet = False
On Error GoTo 0
End Function
Где p - путь к файлу (например "D:\Temp"), f - имя файла (например "Книга1.xlsx"), s - имя листа (например "Лист3").
SAS888, браво! Можно обойтись без тяжелой артиллерии! Только я бы заменил 3 строку на
Код
arg = "'" & p & "\[" & f & "]" & s & "'!R1C1"
, т.к. адрес ячейки А1 и так известен, а выражение Range("A1").Range("A1").Address(, , xlR1C1) вызывает ошибку, если activesheet является листом-диаграммой.
Есть файл шаблон, содержащий "рыбу" документов на отдельных листах книги. Есть сервер в локальной сети, на который необходимо сохранять данные из упомянутого файла-шаблона (либо целиком листы, либо отдельные диапазоны из него) в отдельный файл с именем формируемым в файле-шаблоне на его главном листе. В создаваемый файл с уникальным именем (например, артикул товара) по мере необходимости должны добавляться листы-диапазоны из файла-шаблона. Проверку на существование уже созданного отдельного файла для конкретного товара я кое-как слепил, но вот проверку наличия в нём уже созданных листов никак не получается. Функция, предложенная SAS888, почему то всё время выдаёт "ЛОЖЬ" даже когда требуемый лист в файле есть. М.б. проблема в обработке расширения файла? Сработала функция предложенная Андрей VG. Но, если файла такого вообще нет, то последняя также выдаёт ЛОЖЬ, что немного дезинформирует пользователя (нет файла, а не листа). Вопрос такой, можно ли выполнять проверку наличия листа именно макросом, а не функцией, и затем, при наличии листа, открывать книгу, и переходить на этот лист, а если нет листа, открыть книгу (а если её нет, то запустить имеющийся макрос создания книги), скопировать лист (или диапазон) в эту книгу из файла-шаблона? Буду очень признателен, никак не могу найти подходящее решение.
функция формировалась для проверки существования листа в существующей книге. У вас другая прдзадача - проверить существование файла. Следовательно, бинарный ответ тут не возможен.
Sandero, можно обратиться к любым данным, если эти данные существуют и у Вас достаточно прав для этого создайте тему, опишите проблему (задачу) и Вам, скорее всего, помогут ее решить
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!