Excel VB Code ODBC query results to Excel sheet

Say,
I have a MySQL select query that returns the results of 5 fields and I wish to display these in an excel sheet. Each fields results to be displayed in a separate column in the excel sheet. I'm using ODBC to link to the query stored in the MySQL database.
How can I go about this?
shaunwinginAsked:
Who is Participating?
 
ste5anConnect With a Mentor Senior DeveloperCommented:
It's the same as you already have:

Dim conn1 As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim fld1 As ADODB.Field

Set conn1 = New ADODB.Connection
conn1.ConnectionString = "DRIVER={MySQL ODBC 5.2 ANSI Driver};SERVER=sql19.jnb2;DATABASE=ateleh_db5;UID=ateleh_5;PWD=;OPTION=3"
conn1.Open

sql1 = "CALL SHIFTCAPTURE('" & CompanyNo & "','" & Shift & "');"
Set rs1 = conn1.Execute(sql1)
Sheets("Clockings").Range("A1:ZZ65536").CopyFromRecordset rs1
rs1.Close 

Open in new window

0
 
ste5anSenior DeveloperCommented:
Create a view with this query in your schema. Create a ODBC DSN. Then you can simply use Get External Data / From Other Sources / From Data Connection Wizard in the Data tab and retrieve the data from your view.
0
 
shaunwinginAuthor Commented:
Say, I need to automate this in Excel and can't use this method as far as can tell.
Please also supply an example.
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
Julian HansenCommented:
If I understand correctly you want to pull data into Excel from MySQL

Are you familiar with the data import wizard in Excel?

You can setup a Macro that invokes a connection to an ODBC source and pulls data into the spreadsheet.

Post back if this is what you need and if you need further instructions.
0
 
shaunwinginAuthor Commented:
You are correct. I want to use pure VB code to do this.
Please give example tx.
0
 
ste5anSenior DeveloperCommented:
HHCIB? Ever heard of macros? Just record one using the steps I've described. This gives you the necessary information. E.g.

Option Explicit

Sub Macro1()
'
' Macro1 Macro
'

'
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "ODBC;DSN=yourDsnName;", Destination:=Range("$A$1")). _
        QueryTable
        .CommandText = Array( _
        "SELECT * FROM `schema`.`tableOrView`")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .SourceConnectionFile = _
        "nameOfDataConnectionFile.odc"
        .ListObject.DisplayName = "someNiceNameToDisplay"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Open in new window

0
 
Julian HansenCommented:
You can do this as follows

1. Create a new macro and start recording
2. Go to the Excel Data tab -> Import External Data -> New Database Query
3. Select your Data source
4. Select your fields and whatever filtering etc you need by answering the relevant sections in the wizard
5. Select return to Excel

That's pretty much it - stop the macro and you get your VB source
0
 
shaunwinginAuthor Commented:
I have - but would like VB code - as more robust.
0
 
ste5anSenior DeveloperCommented:
A macro IS code.
0
 
Julian HansenCommented:
I have - but would like VB code - as more robust.
This is not a valid statement.
If you follow the directions in my last post and look at the source of the Macro you will see it is exactly the code you need to run.
0
 
shaunwinginAuthor Commented:
I see what you are saying, but it uses a macro to create this - can you supply pure code pls.
0
 
ste5anSenior DeveloperCommented:
What do you think, I have posted? Even when it's named MacroX, it's still pure VBA code. So what do you want?
0
 
shaunwinginAuthor Commented:
I'm using code of this nature:

Dim conn1 As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim fld1 As ADODB.Field

Set conn1 = New ADODB.Connection
conn1.ConnectionString = "DRIVER={MySQL ODBC 5.2 ANSI Driver};SERVER=sql19.jnb2;DATABASE=ateleh_db5;UID=ateleh_5;PWD=;OPTION=3"
conn1.Open

sql1 = "select record from sosh_facileforms_subrecords where title = 'DAY SHIFT' and value ='" & Shift & "';"
Set rs1 = conn1.Execute(sql1)
ShiftID = rs1.Fields(0).Value
rs1.Close
0
 
ste5anSenior DeveloperCommented:
So what? Just copy the data from recordset into your sheet. E.g.

ActiveSheet.Range("A1:ZZ65536").CopyFromRecordset rs1

Open in new window

0
 
shaunwinginAuthor Commented:
This seems like it will help me - will have to try and revert - tx
0
 
shaunwinginAuthor Commented:
Works well tx.
Pls explain difference between these two statements?
 Sheets("Clockings").Activate
    Sheets("Clockings").Select
0
 
ste5anSenior DeveloperCommented:
There can be only one active object, but many selected in the Selection object. Some objects must be activated before they can be selected.
0
 
shaunwinginAuthor Commented:
Tx. How will I make the "Clockings" sheet active to apply your code?
0
 
ste5anSenior DeveloperCommented:
You don't have to. There's normally always an ActiveSheet in Excel at this stage.
0
 
shaunwinginAuthor Commented:
tx. How would I return results of this statement please and insert into sheet?
conn.Execute "CALL SHIFTCAPTURE('" & CompanyNo & "','" & Shift & "');"

SHIFTCAPTURE is a stored query?
0
 
shaunwinginAuthor Commented:
Say, If I'm actually calling a Stored Procedure which included several select queries can I create a type of record set array to return the results of each query or must I break up the stored procedure into separate select queries?
0
 
ste5anSenior DeveloperCommented:
No, but you must handle the multiple resultsets wit NextRecordset, e.g.

sql1 = "CALL SHIFTCAPTURE('" & CompanyNo & "','" & Shift & "');"
Set rs1 = conn1.Execute(sql1)
Sheets("Clockings").Range("A1:ZZ65536").CopyFromRecordset rs1
Set rs1 = rs1.NextRecordSet
Sheets("otherSheet1").Range("A1:ZZ65536").CopyFromRecordset rs1
Set rs1 = rs1.NextRecordSet
Sheets("otherSheet2").Range("A1:ZZ65536").CopyFromRecordset rs1
rs1.Close 

Open in new window

0
 
shaunwinginAuthor Commented:
Wow tx - save a lot of time!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.