powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Результат запроса в нужную ячейку Excel
19 сообщений из 19, страница 1 из 1
Результат запроса в нужную ячейку Excel
    #35869575
dron747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано:
База, эксель
Задача:
В силу ряда причин Reporting Services не используем
Необходим кусок кода Макрос, который наглядно показывает, как подключиться к б/д и от туда вытащить данные в нужные ячейки Excel.
Так как в VB не рублю прошу привести работающий кусок кода Макроса
Т.е. конекшен стринг, куда логин пароль писать, куда вставлять запрос на SQL и куда вставит данные

Данный код был получен с помощью тупой записи действий в Excel для получения данных ив от что вышло. Остались вопросы где конекшен стринг, и где SQl код?
Код: 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.
Sub Макрос1()
'
' Макрос1 Макрос
'

'
    With ActiveSheet.ListObjects.Add(SourceType:= 0 , Source:=Array( _
        "OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=Test;Use Procedure for Prepare=1;Auto Transl" _
        , _
        "ate=True;Packet Size=4096;Workstation ID=TEST;Use Encryption for Data=False;Tag with column collation when possible=False;Initia" _
        , "l Catalog=Terminals"), Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdTable
        .CommandText = Array("""Terminals"".""dbo"".""Errors""")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod =  0 
        .PreserveColumnInfo = True
        .SourceConnectionFile = _
        "D:\Документы\Мои источники данных\Test Errors.odc"
        .ListObject.DisplayName = "Таблица_Test_ Errors"
        .Refresh BackgroundQuery:=False
    End With
End Sub
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35869847
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Const strConnectionString As String =" выбери нужную строку на www.connectionstrings.com" -- строка подключения
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
conn.ConnectionString = strConnectionString
conn.Open
rst.Open "exec ProcName'", conn -- тут запрос к серверу...select или exec
Sheet1.Range("A1").CopyFromRecordset rst --тут вставляем резалтсет на лист екселя
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing

ЗЫ Написано по памяти, если что - просьба сильно не пинать :)
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35869856
dron747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да спасибо, только я в построении макросов вообще не рублю,
ткните где ошибка, вставил Ваш код и вообще теперь на WITH ругается

вот код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub Макрос3()
'
' Макрос3 Макрос
'

'
    With
    Private Const strConnectionString As String = "OLEDB;Provider=SQLOLEDB.1;Password=111;Persist Security Info=True;User ID=sa;Data Source=test;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TEST;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Terminals"
    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    conn.ConnectionString = strConnectionString
    conn.Open
    rst.Open "SELECT [TerminalID],[Name] FROM [Terminals].[dbo].[Terminals]"
    Sheet1.Range("A1").CopyFromRecordset rst
    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
        
    End With
End Sub

Скриншот ошибки в файле
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35869863
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dron747,

With тебе тут совершенно не нужен в твоём написании. Убери его и всё
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35869893
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dron747,

With и End With нужно убрать из макроса

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35869967
dron747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шыфлdron747,

With тебе тут совершенно не нужен в твоём написании. Убери его и всё

Да фиг там, убрал не работает сволочь, люди шарящие в VB подскажите пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Sub Макрос1()

  
    Private Const strConnectionString As String = "OLEDB;Provider=SQLOLEDB.1;Password=111;Persist Security Info=True;User ID=sa;Data Source=test;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TEST;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Terminals"
    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    conn.ConnectionString = strConnectionString
    conn.Open
    rst.Open "SELECT [TerminalID],[Name] FROM [Terminals].[dbo].[Terminals]"
    Sheet1.Range("A1").CopyFromRecordset rst
    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
        


End Sub
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35870367
Фотография урка1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ентом коде, рыбятки, есть пара приниципиальных моментов, который упущены:

1. Провайдер надо указывать в ЯВНОМ виде, а не в строке коннекта. Иначе - будет сообщение, что MSDASQL не находит драйвера.
2. Bторой момент - что это такое Sheet1? Ясно, что он будет всегда Nothing.
3. Не надо умничать и выполнять сборку памяти самому. Среда васика достаточно умная, чтобы почистить кеш памяти самостоятельно в нужный для нее момент. Когда эти коннекты чистятся из хулиганских побуждений (как в коде выше) - это просто очистит пул коннектов, что просто ВЕСЬМА существенно увеличит время коннекта к базе. Например, при повторных коннектах, они будут проходить не за полсекунды, а например за пять секунд.
4. Не надо забывать ставить ссылку на библиотеку ADO - внутри васика - TOOLS->REFERENCES. Иначе это просто не скомпилицца.


Итого, ВЕРНЫЙ вариант кода выгдядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub Кнопка1_Тынц()
    Dim conn As New ADODB.Connection
    conn.ConnectionString = "Data Source=DEV;Initial Catalog=MED1;User ID=MoscowDown;Password=123456"
    conn.Provider = "SQLOLEDB"
    conn.Open
    Dim rst As New ADODB.Recordset
    rst.ActiveConnection = conn
    rst.Open "select i,TXT from Bugs where CrDate>'" & Cells( 1 ,  1 ) & "'", conn
    ActiveWorkbook.ActiveSheet.Range("B2").CopyFromRecordset rst
    rst.Close
    conn.Close
