Frank Kabel said:
Excel is not designed for this
kind of database application
Questionable, to say the least. One may use ADO to access databases.
The OLE DB provider for Jet has been given the capability to query
Excel data. There are article on MSDN telling how to query Excel data
using ADO and OLEDB. If Frank Kabel is not designed for this
kind of application, just say so ;-)
Option Explicit
Sub test()
CopyToNewWorksheet "Master", "client"
End Sub
Private Function CopyToNewWorksheet( _
ByVal SheetName As String, _
Optional ByVal NewSheetName As String _
) As Boolean
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim Target As Excel.Range
Dim Con As Object
Dim rs As Object
Dim strCon As String
Dim strPath As String
Dim strSql1 As String
Dim lngCounter As Long
' Review the following constant:
Const FILENAME_XL_TEMP As String = "" & _
"delete_me.xls"
Const TABLE_XL_TEMP As String = "" & _
"test_only"
Const SQL As String = "" & _
"SELECT * FROM [<SHEET_NAME>$] WHERE MyName='Hind';"
' Do NOT amend the following constants
Const CONN_STRING As String = "" & _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=<PATH><FILENAME>;" & _
"Extended Properties='Excel 8.0;HDR=YES'"
' Build connection string
strPath = ThisWorkbook.Path & _
Application.PathSeparator
strCon = CONN_STRING
strCon = Replace(strCon, _
"<PATH>", strPath)
strCon = Replace(strCon, _
"<FILENAME>", FILENAME_XL_TEMP)
' Build sql statement
strSql1 = SQL
strSql1 = Replace(strSql1, _
"<SHEET_NAME>", TABLE_XL_TEMP)
' Delete old instance of temp workbook
On Error Resume Next
Kill strPath & FILENAME_XL_TEMP
On Error GoTo 0
' Save copy of worksheet to temp workbook
Set wb = Excel.Application.Workbooks.Add()
With wb
ThisWorkbook.Worksheets(SheetName). _
Copy .Worksheets(1)
.Worksheets(1).Name = TABLE_XL_TEMP
.SaveAs strPath & FILENAME_XL_TEMP
.Close
End With
' Open connection to temp workbook
Set Con = CreateObject("ADODB.Connection")
With Con
.ConnectionString = strCon
.Open
Set rs = .Execute(strSql1)
End With
Set ws = ThisWorkbook.Worksheets.Add
With ws
If Len(NewSheetName) > 0 Then
.Name = NewSheetName
End If
Set Target = .Range("A1")
End With
With rs
For lngCounter = 1 To .fields.Count
Target(1, lngCounter).Value = _
.fields(lngCounter - 1).Name
Next
End With
Target(2, 1).CopyFromRecordset rs
Con.Close
CopyToNewWorksheet = True
End Function
Jamie.