Страницы: 1
RSS
excel-ODBC
 
Всем привет!!!  
 
Люди, у меня возникла маленькая проблемка, с корой я столкнулся, и не знаю, как бороться, как ее решить. Как я понял, данная проблема не имеет отношения к объекту QueryTables и имеет какое-то отношение к системе безопасности Excel, но, при этом, камнем преткновения становится именно объект QueryTables. Система: ХР, Excel 2003. Следите за моей мыслью:  
Условимся, что в некоторой книге под названием WB_1.xls есть макрос SUB_1(), который использует для своей работы объект QueryTables. Вот его примерный код:  
 
Sub SUB_1()    
 
Dim Select_exp As String    
 
Connection_BD = "ODBC;DSN=...;UID=...;PWD=..."    
 
' ... - информация конфиденциальна    
     
 
Select_exp = "select ... from ... where ... order ..."    
 
 
With ActiveSheet.QueryTables.Add(Connection:=Connection_BD, Destination:=Range(Cells(col, 1), Cells(col, 1)))    
 
   .CommandText = Select_exp    
 
   .Name = "TR_range"    
 
   .FieldNames = True    
 
   .RowNumbers = False    
 
   .FillAdjacentFormulas = False    
 
   .PreserveFormatting = True    
 
   .RefreshOnFileOpen = False    
 
   .BackgroundQuery = True    
 
   .RefreshStyle = xlOverwriteCells    
 
   .SavePassword = False    
 
   .SaveData = True    
 
   .AdjustColumnWidth = False    
 
   .RefreshPeriod = 0    
 
   .PreserveColumnInfo = True    
 
   .Refresh BackgroundQuery:=False    
 
End With    
 
End Sub  
 
 
Теперь рассмотрим ситуацию:  
Мы открываем книгу WB_1.xls и нажимаем Alt+F8. В появившемся окне мы выбираем наш макрос и нажимаем кнопку Run. При сценарии таких действий со стороны пользователя (т.е. меня), макрос успешно (молча) выполняется и извлекает данные из БД.  
Но как только мы попытаемся повторить выполнение макроса SUB_1()(выполнение изъятия данных из БД), так сразу же Excel выводит окно списка ODBC соединений с просьбой выбрать необходимое ODBC-соединение.  
 
Вопрос : Как сделать так, чтобы во второй ситуации Excel молча выполнял макрос SUB_1() также, как это происходит в первой ситуации??  
Почему в первой ситуации Excel замечательно, прямо-таки, работает, а во второй и в следующих ситуациях просит вмешаться пользователя??  
 
Если можно, выскажите хотя бы свое мнение по этому поводу... Заранее благодарен всем, кто отзовется.
 
Единственное что приход в голову,ограничение на количество подключений к БД под одним пользователем.Те  в первый раз происходит коннект, а во второй раз он уже занят.
 
{quote}{login=Jom}{date=26.08.2009 12:47}{thema=}{post}Единственное что приход в голову,ограничение на количество подключений к БД под одним пользователем.Те  в первый раз происходит коннект, а во второй раз он уже занят.{/post}{/quote}  
 
и что делать?
 
{quote}{login=kuzminki}{date=26.08.2009 12:37}{thema=excel-ODBC}{post}  
 
Connection_BD = "ODBC;DSN=...;UID=...;PWD=..."    
 
' ... - информация конфиденциальна    
     
{/post}{/quote}  
я ж не телепат. как я могу что-то посоветовать если даже не знаю какая у вас субд
 
{quote}{login=Jom}{date=26.08.2009 12:56}{thema=Re: excel-ODBC}{post}{quote}{login=kuzminki}{date=26.08.2009 12:37}{thema=excel-ODBC}{post}  
 
Connection_BD = "ODBC;DSN=...;UID=...;PWD=..."    
 
' ... - информация конфиденциальна    
     
{/post}{/quote}  
я ж не телепат. как я могу что-то посоветовать если даже не знаю какая у вас субд{/post}{/quote}  
 
Oracle
 
{quote}{login=}{date=26.08.2009 01:16}{thema=Re: Re: excel-ODBC}{post}{quote}{login=Jom}{date=26.08.2009 12:56}{thema=Re: excel-ODBC}{post}{quote}{login=kuzminki}{date=26.08.2009 12:37}{thema=excel-ODBC}{post}  
 
Connection_BD = "ODBC;DSN=...;UID=...;PWD=..."    
 
' ... - информация конфиденциальна    
     
{/post}{/quote}  
я ж не телепат. как я могу что-то посоветовать если даже не знаю какая у вас субд{/post}{/quote}  
 
Oracle{/post}{/quote}  
приведите, плиз, целиком строку подключения, заменив конф. инфу...
 
доступ к самому серверу есть?  
можно просмотреть открытые коннекты?
 
