SQL

Программирование на Visual Basic for Applications
Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

SQL

Сообщение Lider » 02.11.2004 (Вт) 12:45

Вопрос в следующем:
Можно ли из программы на VBA выполнить SQL запрос к таблице Excel?

если да, то как?
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

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

Сообщение alibek » 02.11.2004 (Вт) 13:46

Можно. Открываешь таблицу Excel как базу данных и используешь .Execute или .OpenRecordset. Если для доступа используется DAO, то можно работать с xls-файлами до версии Excel 97 включительно. Для Excel 2000 и выше надо использовать ADO. Connection String смотреть в мануале или в интернете.
Lasciate ogni speranza, voi ch'entrate.

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 03.11.2004 (Ср) 9:55

Спасибо Alibek, но я видимо тутпее, чем ты думаешь!
Для примера : есть таблица с полями Артикул, наименование, янв, февр, Уровень1, уровень 2.
Поля янв, февр -целые, остальные текстовые.
таблица расположена в листе Расходы.

Приведи пожалуйста пример
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

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

Сообщение alibek » 03.11.2004 (Ср) 10:24

Вот, кусок кода, получающий список всех таблиц:
Код: Выделить всё
With Connection.OpenSchema(adSchemaTables)
  Do Until (.BOF Or .EOF)
    If .Fields("TABLE_TYPE") = "TABLE" Then
      Debug.Print .Fields("TABLE_NAME")
    End If
    .MoveNext
  Loop
  .Close
End With
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 03.11.2004 (Ср) 10:25

Блин, что-то я не туда написал...
Lasciate ogni speranza, voi ch'entrate.

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 03.11.2004 (Ср) 10:33

Код: Выделить всё
With Connection.OpenSchema(adSchemaTables)

Object reqired
такая вот ошибочка!
может подключить чего?
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

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

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

Lider, то я не тебе отвечал, топик перепутал.

Для начала идешь в Tools - References и подключаешь ADO.
Затем, объявляешь (глобально или локально, в зависимости от потребностей)
Код: Выделить всё
Public|Dim cnn As ADODB.Connection

Подключение к БД:
Код: Выделить всё
Set cnn = New ADODB.Connection
cnn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""

Отключение:
Код: Выделить всё
cnn.Close
Set cnn = Nothing


Выборка данных из листа:
Код: Выделить всё
With cnn.Execute("select * from [Sheet1$]")
  Do Until .EOF
    Debug.Print .Fields(0)
    .MoveNext
  Loop
  .Close
End With
Lasciate ogni speranza, voi ch'entrate.

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

[b]СПАСИБО[/b]

Сообщение Lider » 04.11.2004 (Чт) 12:01

Alibek!, Огромное спасибо !!!

Но небольшое уточнение- заработало Только тогда, когда вместо Sheet1$ - я поставил имя диапазона Данных!



Код: Выделить всё
Sub MySQLQuery()


'Подключение к БД:
Set cnn = New ADODB.Connection
cnn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""

'Выборка данных:

With cnn.Execute("select * from [Данные]")
  Do Until .EOF
    Debug.Print .Fields(0) & "  |  " & .Fields(1)
    .MoveNext
  Loop
  .Close
End With

'Отключение:

cnn.Close
Set cnn = Nothing

End Sub


И мне нужна была активная книга ......
Выход нашел:
Код: Выделить всё
cnn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ActiveWorkbook.Path & "\" & ActiveWorkbook.Name & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""


Еще вопросик :
Без именованного диапазона никак?
(проблема конечно решаема и с диапазоном, но хотелось бы без него)
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 04.11.2004 (Чт) 13:49

Методом проб и ошибок накопал через справку и Object Brouser
то что было нужно:


Код: Выделить всё
Private cnn As ADODB.Connection
Private r As ADODB.Recordset



Sub MySQLQuery()



Set cnn = New ADODB.Connection
cnn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ActiveWorkbook.Path & "\" & ActiveWorkbook.Name & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
Dim cmd As New ADODB.Command
cmd.CommandText = "select * from [DAT]"
cmd.ActiveConnection = cnn



Set r = New ADODB.Recordset
Set r = cmd.Execute(0, 0, 0)



ActiveSheet.Cells(20, 1).CopyFromRecordset r



With cnn.Execute("select * from [DAT]")
  Do Until .EOF
    Debug.Print .Fields(0) & "  |  " & .Fields(1)
    .MoveNext
  Loop
  .Close
End With

cnn.Close
Set cnn = Nothing



End Sub


Но одного не понял

Код: Выделить всё
Set r = cmd.Execute(0, 0, 0)


Что значат эти параметры?

В справке ни ЧЕ не понял !!!!
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 04.11.2004 (Чт) 16:27

Ну подскажите как без именованного диапозона?
И ЧТО ЗА ПАРАМЕТРЫ

Код: Выделить всё
Set r = cmd.Execute(0, 0, 0)



А ВООБЩЕ Я В ПОЛНОМ ВОСТОРГЕ
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 04.11.2004 (Чт) 16:30

Да , чтобы уж совсем все было ясно - мож кто-нть объяснит, что же там понаписано в ConnectionString ?
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 05.11.2004 (Пт) 16:46

Народ ! ну плиз, ответте на последние вопросы, или скажите , что я совсем ламер !
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 05.11.2004 (Пт) 17:34

При офисе есть програмка - MSQRY32.EXE, если не поставил, достав.
В ней можеш писать запросы как надо и смотреть SQL-код

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 09.11.2004 (Вт) 9:04

И все таки ....
что такое
Код: Выделить всё
cmd.Execute(0, 0, 0)


И что значит
Код: Выделить всё
cnn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ActiveWorkbook.Path & "\" & ActiveWorkbook.Name & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""

запись в connectionstring

:roll:
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

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

Сообщение alibek » 09.11.2004 (Вт) 9:28

Lider, сходи на http://www.connectionstrings.com , там все подробно расписано.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в VBA

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

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

    TopList