VBA SQL Server Select - sql-server

I was wondering if you could please check my code in VBA (Excel) to retrieve data from a SQL Server database, and insert it in the sheet.
It returns an error according the picture attached.
Sub ConnectionTest()
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
Dim constr As String
constr = "Provider=sqloledb;Data source=USO-YEGANEH\SQL2008;Initial Catalgo=USO_Final;User Id=sa;Password=123"
Dim conRS As ADODB.Recordset
Set conRS = New ADODB.Recordset
conn.Open constr
With conRS
.ActiveConnection = conn
.Open "Select * from LatLong_Amar"
Sheet1.Range("A1").CopyFromRecordset conRS
.Close
End With
End Sub

I found out what is the problem, it seems full path of the table, despite the fact that database is defined in the Connection String, should be entered. So, the line "Select * from LatLong_Amar" should be changed to [USO_Final].[dbo].[Latlong_Amar]
Sub ConnectionTest()
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
Dim constr As String
constr = "Provider=sqloledb;Data source=USO-YEGANEH\SQL2008;Initial Catalgo=USO_Final;User Id=sa;Password=123"
Dim conRS As ADODB.Recordset
Set conRS = New ADODB.Recordset
conn.Open constr
With conRS
.ActiveConnection = conn
.Open "Select * from [USO_Final].[dbo].[Latlong_Amar]"
Sheet1.Range("A1").CopyFromRecordset conRS
.Close
End With
End Sub

You can do it this way.
Sub ADOExcelSQLServer()
Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Server_Name = "YOUR_SERVER_NAME" ' Enter your server name here
Database_Name = "AdventureWorksLT2012" ' Enter your database name here
User_ID = "" ' enter your user ID here
Password = "" ' Enter your password here
SQLStr = "SELECT * FROM [SalesLT].[Customer]" ' Enter your SQL here
Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"
rs.Open SQLStr, Cn, adOpenStatic
' Dump to spreadsheet
With Worksheets("sheet1").Range("a1:z500") ' Enter your sheet name and range here
.ClearContents
.CopyFromRecordset rs
End With
' Tidy up
rs.Close
Set rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub
Here is another option for you to muse over.
Sub TestMacro()
' Create a connection object.
Dim cnPubs As ADODB.Connection
Set cnPubs = New ADODB.Connection
' Provide the connection string.
Dim strConn As String
'Use the SQL Server OLE DB Provider.
strConn = "PROVIDER=SQLOLEDB;"
'Connect to the Pubs database on the local server.
strConn = strConn & "DATA SOURCE=(local);INITIAL CATALOG=NORTHWIND.MDF;"
'Use an integrated login.
strConn = strConn & " INTEGRATED SECURITY=sspi;"
'Now open the connection.
cnPubs.Open strConn
' Create a recordset object.
Dim rsPubs As ADODB.Recordset
Set rsPubs = New ADODB.Recordset
With rsPubs
' Assign the Connection object.
.ActiveConnection = cnPubs
' Extract the required records.
.Open "SELECT * FROM Categories"
' Copy the records into cell A1 on Sheet1.
Sheet1.Range("A1").CopyFromRecordset rsPubs
' Tidy up
.Close
End With
cnPubs.Close
Set rsPubs = Nothing
Set cnPubs = Nothing
End Sub

Related

How to format data inserted from SQL Server into Excel table using VBA?

I'm using the code below to import tables from SQL Server into Excel.
So the old data be removed and new be inserted. I need to insert table to related data. I find something called ListObject but I didn't know how to apply it. Is there any way to insert table after the data are inserted?
Option Explicit
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Sub Connect_To_SQLServer(ByVal Server_Name As String, ByVal Database_Name As String, ByVal SQL_Statement As String)
Dim strConn As String
Dim wsReport As Worksheet
Dim col As Integer
Dim tbl As ListObject
strConn = "Provider=SQLOLEDB;"
strConn = strConn & "Server=" & Server_Name & ";"
strConn = strConn & "Database=" & Database_Name & ";"
strConn = strConn & "Trusted_Connection=yes;"
Set conn = New ADODB.Connection
With conn
.Open ConnectionString:=strConn
.CursorLocation = adUseClient
End With
Set rst = New ADODB.Recordset
With rst
.ActiveConnection = conn
.Open Source:=SQL_Statement
End With
'// here i selected the sheet where the data will be written
Set wsReport = Sheets("RDWH")
With wsReport
'// here I clear the old data and insert new set
wsReport.Select
Selection.Clear
For col = 0 To rst.Fields.Count - 1
.Cells(1, col + 1).Value = rst.Fields(col).Name
Next col
.Range("A2").CopyFromRecordset rst
End With
Set wsReport = Nothing
Call Close_Connections
End Sub
Private Sub Close_Connections()
If rst.State <> 0 Then rst.Close
If conn.State <> 0 Then conn.Close
'// Release Memory
Set rst = Nothing
Set conn = Nothing
End Sub
Sub Run_Report()
Dim Server_Name As String
Server_Name = "NL-1012716\SQLEXPRESS"
Call Connect_To_SQLServer(Server_Name, "project", "SELECT * FROM [2_RDWH_CAST]")
End Sub
It is easier if the sheet name matches the table name and just delete any sheet with that name. Then recreate the sheet with a new table. This example shows how multiple tables can be downloaded in one operation with each query creating a new sheet.
-- Update ; Added sheet name and position parameters to sub Run_Report.
Option Explicit
Sub Run_Reports()
Dim conn As ADODB.Connection
Const SERVER_NAME As String = "NL-1012716\SQLEXPRESS"
Const DB_NAME = "test"
Dim sTable As String
sTable = ThisWorkbook.Sheets("Control").Range("H6").Value
' connect to DB, run reports and disconnect
Set conn = Connect_To_SQLServer(SERVER_NAME, DB_NAME)
Call Run_Report(conn, sTable, "Sheet3", "A3")
conn.Close
Set conn = Nothing
End Sub
Sub Run_Report(ByRef conn As ADODB.Connection, ByVal TABLE_NAME As String, _
SHEET_NAME As String, START_CELL As String)
If Len(TABLE_NAME) = 0 Then
MsgBox "TABLE_NAME missing", vbCritical, "ERROR"
Exit Sub
End If
Dim rst As ADODB.Recordset
Dim wb As Workbook, ws As Worksheet, i As Integer
Dim wsReport As Worksheet, tblResult As ListObject
' query
Dim SQL As String
SQL = "SELECT * FROM [" & TABLE_NAME & "]"
' execute query
Set rst = New ADODB.Recordset
With rst
.ActiveConnection = conn
.Open Source:=SQL
End With
' output
Set wb = ThisWorkbook
' clear sheet
Set wsReport = wb.Sheets(SHEET_NAME)
wsReport.Cells.Clear
With wsReport.Range(START_CELL)
' write headers
For i = 0 To rst.Fields.Count - 1
.Offset(0, i).Value = rst.Fields.Item(i).Name
Next
' write data
.Offset(1, 0).CopyFromRecordset rst
' create table
Set tblResult = wsReport.ListObjects.Add(xlSrcRange, .CurrentRegion, , xlYes)
' add table name
.Offset(-1, 0) = TABLE_NAME
End With
MsgBox "Rows written = " & rst.RecordCount, vbInformation, TABLE_NAME
rst.Close
Set rst = Nothing
End Sub
Function Connect_To_SQLServer(SERVER_NAME As String, DB_NAME As String) As ADODB.Connection
Dim strConn As String
strConn = "Provider=SQLOLEDB;" & _
"Server=" & SERVER_NAME & ";" & _
"Database=" & DB_NAME & ";" & _
"Trusted_Connection=yes;"
Set Connect_To_SQLServer = New ADODB.Connection
With Connect_To_SQLServer
.Open ConnectionString:=strConn
.CursorLocation = adUseClient
End With
End Function

