Использование Excel VBA для запуска SQL-запроса

25

Я новичок в SQL и VBA. Я написал SQL-запрос, который хотел бы иметь возможность вызывать и запускать с помощью VBA в книге Excel, а затем выводить результаты запроса в книгу. Я нашел несколько онлайн-приложений (stackoverflow и другие места), которые заявляют об этом, но у меня возникли проблемы с их пониманием, поскольку они не содержат никаких объяснений. Например, вот что я нашел в Интернете:

Sub ConnectSqlServer()

    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim sConnString As String

    ' Create the connection string.
    sConnString = "Provider=SQLOLEDB;Data Source=INSTANCE\SQLEXPRESS;" & _
                  "Initial Catalog=MyDatabaseName;" & _
                  "Integrated Security=SSPI;"

    ' Create the Connection and Recordset objects.
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    ' Open the connection and execute.
    conn.Open sConnString
    Set rs = conn.Execute("SELECT * FROM Table1;")

    ' Check we have data.
    If Not rs.EOF Then
        ' Transfer result.
        Sheets(1).Range("A1").CopyFromRecordset rs
    ' Close the recordset
        rs.Close
    Else
        MsgBox "Error: No records returned.", vbCritical
    End If

    ' Clean up
    If CBool(conn.State And adStateOpen) Then conn.Close
    Set conn = Nothing
    Set rs = Nothing

End Sub

Прежде всего, будет ли это работать? Во-вторых, что мне нужно заменить на суб (это выглядит как поставщик, источник данных, начальный каталог и т.д.) И где я могу найти информацию для их замены?

Надеюсь, этот вопрос не слишком запутан, и я ценю вашу помощь!

  • 1
    Код имеет комментарии над каждым «разделом». Что именно ты не понимаешь? По сути код; создает соединение с базой данных, выполняет запрос к соединению, загружает результаты в ResultSet, копирует ResultSet в таблицу, начиная с диапазона "A1" ...
  • 0
    Если в вашей базе данных есть имя пользователя / пароль, то для sConnString необходимо указать «Password = ###; ID пользователя = ###». Кроме того, sConnString должен иметь «Data Source = IP_ADDRESS_OF_SERVER», и если вы используете тот же компьютер для базы данных и VBA, то вы можете использовать 127.0.0.1 для IP_ADDRESS_OF_SERVER.
Показать ещё 8 комментариев
Теги:
sql-server
excel-vba
excel

1 ответ

30

Ниже приведен код, который я использую в настоящее время для вывода данных с MS SQL Server 2008 в VBA. Вам нужно убедиться, что у вас есть правильная ссылка ADODB [ Редактор VBA- > Инструменты- > Ссылки] и убедитесь, что у вас есть Microsoft ActiveX Data Objects 2.8. Библиотека отмечена, которая является второй из нижней строки, которая (я использую Excel 2010 в Windows 7, у вас может быть немного другая версия ActiveX, но она все равно начнется с Microsoft ActiveX):

Изображение 3796

Подкомпонент для подключения к MS SQL с удаленным хостом и именем пользователя/паролем

Sub Download_Standard_BOM()
'Initializes variables
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String

'Setup the connection string for accessing MS SQL database
   'Make sure to change:
       '1: PASSWORD
       '2: USERNAME
       '3: REMOTE_IP_ADDRESS
       '4: DATABASE
    ConnectionString = "Provider=SQLOLEDB.1;Password=PASSWORD;Persist Security Info=True;User ID=USERNAME;Data Source=REMOTE_IP_ADDRESS;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=DATABASE"

    'Opens connection to the database
    cnn.Open ConnectionString
    'Timeout error in seconds for executing the entire query; this will run for 15 minutes before VBA timesout, but your database might timeout before this value
    cnn.CommandTimeout = 900

    'This is your actual MS SQL query that you need to run; you should check this query first using a more robust SQL editor (such as HeidiSQL) to ensure your query is valid
    StrQuery = "SELECT TOP 10 * FROM tbl_table"

    'Performs the actual query
    rst.Open StrQuery, cnn
    'Dumps all the results from the StrQuery into cell A2 of the first sheet in the active workbook
    Sheets(1).Range("A2").CopyFromRecordset rst
End Sub
  • 2
    Большое спасибо за ваш ответ, так как я недавно искал такую реализацию. Однако, для любопытства, не могли бы вы рассказать нам больше о полезности Persist Security Info=True , Use Procedure for Prepare=1 , Auto Translate=True , Packet Size=4096 , Use Encryption for Data=False , При необходимости Tag with column collation when possible=False в строке соединения? На самом деле запрос работает без этой дополнительной информации. Лучший,
  • 0
    Persist Security Info=True , см. Stackoverflow.com/questions/30419627/…
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню