Vba-excel中的语法错误

我在两个不同的工作簿中都有一张纸。 两张纸都是一样的,只是纸2有3-4个logging。 我使用左连接来获取这些logging,但得到一个语法错误。 任何帮助表示赞赏。 谢谢。 例如:-

Workbook1 Workbook2 Sheet 1 Sheet 1 ID Name ID Name 123 Jim 123 Jim 255 jack 255 jack 275 alice 275 alice 300 Bob 

所以你看第一个有4个logging,第二个有3个,总是这样。 我只需要在第一张纸和logging中find额外的logging。

 Sub get_unknowns() Dim cn As ADODB.Connection Set cn = New ADODB.Connection Set x = Workbooks.Open("A.xlsx") Set y = Workbooks.Open("B.xlsx") With cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties=Excel 8.0;" .Open End With Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open "SELECT * FROM [x.Worksheets("Sheet1")] LEFT JOIN [y.Worksheets("Sheet1")] ON [x.Worksheets("Sheet1")$].[PrimaryID] NOT IN " & _ "[[y.Worksheets("Sheet1")$].[primaryId]", cn With Worksheets("Sheet3") .Cells(2, 1).CopyFromRecordset rs End With rs.Close cn.Close End Sub 

正如所build议我做了一些改变,并尝试,我有两张工作簿在同一个工作簿,并尝试使用左连接

 Sub get_employees() Dim cn As ADODB.Connection Set cn = New ADODB.Connection Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset cn.ConnectionString = _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.Path & "H:\testing\demo\test1.xlsx;" & _ "Extended Properties=""Excel 12.0"";" rs.Open "SELECT * FROM [Sheet1$] as A LEFT JOIN [Sheet2$] as B ON A.[Id] =B.[Id]", cn With Worksheets("Sheet3") .Cells(2, 1).CopyFromRecordset rs End With rs.Close cn.Close End Sub 

现在抛出一个运行时错误3709,连接不能用来执行这个操作。 它在这种情况下是封闭的或无效的。

您的连接string似乎是不正确的,你还没有打开连接。 尝试这样的事情

 Sub get_employees() Dim cn As ADODB.Connection Set cn = New ADODB.Connection Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes"";" .Open End With rs.Open "SELECT * FROM [Sheet1$] as A LEFT JOIN [Sheet2$] as B ON A.[Id] =B.[Id]", cn, adOpenKeyset, adLockReadOnly With Worksheets("Sheet3") .Cells(2, 1).CopyFromRecordset rs End With rs.Close cn.Close End Sub 

那么,有几个问题:

a)你不能用JET打开一个xlsx文件,你需要ACE,比如:

  cn.ConnectionString = _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.Path & "\Workbookname.xlsx;" & _ "Extended Properties=""Excel 12.0"";" 

b)您不需要在VBA中打开工作簿; 连接自己做,但是:
c)连接只计算一个工作簿。 我不认为跨工作簿查询是可能的。
d) FROM部分中的表格的语法是[Sheetname$] ,您必须正确地将其填充到string中(VBAvariables的名称在查询string中不起作用)。 该工作表必须位于通过连接string打开的工作簿中。