Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как при помощи VBA в excel получить данные с SQL-сервера / 13 сообщений из 13, страница 1 из 1
05.03.2008, 11:42
    #35172198
redrum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
возникла необходимость в экселевском файле заполнить ячейки на основе запроса к SQL-серверу.

в свое время делал экспорт данных в эксель из аксеса - было все предельно ясно... а тут прилип к хелпу уже на пару часов - не могу разобраться....

может кто-нибудь подсобит примерчиком ???

пс: просьба, также указывать какие необходимы библиотеки для ваших примеров
...
Рейтинг: 0 / 0
05.03.2008, 12:16
    #35172347
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
используйте Данные-Импорт внешних данных - Создать запрос

и возится с кодом не надо

P.S.: если все же нужен код то ищите по словам ADO


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
05.03.2008, 13:39
    #35172722
redrum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
пробовал сделать через QueryTables примерно таким образом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Dim CN, RN As Integer
Dim strsql As String
Dim ConnectionString As String
Dim wsh As Worksheet
CN =  4 
RN =  190 

Set wsh = ActiveSheet

ConnectionString = "DRIVER={SQL Server};SERVER=appserv;DATABASE=Runtime;UID=User;PWD=password"
strsql = "SELECT dbo_BatchDetail.DateTime FROM dbo_BatchIdLog INNER ......"

Do
    With wsh.Cells
        MsgBox wsh.Cells(RN, CN)
        With wsh.QueryTables.Add(Connection:=ConnectionString, Destination:=Range("P228"), sql:=strsql)
            .Refresh
        End With
        
        RN = RN +  1 
    End With
Loop Until RN =  230 
Модератор:
тег SRC



выдает ошибку application-defined or object-defined error
помогите разобраться что к чему....
...
Рейтинг: 0 / 0
05.03.2008, 13:45
    #35172747
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
выдает где?

и зачем столько раз делать запрос?


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
06.03.2008, 09:10
    #35174430
redrum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
[quot HandKot]выдает где?

и зачем столько раз делать запрос?

слетает на этой строке
wsh.QueryTables.Add(Connection:=ConnectionString, Destination:=Range("P228"), sql:=strsql)

запрос в цикле, потому что в само тело запроса будут вставляться значения из ячеек листа....
...
Рейтинг: 0 / 0
06.03.2008, 10:12
    #35174601
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
> Автор: redrum
> слетает на этой строке
> wsh.QueryTables.Add(Connection:=ConnectionString,
> Destination:=Range("P228"), sql:=strsql)

Может потому, что Destination:=Range("P228") без изменений?
и после первого выполнения этот Range уже заполнен?

Чего хоть пишет?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.03.2008, 11:00
    #35174764
kiv-1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
Мой вариант реализованный в Oracle, думаю вполне подойдет и для MySql там только подключение нужно организовать под него.
Код: 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.
39.
Private Sub Export_Click()
    Dim sSQLString As String
    Dim objXL As Object
    Dim objWb As Object
    Dim objWs As Object

    Set objXL = CreateObject("Excel.Application")
    If objXL Is Nothing Then Exit Sub

    objXL.SheetsInNewWorkbook =  1 
    Set objWb = objXL.Workbooks.Add 'Open("c:\main.xls")
    Set objWs = objWb.Worksheets( 1 )

    objXL.Visible = True

      sSQLString = "select ...... "  'текст запроса в базу

    objWs.Cells( 1 ) = "Названия стобцов1"
    objWs.Cells( 2 ) = "Названия стобцов2"
    objWs.Cells( 3 ) = "Названия стобцов3"
    objWs.Cells( 4 ) = "Названия стобцов4"
    objWs.Cells( 5 ) = "Названия стобцов5"
    objWs.Range("A1:F1").Font.Bold = True
    objWs.Columns("A:F").AutoFit
    
    Set rs = Connection1.Execute(sSQLString) 'здесь подключение к базе у меня уже установлено

    objWs.Range("A2").CopyFromRecordset rs ' собственно передача с рекордсета
    ' форматирование
    objWs.Cells.Select
    objXL.Selection.Columns.AutoFit
    objWs.Range("A1").Select
    
    objWs.Cells.Select
    objXL.Selection.Borders(xlEdgeBottom).LineStyle = xlDouble
    objWs.Range("A1").Select
        
    Set rs = Nothing
        
