Страницы: 1
RSS
Определить, есть ли лист в закрытой книге с заданным именем - VBA, если да то.....если нет то...
 

Добрый вечер, нужна помощь. Есть макрос, который отображает список файлов в определённой папке, как можно сделать чтоб в списке отображались только те файлы, в которых есть лист с именем “Лист3”.

Изменено: syned.tm - 23.11.2017 18:12:52
 
Открывать каждый файл и смотреть, какие листы в нём есть.
 
в закрытой - никак
открывать по очереди и проверять наличие требуемого листа
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
kalbasiatka написал: Открывать каждый файл и смотреть, какие листы в нём есть.
Это само собой, но их 100-400,  долго придется открывать
 
Доброе время суток.
Можно такой функцией спросить
Код
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 (Переделал, чтоб библиотеку не спрашивал)
 
Андрей VG, Вы очень выручили. Спасибо
 
Андрей VG, Не могли бы Вы сказать, как эта функция работает? Куда ее вставлять, какие у нее аргументы?
 
Цитата
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 - 27.11.2017 05:25:06
Чем шире угол зрения, тем он тупее.
 
SAS888, большое спасибо за вариант. Выпустил из головы, а ведь нет-нет, а пользуюсь таким доступом к данным.
 
SAS888, браво! Можно обойтись без тяжелой артиллерии! :)
Только я бы заменил 3 строку на
Код
arg = "'" & p & "\[" & f & "]" & s & "'!R1C1"
, т.к. адрес ячейки А1 и так известен, а выражение Range("A1").Range("A1").Address(, , xlR1C1) вызывает ошибку, если activesheet является листом-диаграммой.
 
Добрый день!

Есть файл шаблон, содержащий "рыбу" документов на отдельных листах книги. Есть сервер в локальной сети, на который необходимо сохранять данные из упомянутого файла-шаблона (либо целиком листы, либо отдельные диапазоны из него) в отдельный файл с именем формируемым в файле-шаблоне на его главном листе. В создаваемый файл с уникальным именем (например, артикул товара) по мере необходимости должны добавляться листы-диапазоны из файла-шаблона.
Проверку на существование уже созданного отдельного файла для конкретного товара я кое-как слепил, но вот проверку наличия в нём уже созданных листов никак не получается.
Функция, предложенная SAS888, почему то всё время выдаёт "ЛОЖЬ" даже когда требуемый лист в файле есть. М.б. проблема в обработке расширения файла? Сработала функция предложенная Андрей VG. Но, если файла такого вообще нет, то последняя также выдаёт ЛОЖЬ, что немного дезинформирует пользователя (нет файла, а не листа).
Вопрос такой, можно ли выполнять проверку наличия листа именно макросом, а не функцией, и затем, при наличии листа, открывать книгу, и переходить на этот лист, а если нет листа, открыть книгу (а если её нет, то запустить имеющийся макрос создания книги), скопировать лист (или диапазон) в эту книгу из файла-шаблона? Буду очень признателен, никак не могу найти подходящее решение.
 
Цитата
Sandero написал:
если файла такого вообще нет
функция формировалась для проверки существования листа в существующей книге. У вас другая прдзадача - проверить существование файла. Следовательно, бинарный ответ тут не возможен.
 
Sandero,
можно обратиться к любым данным, если эти данные существуют и у Вас достаточно прав для этого
создайте тему, опишите проблему (задачу) и Вам, скорее всего, помогут ее решить
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх