5

I'm trying to query a table in Microsoft Excel using VBA. I've written up some code to try and accomplish this task, but I keep getting an error:

run-time error '1004': Saying it's a General ODBC error.

I'm not sure what I need to do to get this code to run properly so I can query this table.

I'm using SQL Server Express, the server I'm connecting to: .\SQLEXPRESS

Database:

Databaselink

Querying the products table VBA Code:

Sub ParameterQueryExample()
'---creates a ListObject-QueryTable on Sheet1 that uses the value in 
'        Cell Z1 as the ProductID Parameter for an SQL Query
'        Once created, the query will refresh upon changes to Z1. 

Dim sSQL As String
Dim qt As QueryTable
Dim rDest As Range

'--build connection string-must use ODBC to allow parameters
Const sConnect = "ODBC;" & _
    "Driver={SQL Server Native Client 10.0};" & _
    "Server=.\SQLEXPRESS;" & _
    "Database=TSQL2012;" & _
    "Trusted_Connection=yes"

'--build SQL statement
sSQL = "SELECT *" & _
        " FROM TSQL2012.Production.Products Products" & _
        " WHERE Products.productid = ?;"

'--create ListObject and get QueryTable
Set rDest = Sheets("Sheet1").Range("A1")
rDest.CurrentRegion.Clear  'optional- delete existing table

Set qt = rDest.Parent.ListObjects.Add(SourceType:=xlSrcExternal, _
    Source:=Array(sConnect), Destination:=rDest).QueryTable

With qt.Parameters.Add("ProductID", xlParamTypeVarChar)
    .SetParam xlRange, Sheets("Sheet1").Range("Z1")
    .RefreshOnChange = True
End With

'--populate QueryTable
With qt
    .CommandText = sSQL
    .CommandType = xlCmdSql
    .AdjustColumnWidth = True  'add any other table properties here
    .BackgroundQuery = False
    .Refresh
End With

Set qt = Nothing
Set rDest = Nothing
End Sub
2
  • 1
    Have a look here: http://www.connectionstrings.com/sql-server/. There are few ways to connect to sql server and few providers... Try different connection settings. Commented Jan 9, 2014 at 19:36
  • On which line does this occur? throw us a clue. Commented Oct 19, 2015 at 10:16

1 Answer 1

2

the solution to do this is the next

Dim lo As ListObject
Set lo = ActiveSheet.ListObjects.Add(xlSrcExternal, _
"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=SERVER_NAME;Data Source=CONNECTION_ADRESS;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False", _
True, xlYes, Range("A2"))

lo.QueryTable.CommandType = xlCmdSql
lo.QueryTable.CommandText = "SELECT * FROM TABLE_NAME"

With lo.QueryTable.Parameters.Add("Currency code", xlParamTypeVarChar)
    .SetParam xlRange, ActiveSheet.Range("A1")
    .RefreshOnChange = True
End With

lo.QueryTable.Refresh BackgroundQuery:=False

This you can create a listObject from a SQL Query.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.