DataEnvironment, открытие файлов excel

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

DataEnvironment, открытие файлов excel

Сообщение Sandr0 » 17.11.2004 (Ср) 16:30

Задача:
Открытть файл Excel и получить список листов c использованием DataEnvironment.

Проблема:
В построителе это сделать без проблем - включи показ системных объектов и делай что хочешь.

А как это сделать вручную?
- создаешь DataEnvironment
- создаешь Connection
А как дальше получить список таблиц (листов excel)?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.11.2004 (Чт) 8:46

c использованием DataEnvironment


А не проще без него:

Код: Выделить всё
    Dim cn As New ADODB.Connection, r As ADODB.Recordset
    With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .Properties("Extended Properties") = "Excel 8.0"
        .CursorLocation = adUseClient
        .Open "Data Source = C:\My.xls"
        Set r = .OpenSchema(adSchemaTables)
        Do Until r.EOF
            Debug.Print r(2)
            r.MoveNext
        Loop
    End With
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 18.11.2004 (Чт) 9:13

честно говоря надо подумать... возможно и проще...
исходная задача собственно была в открытии листов excel(причем юзверю надо предоставить возможность выбора листа) и с помощью SQL запросов делать выборку данных

может есть какие-нить предложения по реализации задачи?

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 18.11.2004 (Чт) 14:36

Гранд Мерсю!
Ты меня подталкнул к решению проблемы, правда без использования DataEnvironment.
Код: Выделить всё
    Dim myConnection As ADODB.Connection
    Dim myCommand As ADODB.Command
    Dim myRS As ADODB.Recordset
    Dim myList As ADODB.Recordset
    Dim strCnn As String
    Dim strSQL As String

    Set myConnection = New ADODB.Connection
    strCnn = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Excel Files;Mode=ReadWrite;DSN=Excel Files;DBQ=z:\dll\book1.xls;DriverId=790;MaxBufferSize=2048;PageTimeout=5;"
    myConnection.Open strCnn
   
    Set myList = myConnection.OpenSchema(adSchemaTables)
    Do Until myList.EOF
        ' собственно имена листов
        Debug.Print myList(2)
        myList.MoveNext
    Loop
       
    Set myCommand = New ADODB.Command
    Set myCommand.ActiveConnection = myConnection
    myCommand.CommandText = "SELECT `LIST3$`.* FROM `LIST3$`"
    ' собственно быполнение SQL-запроса
    Set myRS = myCommand.Execute()
    Do Until myRS.EOF
        Debug.Print myRS.Fields(1).Value
        myRS.MoveNext
    Loop
    myList.Close
    myRS.Close
    myConnection.Close

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 18.11.2004 (Чт) 15:01

:lol:
и в случае с DataEnvironment тоже работает
Код: Выделить всё
    Set myList = myEnv.fileXLS.OpenSchema(adSchemaTables)
    Do Until myList.EOF
        Debug.Print myList(2)
        myList.MoveNext
    Loop


спасибо еще раз

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 18.11.2004 (Чт) 16:12

У меня почему то при
Код: Выделить всё

strCnn = "Provider=MSDASQL.1;Persist Security Info=False;Data Dource=Excel Files;Mode=ReadWrite;DSN=Excel Files;DBQ=z:\***.xls;DriverId=790;MaxBufferSize=2048;PageTimeout=5;"

myConnection.Open strCnn  ' ЗДЕСЬ!


пишет Data source name not found and no defoult driver specified
хоть я и поменял DBQ=z:\***.xls на свое значение...
А код by Andrey Fedorov работает...

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 18.11.2004 (Чт) 16:15

посмотри как у тебя прописано в ODBC - Excel Files или Файл Excel
это всего лишь строка инициализации
найтить бы описание к этому...

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 18.11.2004 (Чт) 16:25

`LIST3$`.*
что у тебя значит? типа sheet1?

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 18.11.2004 (Чт) 16:43

это имя листа в книге
а точнее лист.все_поля (выбрать все поля из листа с именем 'лист3$') смотри описание синтаксиса SQL
кавычки и бакс обязательно, т.к. листы это системные объекты

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 18.11.2004 (Чт) 17:15

Слушай, а кинь исходник... А то у меня ошибка за ошибкой...

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 18.11.2004 (Чт) 17:19

получи
У вас нет доступа для просмотра вложений в этом сообщении.

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 18.11.2004 (Чт) 17:33

