ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 689|回复: 9

[已解决] LEFT JOIN 两个工作簿

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-9 16:16 | 显示全部楼层 |阅读模式
本帖最后由 xjy426 于 2022-12-10 11:32 编辑

想问一个思路。ADO可以Left join两个工作簿吗?



假设有这么两个工作簿:
工作簿1=(订单【订单号,客户,品名,数量】,客户要求【客户,包装要求】),文件地址=Path1(包含文件名)
工作簿2=(生产【品名,车台】),文件地址=Path2(包含文件名)

以下代码可以得到 (订单号,品名,包装要求)。
如何得到(订单号,品名,数量,车台,包装要求)?需要定义两个CONN和两个rs,打开后再查询吗?是的话,如何联系两个不同的conn?

    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim txtSql As String
    With conn
        If Application.Version = "11.0" Then
            .Provider = "microsoft.jet.oledb.4.0"
            .ConnectionString = "extended properties=""excel 8.0;HDR=yes;IMEX=1;"";data source=" & path1
        Else
            .Provider = "microsoft.ACE.oledb.12.0"
            .ConnectionString = "extended properties=""excel 12.0;HDR=yes;IMEX=1;"";data source=" & path1
        End If
        .Open
    End With
    txtSql = "SELECT [订单$].[订单号], [订单$].[品名], [客户要求$].[包装要求] "
    txtSql = txtSql & "FROM [订单$] LEFT JOIN [客户要求$] ON [订单$].[客户]=[客户要求$].[客户]"
    rs.Open txtSql, conn, adOpenKeyset, adLockReadOnly
    If rs.EOF Then
        MsgBox "未找到数据", , "提示"
        Exit Sub
    End If




TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-9 16:26 | 显示全部楼层
补一下SQL语句,应该可以用:

SELECT [订单$].订单号, [订单$].品名, [订单$].数量,[生产$].车台,[客户要求$].包装要求
FROM ([订单$] LEFT JOIN [生产$] ON  [订单$].品名 = [生产$].品名) LEFT JOIN [客户要求$] ON  [订单$].客户 = [客户要求$].客户;

就是不知道ADO应该怎么连接。

TA的精华主题

TA的得分主题

发表于 2022-12-9 17:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
可以先链接第一个表之后在链接第二个表
类似 select * from table1 left join table2 as tmptable1
然后
select * from tmptable1  left join table3

TA的精华主题

TA的得分主题

发表于 2022-12-9 17:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 据想象而写() '
  Dim strFile(1) As String
  strFile(0) = ThisWorkbook.Path & "\工作簿1.xlsx"
  strFile(1) = ThisWorkbook.Path & "\工作簿2.xlsx"
  If Dir(strFile(0)) = "" Or Dir(strFile(1)) = "" Then MsgBox "文件不存在!", 64: Exit Sub
  Dim Conn As New ADODB.Connection, rs As New ADODB.Recordset
  Dim strConn As String, SQL As String, s As String, i As Integer
  s = "Excel 12.0;HDR=Yes;IMEX=1;Database="
  If Application.Version < 12 Then
    s = Replace(s, "12.0", "8.0")
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source="
  Else
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source="
  End If
  Conn.Open strConn & strFile(0)
  'SELECT [订单$].订单号, [订单$].品名, [订单$].数量,[生产$].车台,[客户要求$].包装要求 FROM ([订单$] LEFT JOIN [生产$] ON  [订单$].品名 = [生产$].品名) LEFT JOIN [客户要求$] ON  [订单$].客户 = [客户要求$].客户
  SQL = "SELECT a.订单号,a.品名,a.数量,b.车台,c.包装要求 FROM ([订单$] a LEFT JOIN [" & s & strFile(1) & "].[生产$] b ON a.品名=b.品名) LEFT JOIN [客户要求$] c ON a.客户=c.客户"
  rs.Open SQL, Conn, adOpenKeyset, adLockOptimistic
  For i = 0 To rs.Fields.Count - 1
    Range("A2").Offset(0, i) = rs.Fields(i).Name
  Next
  Range("A3").CopyFromRecordset rs
  rs.Close
  Set rs = Nothing
  Conn.Close
  Set Conn = Nothing
  Beep
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-9 17:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-9 18:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不上个附件吗

TA的精华主题

TA的得分主题

发表于 2022-12-9 22:49 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-10 11:21 | 显示全部楼层
fzxba 发表于 2022-12-9 17:40
Sub 据想象而写() '
  Dim strFile(1) As String
  strFile(0) = ThisWorkbook.Path & "\工作簿1.xlsx"

感谢4楼 fzxba 老师的帮助,问题已经得到解决,代码能完美完成任务。正在学习中。

这段代码中,变量conn 和 rs 仅 dim 各一个,仅 open 一次。

在SQL语句中,用 a、b、c 各指代一个sheet名 [订单$] ,  b 指代 [生产$] , c 指代 [客户要求$]  。我重来没有见过这种指代,学到了学到了,下次也用上。我想应该还可以在SQL语句中添加条件、排序中指代吧。access中不知道能不能用,我去试试看。

conn打开的是工作簿1,包含两个sheet(a、c),然后在SQL语句中,直接将链接字符串指向工作簿2:[Excel 12.0;HDR=Yes;IMEX=1;Database=工作簿2].[生产$] b,我就是不会写这个!如何在SQL语句中嵌套其它连接!!学会这个方法,就可以在自己会写的SQL中替换、嵌套进去,连接多个表,多重链接查询!!



image.png

test_leftjoin.zip

36.24 KB, 下载次数: 7

模拟

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-10 11:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
已解决,怎么改帖子状态??

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-10 11:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-20 11:47 , Processed in 0.040574 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表