Oracle{/post}{/quote}  
приведите, плиз, целиком строку подключения, заменив конф. инфу...{/post}{/quote}  
 
With Sheets("import").QueryTables.Add(Connection:=Array(Array("ODBC;DSN=ORA_OREX4test;UID=test;PWD=****;DBQ=OREX4;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BAM=IfAllSuccessful;NUM=NLS;D"), Array("PM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;")), Destination:=Range("A1"))  
       .CommandText = Array("SELECT FIN_INDEXATIONS_VAL.ID, FIN_INDEXATIONS_VAL.REGN, FIN_INDEXATIONS_VAL.FI_DATE, FIN_INDEXATIONS_VAL.FI_VALUE, FIN_INDEXATIONS_VAL.FIN_IND_ID" & Chr(13) & "" & Chr(10) & "FROM SPUR.FIN_INDEXATIONS_VAL FIN_INDEXATIONS_VAL" & Chr(13) & "" & Chr(10) & "W", "HERE (FIN_INDEXATIONS_VAL.REGN=" & Nlic & ")" & Chr(13) & "" & Chr(10) & "ORDER BY FIN_INDEXATIONS_VAL.FI_DATE DESC")  
       .Name = "Запрос фин показателей банков"  
       .FieldNames = True  
       .RowNumbers = False  
       .FillAdjacentFormulas = False  
       .PreserveFormatting = True  
       .RefreshOnFileOpen = False  
       .BackgroundQuery = True  
       .RefreshStyle = xlInsertDeleteCells  
       .SavePassword = False  
       .SaveData = True  
       .AdjustColumnWidth = True  
       .RefreshPeriod = 0  
       .PreserveColumnInfo = True  
       .Refresh BackgroundQuery:=False  
   End With
 
у вас код: With Sheets("import").QueryTables.Add(Connection...  
 
т.е. каждый запуск макроса добавляет новый элемент..  
 
следите за мыслью?  
 
может быть проверять существование?  
 
и тогда просто With Sheets("import").QueryTables("Запрос фин показателей банков"  
).refresh   ?  
 
хотя могу и ошибаться..
Живи и дай жить..
 
{quote}{login=слэн}{date=26.08.2009 02:01}{thema=}{post}у вас код: With Sheets("import").QueryTables.Add(Connection...  
 
т.е. каждый запуск макроса добавляет новый элемент..  
 
следите за мыслью?  
 
может быть проверять существование?  
 
и тогда просто With Sheets("import").QueryTables("Запрос фин показателей банков"  
).refresh   ?  
 
хотя могу и ошибаться..{/post}{/quote}  
возможно и так. просто из кода автора не совсем понятно, создается ли каждый раз новая таблица или просто апается старая.  
 
 
ps про настройки оракла ничего посоветовать не могу,с ние не работал.
 
{/quote}  
возможно и так. просто из кода автора не совсем понятно, создается ли каждый раз новая таблица или просто апается старая.  
 
 
ps про настройки оракла ничего посоветовать не могу,с ние не работал.{/post}{/quote}  
 
Каждый раз "апается" старая.
 
{quote}{login=}{date=26.08.2009 02:23}{thema=Re: Re: }{post}{/quote}  
возможно и так. просто из кода автора не совсем понятно, создается ли каждый раз новая таблица или просто апается старая.  
 
 
ps про настройки оракла ничего посоветовать не могу,с ние не работал.{/post}{/quote}  
 
Каждый раз "апается" старая.{/post}{/quote}  
 
Тогда проблема ,я почти уверен,здесь    
With ActiveSheet.QueryTables.Add(Connection:=Connection_BD, Destination:=Range(Cells(col, 1), Cells(col, 1)))    
 
в общем смотрите пост Слэна
 
попробуйте перед апдейтом удалить старые данные принудительно  
типа Range("A1:A2000").Clear  
и переходите на ADO DB  
там удобнее )  
вот вам в помощь  
http://am.rusimport.ru/MSAccess/topic.aspx?ID=453  
там хоть и про Access, но тот же VBA
 
{quote}{login=слэн}{date=26.08.2009 02:01}{thema=}{post}у вас код: With Sheets("import").QueryTables.Add(Connection...  
 
т.е. каждый запуск макроса добавляет новый элемент..  
 
следите за мыслью?  
 
может быть проверять существование?  
 
и тогда просто With Sheets("import").QueryTables("Запрос фин показателей банков"  
).refresh   ?  
 
хотя могу и ошибаться..{/post}{/quote}  
 
Все сделал, как Вы посоветовали. Но, увы.... обновляться не хочет (опять просит выбрать источник данных, падла.)
 
как вы создавали строку подключения?  
что-то подозрительно много в ней параметров, да и еще в массиве.  
жаль нету под рукой сервера Oracle...
 
{quote}{login=slav}{date=26.08.2009 03:43}{thema=}{post}как вы создавали строку подключения?  
что-то подозрительно много в ней параметров, да и еще в массиве.  
жаль нету под рукой сервера Oracle...{/post}{/quote}  
 
создавал макросом (по-другому не осилил).
 
{quote}{login=}{date=26.08.2009 03:44}{thema=Re: }{post}{quote}{login=slav}{date=26.08.2009 03:43}{thema=}{post}как вы создавали строку подключения?  
что-то подозрительно много в ней параметров, да и еще в массиве.  
жаль нету под рукой сервера Oracle...{/post}{/quote}  
 
создавал макросом (по-другому не осилил).{/post}{/quote}  
создайте файлик connect.udl  
запустите его даблкликом.  
произведите настройку и тестирование коннекта к БД.  
закройте его.  
откройте блокнотом и скопируйте строку полученную строку подключения.
 
предыдущий пост - глюк )  
 
создайте файлик connect.udl  
запустите его даблкликом.  
произведите настройку и тестирование коннекта к БД.  
закройте его.  
откройте блокнотом и скопируйте строку полученную строку подключения.
 
{quote}{login=slav}{date=26.08.2009 04:06}{thema=}{post}предыдущий пост - глюк )  
 
