2014-12-09 3 views
26

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

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 = ###; User ID = ###». Кроме того, sConnString должен иметь «Источник данных = IP_ADDRESS_OF_SERVER», и если вы используете тот же компьютер для базы данных и VBA, вы можете использовать 127.0.0.1 для IP_ADDRESS_OF_SERVER. – Michael

+0

Какой тип базы данных SQL вы используете? MS SQL? MySQL? SQLite? Это определит, будет ли работать код VBA. – Michael

ответ

31

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

References required for SQL

Sub модуль для подключения к 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», «Использовать процедуру для Prepare = 1», «Auto Translate = True», «Размер пакета = 4096», «Использовать шифрование для данных = False', 'Тег с сопоставлением столбцов, когда это возможно = False' в строке подключения? На самом деле запрос работает без этой дополнительной информации.Best, – owner

+0

О 'Persist Security Info = True', см. Http://stackoverflow.com/questions/30419627/persist-security-info-property-true-and-persist-security-info-property-false –

+0

твердый пример good объяснение. в Сэме причина, по которой вы добавили дополнительные критерии, - иметь дополнительный контроль над стандартными приборами в случае, если некоторые системы должны иметь настройки, несколько измененные. EDIT: основные вещи, которые вам нужны в вашей строке подключения, - это пароль, имя пользователя, имя db и db айпи адрес –

Смежные вопросы