Update/Upload values from Excel to SQL Server Database

I’ve recently got into SQL Server, trying to build some query to return info (in Excel) from our ERP system (JobBoss) database. I was wondering:
Is there a way to update/change values in the SQL Server database from Excel?
For example, I have established a connection (in Excel) to our SQL Server already, and have a query that SELECTs certain values from specific tables to create a report. However, I was wondering if I can simply change the values in Excel then somehow “upload/synchronize” with the database?
If so, what are the options?
Thanks
Going from Excel to SQL Server? You have several options.
Setup looks link this:
Sub Rectangle1_Click()
'TRUSTED CONNECTION
On Error GoTo errH
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strPath As String
Dim intImportRow As Integer
Dim strFirstName, strLastName As String
Dim server, username, password, table, database As String
With Sheets("Sheet1")
server = .TextBox1.Text
table = .TextBox4.Text
database = .TextBox5.Text
If con.State <> 1 Then
con.Open "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Integrated Security=SSPI;"
'con.Open
End If
'this is the TRUSTED connection string
Set rs.ActiveConnection = con
'delete all records first if checkbox checked
If .CheckBox1 Then
con.Execute "delete from tbl_demo"
End If
'set first row with records to import
'you could also just loop thru a range if you want.
intImportRow = 10
Do Until .Cells(intImportRow, 1) = ""
strFirstName = .Cells(intImportRow, 1)
strLastName = .Cells(intImportRow, 2)
'insert row into database
con.Execute "insert into tbl_demo (firstname, lastname) values ('" & strFirstName & "', '" & strLastName & "')"
intImportRow = intImportRow + 1
Loop
MsgBox "Done importing", vbInformation
con.Close
Set con = Nothing
End With
Exit Sub
errH:
MsgBox Err.Description
End Sub
Also, consider this option.
Sub UpdateTable()
Dim cnn As Object
Dim wbkOpen As Workbook
Dim objfl As Variant
Dim rngName As Range
Workbooks.Open "C:\Users\Excel\Desktop\Excel_to_SQL_Server.xls"
Set wbkOpen = ActiveWorkbook
Sheets("Sheet1").Select
Set rngName = Range(Range("A1"), Range("A1").End(xlToLeft).End(xlDown))
rngName.Name = "TempRange"
strFileName = wbkOpen.FullName
Set cnn = CreateObject("ADODB.Connection")
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
nSQL = "INSERT INTO [odbc;Driver={SQL Server};Server=Excel-PC\SQLEXPRESS;Database=[Northwind].[dbo].[TBL]]"
nJOIN = " SELECT * from [TempRange]"
cnn.Execute nSQL & nJOIN
MsgBox "Uploaded Successfully"
wbkOpen.Close
Set wbkOpen = Nothing
End Sub
Sub InsertInto()
'Declare some variables
Dim cnn As adodb.Connection
Dim cmd As adodb.Command
Dim strSQL As String
'Create a new Connection object
Set cnn = New adodb.Connection
'Set the connection string
cnn.ConnectionString = "Excel-PC\SQLEXPRESS;Database=Northwind;Trusted_Connection=True;"
'Create a new Command object
Set cmd = New adodb.Command
'Open the connection
cnn.Open
'Associate the command with the connection
cmd.ActiveConnection = cnn
'Tell the Command we are giving it a bit of SQL to run, not a stored procedure
cmd.CommandType = adCmdText
'Create the SQL
strSQL = "UPDATE TBL SET JOIN_DT = 2013-01-13 WHERE EMPID = 2"
'Pass the SQL to the Command object
cmd.CommandText = strSQL
'Open the Connection to the database
cnn.Open
'Execute the bit of SQL to update the database
cmd.Execute
'Close the connection again
cnn.Close
'Remove the objects
Set cmd = Nothing
Set cnn = Nothing
End Sub
See the link below for some additional ideas of how to get this done.
https://www.excel-sql-server.com/excel-sql-server-import-export-using-vba.htm#Introduction

