powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Oracle -> ODBC -> Excel
13 сообщений из 13, страница 1 из 1
Oracle -> ODBC -> Excel
    #36637997
Доброго всем времени суток.

Вводная: Имеется файл Excel, БД на Oracle Database 10 и настроенное на него ODBC соединение.

Возникла необходимость в написании макроса для Microsoft Excel(2003), который должен по нажатию кнопки на листе Excel выполнять запрос к БД(Oracle DataBase 10). результат(несколько строк с несколькими столбцами) запроса должен выводиться на лист Excel.

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

Плюс, так сказать на закуску, хотелось бы чтобы можно было использовать файл для различных БД - формирование Connection String с помощью параметров(например имя базы и пароль извлкетать из ячеек расположенных на листе вызова макроса).

P.S.: сам от Excel и VB очень далек, так что не обесудьте, если запрос бредовый и непонятный.
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36638373
Или может кто подскажет почему возникает вот такая ситуация.

Описал макрос и прицепил его на кнопку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub Button1_Click()
Dim qt As QueryTable


sqlstring = "select * from v$session where schemaname = 'T_KERNDBA'and terminal like 'VCS%';"
connstring = "ODBC;DRIVER=Oracle in Oracle10_Home; DSN=complex1;UID=CTEST;PASS=usrofctest"

With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstring)
     .Refresh
End With
    
End Sub
при первом нажатии все отрабатывает, но при повторном вызове выдает ошибку - method 'Refresh' for object '_QueryTable' faild и далее ошибку 1004

И далее запустить можно только после переоткрытия файла Excel.
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36638511
Вадим Мулявка,
похоже на то, что Excel не может создать QueryTable в том-же диапазоне.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub Button1_Click()
'Dim qt As QueryTable

'sqlstring = "select * from v$session where schemaname = 'T_KERNDBA'and terminal like 'VCS%';"
'connstring = "ODBC;DRIVER=Oracle in Oracle10_Home; DSN=complex1;UID=CTEST;PASS=usrofctest"


'With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstring)
'.Refresh
'End With

' если запрос существует - обновить, если не существует, - создать и обновить
If ActiveSheet.QueryTables.Count> 0  Then
    ActiveSheet.QueryTables( 1 ).Refresh
Else
    sqlstring = "select * from v$session where schemaname = 'T_KERNDBA'and terminal like 'VCS%';"
    connstring = "ODBC;DRIVER=Oracle in Oracle10_Home; DSN=complex1;UID=CTEST;PASS=usrofctest"
    With ActiveSheet.QueryTables.Add(Connection:=connstring, _
               Destination:=Range("A1"), Sql:=sqlstring)
        .Refresh
    End With
End If

End Sub
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36638871
СавсемГость,

к сожалению, такой же ошибкой сейчас ругается на строчку:
ActiveSheet.QueryTables(1).Refresh
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36640103
Вадим Мулявка,
повторил, почти, Ваш код у себя. Run-time error 1004 получил уже при первом обращении к источнику данных. Убрал из строки соединения указание на драйвер, изменил имя параметра PASS на PWD, - заработало.
Код: plaintext
1.
2.
3.
...
'connstring = "ODBC;DRIVER=Oracle in Oracle10_Home; DSN=complex1;UID=CTEST;PASS=usrofctest"
connstring = "ODBC;DSN=complex1;UID=CTEST;PWD=usrofctest"
...
Тестировалось на: Oracle client 8.1.7, Excel 2003 (11.8105.8107) SP2
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36640686
СавсемГость,

Да, с параметрами коннекты был косяк, но сейчас поправил - и один раз всё отрабатывает, но потом опять ругается на Refresh.
Посмотрел в debug-режиме - всегда заходит в if, т.е. считает, что QueryTable уже существует на листе, даже при первом проходе.

Возможно как-то надо явно объявить переменную с QueryTable.

Вид макроса сейчас вот такой:




Код: 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.
35.
36.
37.
38.
Sub script_1()
Dim inst, sqlt, dsnt, pwdt, connstt As String

If ActiveSheet.QueryTables.Count >  0  Then
   ActiveSheet.QueryTables( 1 ).Refresh
