Excel vba - ADO inner join on data tables

2019-08-31 04:50发布

I have two data tables in excel that I wish to join into a single set in my vba code. I have identified the ADO connector as the best way to do this, however using the query below, I get the following error

"Run time error -2147217904

No value given for one or more required parameters"

SELECT components.[name], InputData.Datatype 
FROM [Rules$A5:F30] components 
INNER JOIN [Rules$O5:R17] InputData ON components.[name] = InputData.[name]  
WHERE components.RowId = 0 GROUP BY components.[name], InputData.Datatype

EDIT: The full code:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim dataRows As Integer

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strsql = "SELECT components.[name], InputData.Datatype " _
            + " FROM [" + GetTableAddress("componentTable") _
            + "] components INNER JOIN [" + GetTableAddress("DataLocations") + "] InputData" _
            + " ON components.[name] = InputData.[name] " _
            + " WHERE components.RowId = " + CStr(RowId) + " GROUP BY components.[name], InputData.Datatype"
rs.Open strsql, cn
If Not rs.EOF Then
    dataRows = rs.GetRows

and the GetTableAddress function

Private Function GetTableAddress(tableName)
Dim oSh As Worksheet
Dim oLo As ListObject

For Each oSh In ThisWorkbook.Worksheets
    For Each oLo In oSh.ListObjects
        If oLo.Name = tableName Then
            GetTableAddress = Replace(oSh.ListObjects(tableName).Range.AddressLocal, "$", "")
            GetTableAddress = oSh.Name + "$" + GetTableAddress
        End If
    Next
Next

End Function

1条回答
来,给爷笑一个
2楼-- · 2019-08-31 05:35

If both data sets are in Excel, you should use vLookup to create the final table. It'll be easier for you and the benefit is that you can use syntax that you're already familiar with.

vLookup is essentially a table join. You can even use it with Application.WorksheetFunctions if you wish to do it that way.

Also, RecordSet.GetRows can return an array. You should probably use CInt(rs.GetString) if you're not expecting more than one value to be returned.

查看更多
登录 后发表回答