powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / определить наличие листа не открывая книгу EXCEL
23 сообщений из 23, страница 1 из 1
определить наличие листа не открывая книгу EXCEL
    #36777476
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые знатоки !

имя листа известно

не открывая книгу EXCEL,
как можно узнать - есть в ней этот лист ?

спасибо
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36777513
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MX-9,

легко :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Sub GetTables()

    Dim cat As New ADOX.Catalog
    Dim cn As New ADODB.Connection
    Dim tbl As ADOX.Table
    
    
    Set cn = New ADODB.Connection
    
    Cells.Clear
    strSourceFile = GetFileName  ' это моя функция возвращает диалог по открытию файла, 
                                            'если путь знаете то не нужна
    If strSourceFile = "" Then strSourceFile = "С:\temp.xls"
     Cells( 1 ,  3 ) = strSourceFile
    
    cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DriverId=790;ReadOnly=True;" & "DBQ=" & strSourceFile & ";"
  
  x =  0 
 
        Set cat.ActiveConnection = cn
        
        For Each tbl In cat.Tables
                x = x +  1 
                Cells(x,  2 ) = tbl.Type
                Cells(x,  1 ) = tbl.Name
        Next
        
        Set cat.ActiveConnection = Nothing
 
    
    cn.Close
    Set cn = Nothing
    
End Sub

адо ext 2.8 не забудьте подключить
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36777528
nilem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MX-9,

Пишем в ячейку формулу, например, ='D:\Документы\[Книга1.xlsm]Лист8'!$A$1
Если есть Лист8, то будет значение, если нет - #ССЫЛКА!
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36777600
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nilemMX-9,

Пишем в ячейку формулу, например, ='D:\Документы\[Книга1.xlsm]Лист8'!$A$1
Если есть Лист8, то будет значение, если нет - #ССЫЛКА!

проверять приходится c десяток книг
- как лучше менять варианты формулы программно ?
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36777603
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

спасибо
покрутим
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36778899
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nilem,

Ваш способ,
но из VBA-программы через EVALUATE (....)
не получается
выдает "Error 23"
лист есть в книге или нет - без разницы

подстановка этой формулы в ячейку программным способом
- тоже ноль эффекта

работает только вручную
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36778930
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MX-9,

Моим способом должно все легко получится. Возвращаются все таблицы объекта.
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36778945
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Dim cn As New ADODB.Connection

не проходит в моем EXCEL-2007

USER-DEFINED TYPE NOT DEFINED
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36778967
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MX-9,

Так надо подключить библиотеки адо и активикс я же написал

вот такие
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36779100
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Спасибо !

SUPER !

=====================
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36779314
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusMX-9,

легко :) ...

У меня к Вам пара вопросов, поясните плз:
- В коллекции каталога таблицы получается каждый любой лист рабочей книги - это таблица?
- Про св-во Коннекшнстринг при АДОДБ коннекте connectionstrings.com курить или что-то есть более развернутое?
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36779362
fortik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кладовщик,

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

Профессиональное программирование на VBA в Excel 2003 - там про ADO написано немножко
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36779395
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кладовщик,

про каталоги - то что все листы SYSTEM TABLE точно да, диапазоны Table также

а про конекшнстринг я незнаю ресурсов с нормальным описанием. Опытным путем и гуглением приходится вычленять, то что мне нужно. Сам бы с удовольствием почитал.
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36779490
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Уточнение для EXCEL 2007 :

cn.Open "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};ReadOnly=True;DBQ=" & EXCEL2007_bookName & ";"

( см. http://www.mskbarticles.com/index.php?kb=949529 )

без этого работает через раз

имена листов выдает в апострофах и прилепляет $ в конце

в цикле выдает имена листов книги поочередно по алфавиту американскому,
но цифровые имена - после буковенных

=================
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36820129
Тёмa i ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShamanusMX-9,

Так надо подключить библиотеки адо и активикс я же написал

вот такие

маленький вопросик вдогонку, а как программно определить подключены ли адо и активикс?
ну и соответственно, подключить программно, если не подключены.
Спасибо!
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36820321
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тёмa i ko,

сам незнал, глубины иннета дали вот такой ответ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Option Compare Text
 
Private Sub VBProject_References1()
Dim iPath$, iFileName$, iCount%
    iPath$ = Environ("WinDir")
    'iFileName$ = iPath$ & "\System32\Scrrun.dll" 'Microsoft Scripting Runtime
    'iFileName$ = iPath$ & "\System32\FM20.dll" 'Microsoft Forms 2.0 Object Library
    'iFileName$ = Application.Path & "\MSWORD.OLB" 'Microsort Word 11.0 Object Library
    iFileName$ = "C:\Program Files\Common Files\System\ado\MSADOX.dll"  '<--- строка подключения например АДО
    If Dir(iFileName$) <> "" Then
       With ThisWorkbook.VBProject.References
            For iCount% =  1  To .Count
                If .Item(iCount%).FullPath = iFileName$ Then
                   MsgBox "Эта библиотека уже подключена", , ""
                   Exit Sub
                End If
            Next
            .AddFromFile Filename:=iFileName$
       End With
    Else
       MsgBox "Отсутствует нужный файл", , ""
       Exit Sub
    End If
    MsgBox "Библиотека подключена!",  64 , ""
End Sub

в общем взято тут
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36829977
Тёмa i ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,
огромное спасибо!
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36830682
Cursky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой вариант; немного доработанный. Кое-что взято здесь: http://www.sql.ru/forum/actualthread.aspx?tid=129458&hl=openschema
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Sub GetTables(strSourceFile As String)
    ''Подключение References
    'On Error Resume Next
    ''Name:   ADOX
    ''Description:   Microsoft ADO Ext. 2.8 for DDL and Security
    'ThisWorkbook.VBProject.References.AddFromFile ("C:\Program Files\Common Files\System\ado\msadox.dll")
    'ThisWorkbook.VBProject.References.AddFromGuid GUID:="{00000600-0000-0010-8000-00AA006D2EA4}", Major:=2, Minor:=8
    'On Error GoTo 0
    Dim strTableName As String
    Dim cat As New ADOX.Catalog
    Dim cn As New ADODB.Connection
    Dim tbl As ADOX.Table
    Set cn = New ADODB.Connection
    cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DriverId=790;ReadOnly=True;" & "DBQ=" & strSourceFile & ";"
    Set cat.ActiveConnection = cn
    For Each tbl In cat.Tables
        strTableName = tbl.name
        If Left(strTableName,  1 ) = "'" Then strTableName = Mid(strTableName,  2 )
        'If Right(strTableName, 1) = "_" Then GoTo SKIP 'С этой строчкой некоторые листы пропускаются, без неё - выдаются 2 раза
        If Len(strTableName) < InStr( 1 , strTableName, "$") +  2  Then
            strTableName = Left(strTableName, InStr( 1 , strTableName, "$") -  1 )
            If InStr(strTableName, "Print_Area") Then GoTo SKIP
            Debug.Print strTableName
        End If
SKIP: Next
    Set cat.ActiveConnection = Nothing
    cn.Close
    Set cn = Nothing
End Sub
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36852386
Pavel Berezin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на самом деле можно обойтись и без подключения в References доп.компонентах - по крайней мере с экселя97 есть объект QueryTable, который прожёвывает туже строку подключения

вот кусок моих поделок (выборка таблицы-справочника из отдельного xls-файла):

Dim qt As QueryTable
Dim oe As ODBCError
Dim spr As Range
Dim conn As String, sq As String, fnam As String, pth As String, msg As String

On Error GoTo NoSpr_
'выборка данных через MS Query и ODBC-драйвер
'они должны быть установлены в составе MS Office или MDAC 2.8
conn = "ODBC;Driver={Microsoft Excel Driver (*.xls)};DBQ= <путь и имя файла> ;DefaultDir= <путь к файлу с \ на конце>;PageTimeout=10"
sq = "SELECT `<имя листа>`.* FROM `<только имя файла без расширения xls>`.`<имя листа>$` `<ещё раз имя листа>$`"


Set qt = .QueryTables.Add(conn, Activesheet.Range("A1"), sq) 'шапка грузится в 1ую строку листа
qt.BackgroundQuery = False
qt.EnableEditing = False 'не позволять редактировать свойства и структуру запроса
qt.RefreshOnFileOpen = False 'не обновлять при открытии файла
qt.FieldNames = True 'в шапку загружать имена полей
qt.SaveData = False 'не сохранять данные
qt.Refresh

NoSpr_:
'расширенная обработка ошибок ODBC-подключения

If Err.Number <> 0 Then
MsgBox "ошибка ODBC '" & Err.Number & "," & Err.Description & "' при загрузке справочных данных"
'детализация ошибки
For Each oe In Application.ODBCErrors
msg = msg & oe.ErrorString & vbCrLf
Next oe
If Len(msg) > 0 Then MsgBox msg, vbInformation, "Расшифровка ошибок ODBC"
End If
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36852888
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Pavel Berezin А QueryTable - это что-то, что в MS Query входит или какая-то вещь сама в себе? Где про такое почитать можно? У меня проблемка - унаследовал систему формирования отчетности, где в Эксель все ч-з MS Query выгружается, а я до августа только и знал, что такой метод выгрузки в Эксель из внешних данных существует. Сейчас в своих книгах читаю - все очень коротенько про этот инструмент.
ЗЫ У меня в текущих задачах есть сделать отчет, где нужно пользователю файл Экселя предоставить, чтобы по запросу из внешних данных - это БД в Акцесс - юзер мог выгружать данные в Эксель. Т.е. юзер в Экселе формирует строку СЕЛЕКТа и выгружает данные из Акцесса. Решил выгружать в Эксель данные ч-з ADO
Код: plaintext
1.
2.
3.
Set Connection = New ADODB.Connection
    Cnct = "Provider=Microsoft.Jet.OLEDB.4.0; "
    Cnct = Cnct & "Data Source=" & DBFullName & ";"
    Connection.Open ConnectionString:=Cnct
, что в таком случае должно быть установлено на компьютере юзера из МС Оффис и как подключить в коде библиотеки адо если они не подключены, или это не нужно делать?
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36853774
Pavel Berezin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
QueryTable это объект унаследованный от MS Query. В древних экселях 5.0 и 95 это была отдельная надстройка, начиная с 97 её встроили в стандартный эксель (работает и в последних версиях прекрасно). Если вручную через MS Query импортировать данные на лист из внешней БД, объект QueryTable будет представлять собой кусок листа (Range по сути), в который эти данные подтянулись (от шапки до последней строки данных). В панелях инструментов есть отдельная панель (помоему "Внешние данные"), какраз позволяющая управлять свойствами объекта QueryTable.

Почитать можно в стандартной справке VBA к экселю 97. Но если интересует именно MS Query - помоему самое лучшее описание этой надстройки было в родной белой 700страничной книжке, которая шла в коробке с русским дистрибутивом древнего эксель 5.0 (вообще имхо, в справке к экселю 5.0 многие вещи были описаны лучше, чем в более поздних версиях).
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36853775
Pavel Berezin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в предыдущем примере строку
Set qt = .QueryTables.Add(conn, Activesheet.Range("A1"), sq) 'шапка грузится в 1ую строку листа

следует писать так (для импорта данных из БД на активный лист, начиная с ячейки A1)
Set qt = Activesheet.QueryTables.Add(conn, Activesheet.Range("A1"), sq) 'шапка грузится в 1ую строку листа
...
Рейтинг: 0 / 0
определить наличие листа не открывая книгу EXCEL
    #36853780
Pavel Berezin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кладовщикТ.е. юзер в Экселе формирует строку СЕЛЕКТа и выгружает данные из Акцесса. Решил выгружать в Эксель данные ч-з ADO
Код: plaintext
1.
2.
3.
Set Connection = New ADODB.Connection
    Cnct = "Provider=Microsoft.Jet.OLEDB.4.0; "
    Cnct = Cnct & "Data Source=" & DBFullName & ";"
    Connection.Open ConnectionString:=Cnct
, что в таком случае должно быть установлено на компьютере юзера из МС Оффис и как подключить в коде библиотеки адо если они не подключены, или это не нужно делать?

Должно быть установлено и подключено через Tools\References библиотека MS ADODB,т.к. вы в своём коде явно указываете, какого типа объект хотите создать (= New ADODB.Connection). ставится она помоему тоже в дистрибутиве MDAC (MS data access components).

Но в принципе, через QueryTable вы тотже самый запрос cможете сделать и без ADO.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / определить наличие листа не открывая книгу EXCEL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]