End Sub


всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35870576
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
урка1В ентом коде, рыбятки, есть пара приниципиальных моментов, который упущены:

1. Провайдер надо указывать в ЯВНОМ виде, а не в строке коннекта. Иначе - будет сообщение, что MSDASQL не находит драйвера.
2. Bторой момент - что это такое Sheet1? Ясно, что он будет всегда Nothing.
3. Не надо умничать и выполнять сборку памяти самому. Среда васика достаточно умная, чтобы почистить кеш памяти самостоятельно в нужный для нее момент. Когда эти коннекты чистятся из хулиганских побуждений (как в коде выше) - это просто очистит пул коннектов, что просто ВЕСЬМА существенно увеличит время коннекта к базе. Например, при повторных коннектах, они будут проходить не за полсекунды, а например за пять секунд.
4. Не надо забывать ставить ссылку на библиотеку ADO - внутри васика - TOOLS->REFERENCES. Иначе это просто не скомпилицца.

ну...так категорично сказано, что не могу не высказать пару замечаний:
1. Провайдер указывается в строке коннекта - это не вызывет никаких проблем при подключении, например:"Provider=sqloledb;Data Source=servername.....". Стоит в рабочем коде, проблем не замечено.
2. Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 .
3. Умничать не надо, согласен, вполне возможно васик сам удалит ненужные переменные. Но с каких пор выгрузка из памяти 1 переменной приводит к очистке всего пула коннектов? непонятно...
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35872565
Фотография урка1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To caper . Ты совершенно четко подсказал товарисчу про CopyFromRecordset. Это хорошо.
Теперь ответ на твои вопросы.

1. Нет. Указание провайдера в строке коннекта не даст его изменение с MSDASQL на SQLOLEDB. Проверено тыщу раз. Тот тынц, который я дал - я получил именно в первой попытке, когда попытался схитрожопить не указывая напрямую провайдера, а указывая провайдера косвенно в строке коннекта. Получил ровно то, что ты видишь в строке поиска в Гугле.

2. "Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 ." Категорически нет. Это может ВДРУГ случайно стработать - есть у тебя не локализованная версия Excel. Если не понимаешь о чем речь - открой такой макрос в русифицированном Excel.

3. Теряется ссылка на пул. Не полная очистка пула, а потеря ссылки на него.


всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35872600
Фотография урка1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот скрин рассмотри внимательно. В нем ответ для тебя на твои два вопроса.

всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35872638
Фотография урка1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3... а ссылок не будет - сборщик мусора возьмет и удалит всю память обьета "пул" нах.

всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35873105
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
урка1,

ну, тут просто неправильный формат строки подключения ;)
напиши " Provider=sqloledb ;Data Source..." - и будет все ок..
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35873107
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
урка13... а ссылок не будет - сборщик мусора возьмет и удалит всю память обьета "пул" нах.

а тут бы ссылку на msdn не помешало бы, ибо тестировать сложно, а логике явно противоречит.
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35873120
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
урка1 To caper .
2. "Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 ." Категорически нет. Это может ВДРУГ случайно стработать - есть у тебя не локализованная версия Excel. Если не понимаешь о чем речь - открой такой макрос в русифицированном Excel.

Согласен - у меня везде стоят английские версии + MUI.
Нашел русскую версию - sheet1 дает ошибку - не объект :)
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35873397
Фотография урка1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, со строкой коннекта согласен - у топикстартера формат, который сжирает только NET-провайдер. Эта строка зависит от логики провайдера. Не уверен, что КАЖДЫЙ провайдер обрабатывает "Provider=". Если же ты явно провайдера указываешь - то как-то спокойнее. Хотя в данном конкретном случае - там по умолчанию стоит MsDASQL- а нам SqlOleDB нужен - а он сожрет параметр Provider.
Хотя не знаю, может можно как-то установить, что провайдер по умолчанию НЕ будет MSDASQL. Тогда надо думать - какой ИМЕННО там стоит провайдер. И думать - сожрет ли он параметр "Provider=". Мне в этом направлении думать лень - поэтому я указал его явно.


Что касается пула. Ну ссылку мне искать некогда. Я ориентируюсь общую на логику сборки мусора. Почему ты считаешь, что обьект, на который НЕ СОВСЕМ ссылок - не будет удален. Конечно будет. А обьект, ведущий пул - это простой обьект (секция кода, секция временных переменных и так далее). Нету ссылок на этот обьект из программ - и привет-медвед этому обьекту. А пока ты обьект Connection не почистил - ссылка гарантированно стоит.
Тестировать пулы просто. Время коннекта. У рихтера был какой-то тест, помнится.


всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35873523
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
урка1Да, со строкой коннекта согласен - у топикстартера формат, который сжирает только NET-провайдер. Эта строка зависит от логики провайдера. Не уверен, что КАЖДЫЙ провайдер обрабатывает "Provider=". Если же ты явно провайдера указываешь - то как-то спокойнее. Хотя в данном конкретном случае - там по умолчанию стоит MsDASQL- а нам SqlOleDB нужен - а он сожрет параметр Provider.
Хотя не знаю, может можно как-то установить, что провайдер по умолчанию НЕ будет MSDASQL. Тогда надо думать - какой ИМЕННО там стоит провайдер. И думать - сожрет ли он параметр "Provider=". Мне в этом направлении думать лень - поэтому я указал его явно.
как мне кажется, тут несколько спутаны понятия "объект доступа к данным" и "провайдер доступа к конкретному серверу".
Мы поключаем библиотеку ADO, которая умеет работать с разными провайдерами, и ей можно задать нужного провайдера как в строке коннекта, так и через свойства соотв. класса, именно ADODB парсит строку конекта и инициализирует соотв. свойства значениями, указанными в ней, или дефолтными значениями, если они не заданы в строке коннекта...

урка1
Что касается пула. Ну ссылку мне искать некогда. Я ориентируюсь общую на логику сборки мусора. Почему ты считаешь, что обьект, на который НЕ СОВСЕМ ссылок - не будет удален. Конечно будет. А обьект, ведущий пул - это простой обьект (секция кода, секция временных переменных и так далее). Нету ссылок на этот обьект из программ - и привет-медвед этому обьекту. А пока ты обьект Connection не почистил - ссылка гарантированно стоит.
Тестировать пулы просто. Время коннекта. У рихтера был какой-то тест, помнится.

в моих букварях было сказано, что коннект к БД - это ограниченный ресурс, сделал свое дело - не держи коннект. А вот как "не держать коннект" - просто закрыв или убив соотв. переменную, я точно не помню... Посмотрел примеры MS - там 80% (из просмотренных) примеров работы заканчиваются на rst.Close, так что пусть работает "сборщик мусора" :)
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35874181
Фотография урка1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. По первому вопросу. Я на это смотрю иначе. Ты опираешься на то, что в библиотеке есть секция с литерами. В одной из этих секций вписана текстовая строка "MSDASQL". Это то ИМЯ, которое попадет в провайдер по умолчанию. Действительно, этот (и только этот провайдер) понимает PROVIDER="OleDB".

Но... Кто тебе сказал, что какая-то софтина (встроенная в виндузню или приблудная-внешняя) - не заменить эту строки например на ODBC или на ISAM. Эти провайдеры НЕ ПОНИМАЮТ параметра Provider="ОleDB". Так же, как у топик-стартера (как ты видишь из его кода) - был ВООБЩЕ другой провайдер доступа к данным (которому просто можно указать "Oledb", даже без слова "Provider=").

Твой код просто опирается на несколько предположений. Ты предположил, что в секции литералов:
-- в качестве ИМЕНИ провайдера по умолчанию вписано "MsDasql"
-- в секции с локализацией нет ничего
Эти оба предположения сразу резанули мне глаза. Ты ведь пишешь код не для себя? Я по крайней мере пишу его ДЛЯ ДРУГИЗ ЗА ДЕНЬГИ. И я отдам этот код в бухгалтерию, например. И кто сказал, что бухгалтер там например не из Белорусии и Sheet1 у нее не называется "странЫцЯ" - или как-то так.

Та же самая ситуация с провайдером по умолчанию. Кто сказал - что там, куда я отдам этот код в той же самой секции литералов будет вписано именно MSDASQL, а не ODBC - и этот провайдер УДАЧНО разберет конструкцию "Provider=". А какие провайдеры будут через год. Кто ПРОГАРАНТИРУЕТ, что они понимают конструкцию "Provider=ххх".

Ну а сборку мусора просто проверить - оберни все это в цикл из миллиона итераций - и в одном случае оставь там NOTHING, в другом - без него. Думаю, результат будет впечатляющий. Правда тут наложится эффект не только пула, но и общей инициализации. И еще - если будет делать этот тест - не забудь размер пула установить БОЛЬШЕ числа итераций. Иначе смысла в тесте нет. Мне это делать лень - я с этим игрался много раз.

Простовот эти пару моментов в твоем коде - они сразу резанули мне глаза - и я подправил твой код. Не спорю, можно ПОДГАДАТЬ некое сочетание текстовых литералов - чтобы и твой код вдруг сработал. НО...


всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35874211
caper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
урка1,
жесть...

в качестве замечания - мы используем ADODB, конкретную библиотеку, которая понимает определение провайдера в строке подключения, и про нее речь и идет в топике.

остальной текст не осилил.
из темы ушел.
...
Рейтинг: 0 / 0
Результат запроса в нужную ячейку Excel
    #35874516
Фотография урка1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
ADODB, конкретную библиотеку, которая понимает определение провайдера в строке подключения
ну может ты и прав с этим - только я предпочитаю это явно указывать

ладно, мне тоже тошнит уже от этого топика

всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Результат запроса в нужную ячейку Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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