создайте файлик connect.udl  
запустите его даблкликом.  
произведите настройку и тестирование коннекта к БД.  
закройте его.  
откройте блокнотом и скопируйте строку полученную строку подключения.{/post}{/quote}  
 
Provider=MSDASQL.1;Persist Security Info=False;User ID=kuzminki;Data Source=ORA_OREX4
 
с этой строкой подключения макрос работает?  
или тоже сбоит?
 
{quote}{login=Slav}{date=26.08.2009 05:10}{thema=}{post}с этой строкой подключения макрос работает?  
или тоже сбоит?{/post}{/quote}  
 
Чо-то не догоняю - а как эту строку правильно прописать?
 
если в файлике .udl у вас коннект к БД проходит нормально, то по идее должен работать след. код, приведенный во вложении.  
по Alt+F8 запустите макрос OracleQueryExample  
я в нем поправил немного селект, убрав условие where, ибо там есть неизвестная мне переменная.
 
{quote}{login=Slav}{date=26.08.2009 05:56}{thema=}{post}если в файлике .udl у вас коннект к БД проходит нормально, то по идее должен работать след. код, приведенный во вложении.  
по Alt+F8 запустите макрос OracleQueryExample  
я в нем поправил немного селект, убрав условие where, ибо там есть неизвестная мне переменная.{/post}{/quote}  
 
Самое интересное, что в Вашем файле процедура работает на УРА и происходит коннект с базой.  
Но, если, запустить Ваш код в моём файле - то сразу начинаецца ругань на строчку объявления переменной rs ("Dim rs as ADODB.Recordset") - "Compile error: User-defined type not defined"  
 
Почему так происходит? Не хочецца переписывать все процедуры в новый файл...
 
{quote}{login=}{date=27.08.2009 11:45}{thema=Re: }{post}{quote}{login=Slav}{date=26.08.2009 05:56}{thema=}{post}если в файлике .udl у вас коннект к БД проходит нормально, то по идее должен работать след. код, приведенный во вложении.  
по Alt+F8 запустите макрос OracleQueryExample  
я в нем поправил немного селект, убрав условие where, ибо там есть неизвестная мне переменная.{/post}{/quote}  
 
Самое интересное, что в Вашем файле процедура работает на УРА и происходит коннект с базой.  
Но, если, запустить Ваш код в моём файле - то сразу начинаецца ругань на строчку объявления переменной rs ("Dim rs as ADODB.Recordset") - "Compile error: User-defined type not defined"  
 
Почему так происходит? Не хочецца переписывать все процедуры в новый файл...{/post}{/quote}  
В редакторе VBA в меню Tools -> References найдите и поставьте галочку в пункте Microsoft ActiveX Data Objects 2.1 Library  
и все будет пучком.
 
если  не ошибаюсь надо подключить microsoft activeX data obkect library
 
опять глюк    
"В редакторе VBA в меню Tools -> References найдите и поставьте галочку в пункте Microsoft ActiveX Data Objects 2.1 Library  
и все будет пучком."
 
{quote}{login=slav}{date=27.08.2009 12:07}{thema=}{post}опять глюк    
"В редакторе VBA в меню Tools -> References найдите и поставьте галочку в пункте Microsoft ActiveX Data Objects 2.1 Library  
и все будет пучком."{/post}{/quote}  
 
Отлично! Все заработало!  
СПАСИБО огромеднейшее!!! Да храни Вас Господь!
 
ну вот и здорово... )))
Страницы: 1
Читают тему
Наверх