![]() Back to jkp-ads.com |
Ron de Bruin
|
|
Ron de Bruin decided to remove all Windows Excel content from his website for personal reasons. If you want to know why, head over to rondebruin.nl.
Luckily, Ron was kind enough to allow me to publish all of his Excel content here.
Most of these pages are slightly outdated and may contain links that don 't work. Please inform me if you find such an error and I'll try to fix it.
Kind regards
Jan Karel Pieterse
Most examples on the internet are not so easy to work with for a normal
user like me. I have try to change that on this webpage. We use small
macro's that are not so difficult to use/change that call one big macro
named GetDataFromAccess. The examples are created in 2006 but still working
in Excel 2013.
You can download a zip file on the bottom of this page
with two Excel workbooks and the OrderDatabase.mdb to test the examples.
In one workbook you can find all code from this page and in the other
one it is very easy get the info you want because you can save the criteria
(100 or more) and can use Data>Validation cells to select your criteria.
Note: the workbooks and the OrderDatabase.mdb must be in
the same folder
In the OrderDatabase.mdb there is a
table named Orders with the following fields:
OrderNumber
OrderDate
RequiredDate
ShippedDate
Freight
ShipVia
ShipCountry
ShipName
ShipAddress
ShipCity
ShipRegion
ShipPostalCode
Below you find a few example macro's that you can
use to retrieve only the records you want
First line:
Path/name of the Access file, Table name
Second-Eighth line:
You can fill in seven criteria, and if you not fill in any criteria it
return all records
The first three criteria are only for Text fields
The fourth and fifth are for numbers fields
The sixth and seventh are for
date fields
Line nine: Destination sheet/range
Line ten: Which fields ( * = all), Copy field names, clear
all cells on Destination sheet first
Note: If you use criteria 4-7
(number or Date fields) you can change >, <, >=, <= to get the result you
want.
Sub Test1() 'This example retrieves the data for the records in which ShipCountry = Germany GetDataFromAccess ThisWorkbook.Path & "/OrderDatabase.mdb", "Orders", _ "ShipCountry", "=", "Germany", _ "", "=", "", _ "", "=", "", _ "", ">", "", _ "", "<", "", _ "", ">=", "", _ "", "<=", "", _ Sheets("test").Range("A8"), _ "*", True, True End Sub Sub Test2() 'This example retrieves also the data for the records in which ShipCountry = Germany 'It only retrieves this four fields: OrderNumber, ShipName, ShipAddress, ShipPostalCode 'I changed the "*" for WhichFields in the code to the names of the fields GetDataFromAccess ThisWorkbook.Path & "/OrderDatabase.mdb", "Orders", _ "ShipCountry", "=", "Germany", _ "", "=", "", _ "", "=", "", _ "", ">", "", _ "", "<", "", _ "", ">=", "", _ "", "<=", "", _ Sheets("test").Range("A8"), _ "OrderNumber, ShipName, ShipAddress, ShipPostalCode", True, True End Sub Sub Test3() 'This example retrieves the data for the records in which 'ShipCountry = Germany and ShipVia = Speedy Express GetDataFromAccess ThisWorkbook.Path & "/OrderDatabase.mdb", "Orders", _ "ShipCountry", "=", "Germany", _ "ShipVia", "=", "Speedy Express", _ "", "=", "", _ "", ">", "", _ "", "<", "", _ "", ">=", "", _ "", "<=", "", _ Sheets("test").Range("A8"), _ "*", True, True End Sub Sub Test4() 'This example retrieves the data for the records in which 'ShipCountry = Germany and ShipVia = Speedy Express 'and Freight = between 100 and 300 GetDataFromAccess ThisWorkbook.Path & "/OrderDatabase.mdb", "Orders", _ "ShipCountry", "=", "Germany", _ "ShipVia", "=", "Speedy Express", _ "", "=", "", _ "Freight", ">", "100", _ "Freight", "<", "300", _ "", ">=", "", _ "", "<=", "", _ Sheets("test").Range("A8"), _ "*", True, True End Sub Sub Test5() 'This example retrieves the data for the records in which 'ShipCountry = Germany and ShipVia = Speedy Express 'and ShippedDate = between 1/1/1998 and 3/1/1998 GetDataFromAccess ThisWorkbook.Path & "/OrderDatabase.mdb", "Orders", _ "ShipCountry", "=", "Germany", _ "ShipVia", "=", "Speedy Express", _ "", "=", "", _ "", ">", "", _ "", "<", "", _ "ShippedDate", ">=", "1/1/1998", _ "ShippedDate", "<=", "3/1/1998", _ Sheets("test").Range("A8"), _ "*", True, True End Sub Sub Test6() 'This example retrieves all records GetDataFromAccess ThisWorkbook.Path & "/OrderDatabase.mdb", "Orders", _ "", "=", "", _ "", "=", "", _ "", "=", "", _ "", ">", "", _ "", "<", "", _ "", ">=", "", _ "", "<=", "", _ Sheets("test").Range("A8"), _ "*", True, True End Sub
And this is the big macro that you not have to change
Public Sub GetDataFromAccess(MyDatabaseFilePathAndName As String, MyTable As String, _
MyTableField1 As String, S1 As String, MyFieldValue1 As String, _
MyTableField2 As String, S2 As String, MyFieldValue2 As String, _
MyTableField3 As String, S3 As String, MyFieldValue3 As String, _
MyTableField4 As String, S4 As String, MyFieldValue4 As String, _
MyTableField5 As String, S5 As String, MyFieldValue5 As String, _
MyTableField6 As String, S6 As String, MyFieldValue6 As String, _
MyTableField7 As String, S7 As String, MyFieldValue7 As String, _
DestSheetRange As Range, WhichFields As String, _
FieldNames As Boolean, ClearRange As Boolean)
'Date changed : 18 Feb 2006
'Add the WhichFields option to copy only the fields you want
Dim MyConnection As String
Dim MySQL As String
Dim MyDatabase As Object
Dim col As Integer
Dim I As Integer
Dim str1 As Variant
Dim str2 As Variant
Dim str3 As Variant
'Select the DestSheetRange where you paste the records
Application.GoTo DestSheetRange
'If ClearRange = True it clear all cells on that sheet first
If ClearRange Then Range(DestSheetRange.Address, "IV" & Rows.Count).ClearContents
'Create connection string
MyConnection = "Provider=Microsoft.Jet.OLEDB.4.0;"
MyConnection = MyConnection & "Data Source=" & MyDatabaseFilePathAndName & ";"
' Create MySQL string
str1 = Array(MyTableField1, MyTableField2, MyTableField3, MyTableField4, _
MyTableField5, MyTableField6, MyTableField7)
str2 = Array(S1, S2, S3, S4, S5, S6, S7)
str3 = Array(MyFieldValue1, MyFieldValue2, MyFieldValue3, MyFieldValue4, _
MyFieldValue5, MyFieldValue6, MyFieldValue7)
MySQL = ""
For I = LBound(str1) To UBound(str1)
If str3(I) <> "" Then
If MySQL = "" Then
If I <= 2 Then
MySQL = "SELECT " & WhichFields & " FROM " & MyTable & " WHERE [" _
& str1(I) & "] " & str2(I) & " '" & str3(I) & "'"
ElseIf I = 3 Or I = 4 Then
MySQL = "SELECT " & WhichFields & " FROM " & MyTable & " WHERE [" _
& str1(I) & "] " & str2(I) & " " & str3(I)
ElseIf I = 5 Or I = 6 Then
MySQL = "SELECT " & WhichFields & " FROM " & MyTable & " WHERE [" _
& str1(I) & "] " & str2(I) & " #" & str3(I) & "#"
End If
Else
If I <= 2 Then
MySQL = MySQL & " and [" & str1(I) & "] " & str2(I) & " '" & str3(I) & "'"
ElseIf I = 3 Or I = 4 Then
MySQL = MySQL & " and [" & str1(I) & "] " & str2(I) & " " & str3(I)
ElseIf I = 5 Or I = 6 Then
MySQL = MySQL & " and [" & str1(I) & "] " & str2(I) & " #" & str3(I) & "#"
End If
End If
End If
Next I
'If MySQL is empty copy all records
If MySQL = "" Then MySQL = "SELECT " & WhichFields & " FROM " & MyTable & ";"
' Open the database and copy the data
On Error GoTo SomethingWrong
Set MyDatabase = CreateObject("adodb.recordset")
MyDatabase.Open MySQL, MyConnection, 0, 1, 1
' Check to make sure we received data and copy the data
If Not MyDatabase.EOF Then
'If FieldNames = True copy the field names and records
'If = False copy only records
If FieldNames Then
For col = 0 To MyDatabase.Fields.Count - 1
DestSheetRange.Offset(0, col).Value = MyDatabase.Fields(col).Name
Next
DestSheetRange.Offset(1, 0).CopyFromRecordset MyDatabase
Else
DestSheetRange.CopyFromRecordset MyDatabase
End If
Else
MsgBox "No records returned from : " & MyDatabaseFilePathAndName, vbCritical
End If
MyDatabase.Close
Set MyDatabase = Nothing
Exit Sub
SomethingWrong:
On Error GoTo 0
Set MyDatabase = Nothing
MsgBox "Error copying data", vbCritical, "Test Access data to Excel"
End Sub
Instead of enter field values in the code you can also use a cell value
"ShipVia", "=", Sheets("Sheet1").Range("A2").Value
Check out "Example to save criteria.xls" where I use data
validation cells with unique values from the fields
and you can also save
your criteria (100 or more).
See also this page from Ole P. Erlandsen's
http://www.erlandsendata.no/english/index.php?t=envbadac