暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA数据库之数据表的内连接查询

VBA语言専攻 2022-11-04
112
【分享成果,随喜正能量】与优秀的人合作。离笨人远一些,他们只会给你添乱。不要用假装很忙来刷存在感。假装多了,你就真的忙乱而低效。。
  《VBA数据库解决方案》教程(10090845)是我推出的第二套教程,目前已经是第一版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64位OFFICE系统测试。
这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:VBA数据库之数据表的内连接查询

第五十七讲  内连接(Inner join)应用于两个数据表

大家好,我们继续讲解VBA数据库解决方案,今日讲解第57讲内容: 内连接(Inner join)应用于两个数据表的讲解。这讲的内容还是讲内连接的应用,我们在上一讲中讲了内连接在工作表中的应用,今天的内容是内连接在数据表中的应用。大家要清楚我本书中常用的一些概念,工作表指的是EXCEL文件中的工作表,数据表是指我们数据库中的数据表,是两个不同的概念。对于数据表而言,我此书中讲解的主要利用的是accdb 数据库。

1  应用场景的具体分析

在上节中我们讲了内连接的意义:内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,返回与连接条件匹配的数据行。我们在数据库mydat2中有员工信息的表如下:
在数据库mydata中有分红记录如下:
我们要根据两个表中记录的员工编号匹配一下员工的分红情况记录返回到工作表中,这里该怎么写这个代码呢?

2  内连接(Inner join)应用于两个数据表的代码及代码解读

先看看我给出的代码:
Sub mynzRecords_57() '第57讲 内连接(Inner join)应用于两个数据表的讲解
    Dim cnADO, rsADO As Object
    Dim strPath, strSQL As String
    Worksheets("57").Select
    Cells.ClearContents
    Set cnADO = CreateObject("ADODB.Connection")
    Set rsADO = CreateObject("ADODB.Recordset")
    strPath = ThisWorkbook.Path & "\mydata2.accdb"
    strTable = "员工信息"
    cnADO.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & strPath
    strSQL = "SELECT a.员工编号,a.姓名,a.性别,b.金额 FROM  " _
        & "员工信息 AS a INNER JOIN [MS Access;Pwd=;Database=" & ThisWorkbook.Path _
        & "\mydata.accdb;].员工分红 AS b ON a.员工编号 = b.员工编号"
    rsADO.Open strSQL, cnADO, 1, 3
    For i = 1 To rsADO.Fields.Count
        Cells(1, i) = rsADO.Fields(i - 1).Name
    Next
    Range("a2").CopyFromRecordset rsADO
    ActiveSheet.Columns(rsADO.Fields.Count).NumberFormatLocal = "¥#,##0.00;¥-#,##0.00"
    rsADO.Close
    cnADO.Close
    Set rsADO = Nothing
    Set cnADO = Nothing
 End Sub

代码截图:

代码讲解:
1  strSQL = "SELECT a.员工编号,a.姓名,a.性别,b.金额 FROM  "
 & "员工信息 AS a INNER JOIN [MS Access;Pwd=;Database=" & ThisWorkbook.Path _ & "\mydata.accdb;].员工分红 AS b ON a.员工编号 = b.员工编号"
我们看上面的代码,这部分代码中选择了字段:a.员工编号,a.姓名,a.性别,b.金额这些字段分别来自不同的数据表。其中a 的数据表是“员工信息”。 b的数据表为:
[MS Access;Pwd=;Database=" & ThisWorkbook.Path & "\mydata.accdb;].员工分红  通过连接的字段为两个数据表中员工编号要相同。
2  Range("a2").CopyFromRecordset rsADO
这行代码是复制出记录
3  ActiveSheet.Columns(rsADO.Fields.Count).NumberFormatLocal = "¥#,##0.00;¥-#,##0.00"
上述代码是把单元格设置成金额的格式。
下面我们看代码的运行:

今日内容回向:
1  什么是内连接?
2  用内连接如何连接两个数据表?


本讲内容参考程序文件:VBA与数据库操作(第二册).xlsm




我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

【分享成果,随喜正能量】专注于事,而非人际关系。内心强大。不过敏,不猜测别人心思,不委屈,不求同情和安慰。自己掌控时间,而不是被别人掌控。。


文章转载自VBA语言専攻,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论