I need to export sql server results to new excel work book?

I need results into a new workbook, at present am getting the results in existing workbook?
Sub ConnectSqlServer()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
Dim rsstring As String
Workbooks.Add
ActiveWorkbook.SaveAs "C:\WorkbookName.xls"
sConnString = "Provider=SQLOLEDB;Data Source=PRATEEP-PC\SQLEXPRESS;" & _
"Initial Catalog=PPDS_20Dec_V1_Decomposition;" & _
"Integrated Security=SSPI;"
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
conn.Open sConnString
rsstring = "SELECT * FROM GE_PRODUCT_RESOURCE_MASTER;"
rs.Open rsstring, sConnString
ActiveSheet.Range("B3").CopyFromRecordset rs
rs.Close
conn.Close
End Sub
Tried it and it worked fine. Anyway to make it bulletproof.
Sub ConnectSqlServer()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
Dim rsstring As String
Set NewWorkbook = Workbooks.Add 'To avoid ActiveWorkbook
sConnString = "Provider=SQLOLEDB;Data Source=PRATEEP-PC\SQLEXPRESS;" & _
"Initial Catalog=PPDS_20Dec_V1_Decomposition;" & _
"Integrated Security=SSPI;"
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
conn.Open sConnString
rsstring = "SELECT * FROM GE_PRODUCT_RESOURCE_MASTER;"
rs.Open rsstring, sConnString
NewWorkbook.Range("B3").CopyFromRecordset rs 'directly call the NewWorkbook
rs.Close
conn.Close
NewWorkbook.SaveAs "C:\WorkbookName.xls" 'Save after your change
End Sub

I need to insert data into SQL server from Excel using VBA

I need to insert test-vba.xlsx data into SQL server to the particular database
Sub insertion()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
Dim rsstring As String
Dim m, nrows As Integer
Set wkb = Workbooks("test-vba.xlsx").Worksheets("Sheet1").Activate
sConnString = "Provider=SQLOLEDB;Data Source=PRATEEP-PC\SQLEXPRESS;" & _
"Initial Catalog=PPDS_07Dec_V1_Decomposition;" & _
"Integrated Security=SSPI;"
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
conn.Open sConnString
For m = 0 To nrows - 1
Here are a couple ideas.
Sub UpdateTable()
Dim cnn As Object
Dim wbkOpen As Workbook
Dim objfl As Variant
Dim rngName As Range
Workbooks.Open "C:\Users\Excel\Desktop\Excel_to_SQL_Server.xls"
Set wbkOpen = ActiveWorkbook
Sheets("Sheet1").Select
Set rngName = Range(Range("A1"), Range("A1").End(xlToLeft).End(xlDown))
rngName.Name = "TempRange"
strFileName = wbkOpen.FullName
Set cnn = CreateObject("ADODB.Connection")
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
nSQL = "INSERT INTO [odbc;Driver={SQL Server};Server=Server_Name;Database=[Database_Name].[dbo].[TBL]]"
nJOIN = " SELECT * from [TempRange]"
cnn.Execute nSQL & nJOIN
MsgBox "Uploaded Successfully"
wbkOpen.Close
Set wbkOpen = Nothing
End Sub
Sub InsertInto()
'Declare some variables
Dim cnn As adodb.Connection
Dim cmd As adodb.Command
Dim strSQL As String
'Create a new Connection object
Set cnn = New adodb.Connection
'Set the connection string
cnn.ConnectionString = "Server_Name;Database=Database_Name;Trusted_Connection=True;"
'Create a new Command object
Set cmd = New adodb.Command
'Open the connection
cnn.Open
'Associate the command with the connection
cmd.ActiveConnection = cnn
'Tell the Command we are giving it a bit of SQL to run, not a stored procedure
cmd.CommandType = adCmdText
'Create the SQL
strSQL = "UPDATE TBL SET JOIN_DT = 2013-01-13 WHERE EMPID = 2"
'Pass the SQL to the Command object
cmd.CommandText = strSQL
'Open the Connection to the database
cnn.Open
'Execute the bit of SQL to update the database
cmd.Execute
'Close the connection again
cnn.Close
'Remove the objects
Set cmd = Nothing
Set cnn = Nothing
End Sub
Here is another idea.
Sub Button_Click()
'TRUSTED CONNECTION
On Error GoTo errH
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strPath As String
Dim intImportRow As Integer
Dim strFirstName, strLastName As String
Dim server, username, password, table, database As String
With Sheets("Sheet1")
server = .TextBox1.Text
table = .TextBox4.Text
database = .TextBox5.Text
If con.State <> 1 Then
con.Open "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Integrated Security=SSPI;"
'con.Open
End If
'this is the TRUSTED connection string
Set rs.ActiveConnection = con
'delete all records first if checkbox checked
If .CheckBox1 Then
con.Execute "delete from tbl_demo"
End If
'set first row with records to import
'you could also just loop thru a range if you want.
intImportRow = 10
Do Until .Cells(intImportRow, 1) = ""
strFirstName = .Cells(intImportRow, 1)
strLastName = .Cells(intImportRow, 2)
'insert row into database
con.Execute "insert into tbl_demo (firstname, lastname) values ('" & strFirstName & "', '" & strLastName & "')"
intImportRow = intImportRow + 1
Loop
MsgBox "Done importing", vbInformation
con.Close
Set con = Nothing
End With
Exit Sub
errH:
MsgBox Err.Description
End Sub
Also, check out the links below.
http://www.cnblogs.com/anorthwolf/archive/2012/04/25/2470250.html
http://www.excel-sql-server.com/excel-sql-server-import-export-using-vba.htm

