Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Excel VBA to run SQL query

I am fairly new to SQL and VBA. I have written a SQL query that I would like to be able to call and run from a VBA sub in an excel workbook and then bring the query results into the workbook. I have found some subs online (stackoverflow and other places) that claim to do this but I am having trouble understanding them as they contain no explanation. For example, here is a sub that I found online:

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 

First of all, would this work? Second, what do I need to replace in the sub (it looks like provider, data source, initial catalog, etc) and where do I find the info to replace them with?

I hope this question is not too confusing and I appreciate your help!

like image 564
Sam Avatar asked Dec 09 '14 17:12

Sam


People also ask

Can I run a SQL query in Excel?

Open an SQL connection to an Excel fileBefore running an SQL query, you have to open a connection with the Excel file you want to access. To establish the connection, create a new variable named %Excel_File_Path% and initialize it with the Excel file path.

Can you run SQL in VBA?

There are a number of ways to execute a SQL Data Manipulation Language (DML) statement from Microsoft Access, besides the obvious process of creating an Action Query and double-clicking its icon.


1 Answers

Below is code that I currently use to pull data from a MS SQL Server 2008 into VBA. You need to make sure you have the proper ADODB reference [VBA Editor->Tools->References] and make sure you have Microsoft ActiveX Data Objects 2.8 Library checked, which is the second from the bottom row that is checked (I'm using Excel 2010 on Windows 7; you might have a slightly different ActiveX version, but it will still begin with Microsoft ActiveX):

References required for SQL

Sub Module for Connecting to MS SQL with Remote Host & Username/Password

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 
like image 98
Michael Avatar answered Sep 28 '22 02:09

Michael