[英]Syntax error in Vba-excel
我在两个不同的工作簿中各有一张纸。 两张纸都一样,除了第二张纸有3-4条记录。 我使用左联接来获取这些记录,但是会出现语法错误。 任何帮助表示赞赏。 谢谢。 例如:-
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条记录,第二个有3条记录,情况总是如此。 我只需要在第一张纸和记录中找到该额外记录。
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
根据建议,我进行了一些更改并尝试过,我在同一工作簿中有两张纸,并尝试使用左连接
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,表明该连接无法用于执行此操作。 在这种情况下,它是关闭的或无效的。
好吧,有几个问题:
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$]
,您必须将其正确填写到字符串中(VBA变量的名称在查询字符串中无济于事)。 该工作表必须位于通过连接字符串打开的工作簿中。
您的连接字符串似乎不正确,您还没有打开连接。 试试这个
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.