Loop through excel spreadsheet using macro

I'm trying to loop through excel cells to get value from sql server table. I've written a macro that will take the jobnumber from the excel and query sql server tale to get customer details and dump it on the spreadsheet. So far I'm only able to get data for single cell. How can I loop through the excel cells for more than one jobnumber. I'm new to VBA. Thanks for your help. Here is my macro:
Sub ConnectSqlServer()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
Dim newrow As String
newrow = Worksheets("Sheet1").Cells(1, "A").Value
' Create the connection string.
sConnString = "Provider=SQLOLEDB;Data Source=0.0.0.0;" & _
"Initial Catalog=asset;" & _
"User ID=Temp;Password=test123;"
' 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 customer FROM job_tab where jobnum2='" & Trim(newrow) & "';")
' Check we have data.
If Not rs.EOF Then
' Transfer result.
Sheets(1).Range("B1").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
You can do so, by using the IN SQL statement:
SELECT customer FROM job_tab WHERE jobnum2 IN ( 'Value1', 'Value2', ... );
Therefore you have to loop through all the customers in column A of your table and alter the SQL request to use the above mentioned statement:
Sub ConnectSqlServer()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
Dim newrow As String
'MODIFIED: create the search string for the IN-Statement
newrow = "("
For i = 1 To Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, "A").End(xlUp).Row
newrow = newrow & "'" & Trim(Worksheets("Sheet1").Cells(i, "A").value) & "',"
Next i
newrow = Left(newrow, Len(newrow) - 1)
newrow = newrow & ")"
' Create the connection string.
sConnString = "Provider=SQLOLEDB;Data Source=0.0.0.0;" & _
"Initial Catalog=asset;" & _
"User ID=Temp;Password=test123;"
' Create the Connection and Recordset objects.
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
' Open the connection and execute.
conn.Open sConnString
'MODIFIED: altered the SQL statement to use the search string with IN
Set rs = conn.Execute("SELECT customer FROM job_tab where jobnum2 IN " & newrow & "';")
' Check we have data.
If Not rs.EOF Then
' Transfer result.
Sheets(1).Range("B1").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

Resources