Else
    inst = Cells( 2 ,  2 )
    sqlt = "select sid from v$session where terminal like 'VCS%' and lower(schemaname)="
    'sqlt = "select sid from v$session where osuser='vmulyavka' and lower(schemaname)="
    
    connstt = "ODBC;"
    dsnt = Cells( 3 ,  2 )
    pwdt = Cells( 4 ,  2 )
    
    
    sqlstring = sqlt + "'" + inst + "'"
    connstring = connstt + "DSN=" + dsnt + ";UID=" + inst + ";PWD=" + pwdt + ";"
    
    'sqlstring = "select sid from v$session where  osuser='vmulyavka';"
    'connstring = "ODBC;DSN=COMPLEX1;UID=T_KERNDBA;PWD=USROFT_KERNDBA;"
    '
       
    With ActiveSheet.QueryTables.Add(Connection:=connstring, _
                        Destination:=Range("D9"), Sql:=sqlstring)
         '.CommandText = sqlstring
         .BackgroundQuery = False
         .Refresh
    End With
End If

If Cells( 10 ,  4 ) >  0  Then
 Cells( 10 ,  4 ).Interior.Color = RGB( 255 ,  0 ,  0 )
Else
 Cells( 10 ,  4 ).Interior.Color = RGB( 168 ,  168 ,  168 )
End If
Range("D9:D14").ColumnWidth =  17 
   
'Cells(2, 2).Font.Italic = True
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36640808
А подскажите, пожалуйста, как удалить созданный QueryTable с листа?
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36641801
В своих изысканиях дошел до ошибкис кодом -2147417848(80010108), возникающей при повторном нажатии на кнопку. Насколькоя понял, эта ошибка означае, что система не может восстановить связь с БД.

Возможно, кто-нибудь знаешь в чем причина и как это вылечить?
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36641885
В своих изысканиях дошел до ошибкис кодом -2147417848(80010108), возникающей при повторном нажатии на кнопку. Насколькоя понял, эта ошибка означае, что система не может восстановить связь с БД.

Возможно, кто-нибудь знаешь в чем причина и как это вылечить?
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36641903
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим Мулявка, поищи рецепты по форуму. Подобные вопросы здесь неоднократно обсуждались. Мало кто постоянно использует QueryTable, чтобы с ходу разобраться.
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36642317
Вадим Мулявка,
Вадим МулявкаА подскажите, пожалуйста, как удалить созданный QueryTable с листа?
удаление QueryTable
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
'удалить запрос
ActiveSheet.QueryTables(Index).Delete
'(!)или
'удалить запрос и полученные данные
'ActiveSheet.QueryTables(Index).ResultRange.Delete

'удалить все запросы с листа
'Dim k%
'For k = ActiveSheet.QueryTables.Count To 1 Step -1
'    ActiveSheet.QueryTables(k).Delete
'Next k
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36642523
zcvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вадим Мулявка

Вам нужно продвигаться в эту сторону:
У Вас должна быть форма с элементом управления TextBox с MultiLine=True. В него Вы будете вводить текст запроса.
У Вас должна быть процедура ВыполнитьЗапрос (например) с параметром sqlstr (тоже например).
В эту процедуру Вы будете передавать в качестве фактического параметра TextBox.Text
У Вас должна быть на форме кнопка Выполнить - на нее повесите выполнение этой процедуры.
При выполнении этой процедуры в ЭтуКнигу должен добавляться лист. В ячейку А2 методом
CopyFromRecordset скопируете данные из полученного рекордсета. Все не расскажешь.
Вам придется почитать кое-что, если Вы действительно далеки, а не прибедняетесь.
Я лишь показываю Вам, куда двигаться, если нужна гибкость относительно текста запроса.
...
Рейтинг: 0 / 0
Oracle -> ODBC -> Excel
    #36642530
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим Мулявка

Вам нужно продвигаться в эту сторону:
У Вас должна быть форма с элементом управления TextBox с MultiLine=True. В него Вы будете вводить текст запроса.
У Вас должна быть процедура ВыполнитьЗапрос (например) с параметром sqlstr (тоже например).
В эту процедуру Вы будете передавать в качестве фактического параметра TextBox.Text
У Вас должна быть на форме кнопка Выполнить - на нее повесите выполнение этой процедуры.
При выполнении этой процедуры в ЭтуКнигу должен добавляться лист. В ячейку А2 методом
CopyFromRecordset скопируете данные из полученного рекордсета. Все не расскажешь.
Вам придется почитать кое-что, если Вы действительно далеки, а не прибедняетесь.
Я лишь показываю Вам, куда двигаться, если нужна гибкость относительно текста запроса.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Oracle -> ODBC -> Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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