You can make the SQL query to the worksheet in the opened workbook (the same way as to any other workbook). In this case the query string will be as follows:
SELECT SUM([Training Hours]) AS Myval FROM [data sheet$] WHERE Country = 'USA' AND [Training Status] = 'Completed';
Here is the code
Sub TestSQLRequest()
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
Select Case LCase(Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")))
Case ".xls"
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 8.0;HDR=YES;"";"
Case ".xlsm"
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 12.0 Macro;HDR=YES;"";"
End Select
With CreateObject("ADODB.Connection")
.Open strConnection
With .Execute("SELECT SUM([Training Hours]) AS Myval FROM [data sheet$] WHERE Country = 'USA' AND [Training Status] = 'Completed';")
Myval = .Fields("Myval")
End With
.Close
End With
MsgBox Myval
End Sub
Within the query string, the column names with spaces should be put into square brackets, as well as the name of the worksheet containing data followed by $
.
It goes without saying that the query can't access to the data, which wasn't saved to the file after some changes have been made to the sheet.
Note that Excel 8.0
provider won't work on 64-bit Excel version, try to use Excel 12.0
provider instead (the second strConnection
assignment).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…