Data source name not found and no defoult driver specified
такую лажу пишет

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 19.11.2004 (Пт) 7:55

Sandr0 писал(а):посмотри как у тебя прописано в ODBC - Excel Files или Файл Excel
это всего лишь строка инициализации
найтить бы описание к этому...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.11.2004 (Пт) 8:06

хоть я и поменял DBQ=z:\***.xls на свое значение...
А код by Andrey Fedorov работает...


В его примере пользуется ODBC, а в моем - нет. Я просто стараюсь не пользовать ODBC там где он в нем явно нет необходимости...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 19.11.2004 (Пт) 9:16

Sandr0 писал(а):
Sandr0 писал(а):посмотри как у тебя прописано в ODBC - Excel Files или Файл Excel
это всего лишь строка инициализации
найтить бы описание к этому...


так где должно быть прописано-то??? на форму мы ведь DATA не кидаем! :shock:
и что имеется ввиду под понятием "поля"? Это столбцы или строки из листа?
Последний раз редактировалось Dimitr 19.11.2004 (Пт) 9:23, всего редактировалось 1 раз.

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 19.11.2004 (Пт) 9:18

2 Andrey Fedorov
А как бы ты использовал sql в екселе для отбора данных без ODBC?

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 19.11.2004 (Пт) 9:35

Dimitr писал(а):2 Andrey Fedorov
А как бы ты использовал sql в екселе для отбора данных без ODBC?
?? :wink:
Я, конечно, совсем не Andrey Fedorov, просто мимо спокойно пройти не могу.. :lol:
Для "sql в екселе для отбора данных" достаточно просто подключить библиотеку ADO к проекту.

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 19.11.2004 (Пт) 9:54

Dimitr писал(а):так где должно быть прописано-то???

вахЪ... пуск->настройка->панель управления->администрирование->источники ODBC->вкладка пользовательский dsn
там должена быть строка Excel Files (это для английской винды) или Excel Файлы (для русской винды)
погляди как у тебя и поменяй в строке инициализации Data Source=Excel Files и DSN=Excel Files

Dimitr писал(а): и что имеется ввиду под понятием "поля"? Это столбцы или строки из листа?

Запись - по аналогии с ёкселем есть строка данных
поле - по аналогии с ёкселем есть ячейка в записи (строке данных)

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 19.11.2004 (Пт) 10:27

"Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\file.xls;DefaultDir=c:\;"

Вот так получилось!!! http://www.connectionstrings.com/ Sandr0 :wink:

Sandr0
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 65
Зарегистрирован: 17.11.2004 (Ср) 16:26
Откуда: Rostov-on-Don

Сообщение Sandr0 » 19.11.2004 (Пт) 10:29

молодца!

Dimitr
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 27.10.2004 (Ср) 15:48

Сообщение Dimitr » 19.11.2004 (Пт) 10:54

Leon_ писал(а):
Dimitr писал(а):2 Andrey Fedorov
А как бы ты использовал sql в екселе для отбора данных без ODBC?
?? :wink:
Я, конечно, совсем не Andrey Fedorov, просто мимо спокойно пройти не могу.. :lol:
Для "sql в екселе для отбора данных" достаточно просто подключить библиотеку ADO к проекту.


Ну это да... Как еще без подключения ADO не глюканет такой код:
Dim myCommand As ADODB.Command
Dim myRS As ADODB.Recordset
Dim myList As ADODB.Recordset
Фигня вот в чем... Когда выполняется такой код:
Код: Выделить всё
    Set myCommand = New ADODB.Command
    Set myCommand.ActiveConnection = myConnection
    myCommand.CommandText = "SELECT [лист1$].* FROM [лист1$]"
   
    Set myRS = myCommand.Execute()
    myRS.MoveFirst
    Do Until myRS.EOF
        MsgBox myRS.Fields(2).Value
        myRS.MoveNext
    Loop


Он мне в MsgBox начинает выдавать 3-й столбец, начиная со второй строки....и т.д.
Ну 3-ий столбец(С) это понятно- .Fields(2), ну а почему со второй только строки, а не с первой???
З.Ы.
И можно ли сделать, чтобы он выдавал мне не стороки вниз по очереди с 1 по n, а столбцы, напр. с А.по..Z и т.д.
И вместо [лист1$].* - приведите пожалуйста пример-что можно вставить вместо звездочки..., какое поле..? Ну типа как из таблицы БД-
select имятабл.имяполя from имятабл.


Вернуться в Базы данных

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList