Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / определить наличие листа не открывая книгу EXCEL / 23 сообщений из 23, страница 1 из 1
05.08.2010, 15:30
    #36777476
MX-9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
Уважаемые знатоки !

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

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

спасибо
...
Рейтинг: 0 / 0
05.08.2010, 15:38
    #36777513
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
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
05.08.2010, 15:44
    #36777528
nilem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
MX-9,

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

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

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

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

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

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

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

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

Dim cn As New ADODB.Connection

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

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

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

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

Спасибо !

SUPER !

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

легко :) ...

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

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

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

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

а про конекшнстринг я незнаю ресурсов с нормальным описанием. Опытным путем и гуглением приходится вычленять, то что мне нужно. Сам бы с удовольствием почитал.
...
Рейтинг: 0 / 0
06.08.2010, 15:04
    #36779490
MX-9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
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
31.08.2010, 00:06
    #36820129
Тёмa i ko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
ShamanusMX-9,

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

вот такие

маленький вопросик вдогонку, а как программно определить подключены ли адо и активикс?
ну и соответственно, подключить программно, если не подключены.
Спасибо!
...
Рейтинг: 0 / 0
31.08.2010, 08:33
    #36820321
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
Тём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
05.09.2010, 00:18
    #36829977
Тёмa i ko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
Shamanus,
огромное спасибо!
...
Рейтинг: 0 / 0
06.09.2010, 05:05
    #36830682
Cursky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
Мой вариант; немного доработанный. Кое-что взято здесь: 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
17.09.2010, 15:01
    #36852386
Pavel Berezin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
на самом деле можно обойтись и без подключения в 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
17.09.2010, 17:51
    #36852888
кладовщик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
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
18.09.2010, 19:49
    #36853774
Pavel Berezin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
QueryTable это объект унаследованный от MS Query. В древних экселях 5.0 и 95 это была отдельная надстройка, начиная с 97 её встроили в стандартный эксель (работает и в последних версиях прекрасно). Если вручную через MS Query импортировать данные на лист из внешней БД, объект QueryTable будет представлять собой кусок листа (Range по сути), в который эти данные подтянулись (от шапки до последней строки данных). В панелях инструментов есть отдельная панель (помоему "Внешние данные"), какраз позволяющая управлять свойствами объекта QueryTable.

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

следует писать так (для импорта данных из БД на активный лист, начиная с ячейки A1)
Set qt = Activesheet.QueryTables.Add(conn, Activesheet.Range("A1"), sq) 'шапка грузится в 1ую строку листа
...
Рейтинг: 0 / 0
18.09.2010, 20:02
    #36853780
Pavel Berezin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить наличие листа не открывая книгу EXCEL
кладовщикТ.е. юзер в Экселе формирует строку СЕЛЕКТа и выгружает данные из Акцесса. Решил выгружать в Эксель данные ч-з 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
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / определить наличие листа не открывая книгу EXCEL / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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