End Sub
...
Рейтинг: 0 / 0
06.03.2008, 11:49
    #35174935
redrum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
>Может потому, что Destination:=Range("P228") без изменений?
>и после первого выполнения этот Range уже заполнен?
>Чего хоть пишет?

Destination:=Range("P228") - не влияет, потому что сваливается на первом проходе... как раз при попытке заполнить ячейку первый раз... выдает сообщение "application-defined or object-defined error"
...
Рейтинг: 0 / 0
06.03.2008, 12:10
    #35175035
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
> Автор: redrum
> Destination:=Range("P228") - не влияет, потому что сваливается на
> первом проходе... как раз при попытке заполнить ячейку первый раз...
> выдает сообщение "application-defined or object-defined error"

Ну что тебе сказать, ConnectionString и strsql правильно заполнены?
потому что валится где-то внутри, то ли при установке соединения, то ли при
попытке выполнить запрос.
Мне при записи макроса сделало такой код:
Код: 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.
With ActiveSheet.QueryTables.Add(Connection:= _
        "ODBC;DRIVER=SQL Server;SERVER=(local);UID=;APP=Microsoft Office 
2003;WSID=A45;DATABASE=Northwind;Trusted_Connection=Yes" _
        , Destination:=Range("A2"))
        .CommandText = Array( _
        "SELECT Customers.CustomerID, Customers.CompanyName, 
Customers.ContactName, Customers.ContactTitle, Customers.Address, 
Customers.City, Customers.Region, Customers.PostalCode, Customers.Country, 
Custome" _
        , "rs.Phone, Customers.Fax" & Chr( 13 ) & "" & Chr( 10 ) & "FROM 
Northwind.dbo.Customers Customers")
        .Name = "Запрос из loc"
        .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
Я соединялся с локальным сервером, попробуй записать макрос на соединение и
одноразовое получение данных, а после будешь модернизировать в цикл ;-)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.03.2008, 12:41
    #35175224
redrum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
>Ну что тебе сказать, ConnectionString и strsql правильно заполнены?

спасибо за пример с макросом... сейчас буду разбираться....

сам запрос - простейший... в аксесе отрабатывает без вопросов....
а вот с ConnectionString наверное действительно стоит тщательно проверить...
...
Рейтинг: 0 / 0
06.03.2008, 13:24
    #35175474
kiv-1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
Собственно можно воспользоваться Build подключением к MsSQL, например посредством OLE:

Код: plaintext
Connection = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=user;Data Source=nameserver"

ну и затем использовать свой запрос посредством рекордсета.
...
Рейтинг: 0 / 0
07.03.2008, 09:37
    #35177468
redrum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
Проблема действительно оказалась в connectionstring....

Теперь возник другой вопрос - при вставке значений в ячейки добавляется еще и шапка запроса...
Как отключить эту "опцию", чтобы копировались только значения ???
...
Рейтинг: 0 / 0
07.03.2008, 10:28
    #35177599
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как при помощи VBA в excel получить данные с SQL-сервера
может это поможет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
With ActiveSheet.QueryTables.Add( _
        Connection:=rstRecordset, _
        Destination:=Range("A1"))
    .Name = "Contact List"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = True
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod =  0 
    .PreserveColumnInfo = True
    .Refresh BackgroundQuery:=False
End With

обратите внимание на .FieldNames = True

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как при помощи VBA в excel получить данные с SQL-сервера / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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