Sheets.count в закрытой книге Excel...

Программирование на Visual Basic for Applications
jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Sheets.count в закрытой книге Excel...

Сообщение jetcom » 02.11.2004 (Вт) 2:47

Есть код:
Sub GetData()
Dim r As Byte, sh As Byte, arg$, p$, f$
Dim GetDat As Variant
p = "...\Path\..."
f = "Name.xls"
Application.ScreenUpdating = False
For sh = 1 To 2
For r = 1 To 5
a = Cells(r, 1).Address
arg = "'" & p & "[" & f & "]" & sh & "'!" & _
Range(a).Range("A1").Address(, , xlR1C1)
GetDat = ExecuteExcel4Macro(arg)
Next r
Next sh
Application.ScreenUpdating = True
End Sub

-для считывания данных из закрытой книги Excel.

Возможно ли в строчечке: For sh = 1 To 2
задать количество листов в книге (закрытой) не явно, как в вышеуказанном коде, а по аналогии стандартного
Sheets.Count ???
Всё сбудется!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.11.2004 (Вт) 10:02

Точно! :)
Как же я забыл включить в список вопросов "Как прочитать файл, не открывая его?"? :)

Ну открой, к примеру, узнай кол-во, а потом сразу закрой.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 02.11.2004 (Вт) 10:38

В список каких вопросов? :roll:
Неееет, открывать-закрывать, - это уже криво, - это сделать вообще не вопрос!
А как насчет все-таки не открывая???
Если уж невозможно, тогда буду думать, как еще выйти из ситуации...

Попутно появилась проблема, - обратиться не по имени листа, а по его индексу, ведь имен можно и не знать, а количество листов...пока пытаемся...совместно...
Всё сбудется!!!

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 03.11.2004 (Ср) 0:42

Поэкспериментировав с
GetDat = ExecuteExcel4Macro(arg)
пришлось от него отказаться, т.к. работает отвратительно долго!
попробовав получить данные с помощью ADO, - понравилось, гораздо приятней.
Но по-прежнему открытым остался вопрос о количестве листов в закрытой книге и обращении к ним по индексу при помощи того-же ADO...
Всё сбудется!!!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.11.2004 (Ср) 9:41

У ADO есть метод, OpenSchema. Можно получить в рекордсет список объектов. В твоем случае, тебе надо получить список таблиц; тут тебе будет и количество, и индексы, и имена.
Lasciate ogni speranza, voi ch'entrate.

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 03.11.2004 (Ср) 15:52

Точно это применимо к книге Excel?
У меня выдает сообщение: "Нераспознаваемый формат базы данных...\путь\..."
Если можно, небольшой примерчик, конкретно для Excel? Плиииз...
Всё сбудется!!!

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 03.11.2004 (Ср) 20:27

alibek, я облазил весь MSDN, но нашел применение OpenSchema для Access, - про Excel - ни слова...
Ты пошутил?
Всё сбудется!!!

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 04.11.2004 (Чт) 1:18

Нет, не пошутил...
Вот что я нашел:

Dim Cnxn As ADODB.Connection
Dim rstSchema As ADODB.Recordset
Dim strCnxn As String
Set Cnxn = New ADODB.Connection
strCnxn = "DRIVER={Microsoft Excel Driver (*.xls)};" & _
"ReadOnly=1;DBQ=...\path\...\*.xls"
Cnxn.Open strCnxn
Set rstSchema = Cnxn.OpenSchema(adSchemaTables)

Do Until rstSchema.EOF
Debug.Print "Table name: " & _
rstSchema!TABLE_NAME & vbCr & _
"Table type: " & rstSchema!TABLE_TYPE & vbCr & _
rstSchema.MoveNext
Loop
' clean up
rstSchema.Close
Cnxn.Close
Set rstSchema = Nothing
Set Cnxn = Nothing
Exit Sub

Только очередной прикол: читает листы не в очередности индексов, а в очередности сортировки имен - 1,10,11...19,2,20...
Т.е. чтобы достичь желаемого, необходимо заранее ограничить разрядность и нумеровать с конца: 999...-...001, чтобы потом делать выборку с более новых в сторону старых данных. Во блин! Нет чтоб просто по индексу с 1 по 999.
Всё сбудется!!!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.11.2004 (Чт) 10:03

В рекордсете, получаемом в OpenSchema есть поле (помоему COLUMN_ORDER, не помню точно), в нем указан порядковый номер таблицы.
Можешь создать строковый массив SheetNames(1 To <OpenSchema>.RecordCount) и заполнять его в цикле, SheetNames(<OpenSchema>.Fields("TABLE_ORDER")) = <OpenSchema>.Fields("TABLE_NAME"). Тогда в этом массиве у тебя будет список полей (листов) в том порядке, в котором они идут в книге.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.11.2004 (Чт) 10:06

И еще, советую использовать не ODBC, а OLE DB. Т.е. замени ConnectionString на подобную:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
Lasciate ogni speranza, voi ch'entrate.


Вернуться в VBA

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

Сейчас этот форум просматривают: Google-бот и гости: 81

    TopList