Excel·VBA使用ADO读取工作簿工作表数据

news/2024/7/21 5:33:00 标签: excel, vba, ado, sql

目录

    • 查询遍历写入数组
    • 查询整体写入数组
    • 查询工作簿所有工作表名称
    • 查询工作簿所有工作表数据

不打开工作簿读取数据,以下举例都为《Excel·VBA合并工作簿》中 7,合并子文件夹同名工作簿中同名工作表,纵向汇总数据所举例的工作簿,使用Office 2019运行代码

查询遍历写入数组

Sub ADO查询遍历写入数组()
    '读取指定工作簿的指定工作表,工作簿可处于打开状态
    Dim cnn As Object, rs As Object, sqlstr$, i&, j&, arr, fp$, ws$, x
    fp = "E:\测试\拆分表\合并工作簿7\广州.xlsx": ws = "A级"  '工作簿路径,工作表名称
    Set cnn = CreateObject("ADODB.Connection"): Set rs = CreateObject("ADODB.Recordset")
    '打开工作簿建立连接
    'HDR=Yes,即第1行是标题,不做为数据使用,如果HDR=NO,即第1行不是标题,可做为数据使用,默认YES
    'IMEX=1即读取,0为写入,2为读写
    cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended properties='Excel 12.0 Xml;Hdr=yes;IMEX=1';data source=" & fp
    sqlstr = "SELECT * FROM [" & ws & "$]"
    rs.Open sqlstr, cnn, 1, 3  '1键集游标adOpenKeyset,3逐条记录乐观锁定adLockOptimistic
    ReDim arr(1 To rs.RecordCount, 1 To rs.Fields.Count)
'--------------------for...next写法
'    For i = 1 To rs.RecordCount  '查询到数据行数
'        For j = 1 To rs.Fields.Count  '查询到数据列数
'            arr(i, j) = rs.Fields(j - 1).Value
'        Next
'        rs.MoveNext  '下一条记录
'    Next
'--------------------for...each写法
'    For i = 1 To rs.RecordCount
'        j = 0
'        For Each x In rs.Fields
'            j = j + 1: arr(i, j) = x.Value
'        Next
'        rs.MoveNext
'    Next
'--------------------do循环+for...each写法
    Do Until rs.EOF
        i = i + 1: j = 0
        For Each x In rs.Fields
            j = j + 1: arr(i, j) = x.Value
        Next
        rs.MoveNext
    Loop
    [a1].Resize(UBound(arr), UBound(arr, 2)) = arr
    rs.Close: cnn.Close: Set rs = Nothing: Set cnn = Nothing  '关闭连接、释放对象
End Sub

读取的工作表“A级”数据(不含第1行表头)写入当前工作表
在这里插入图片描述

查询整体写入数组

Sub ADO查询整体写入数组()
    '读取指定工作簿的指定工作表,工作簿可处于打开状态,查询结果需要转置
    Dim cnn As Object, rs As Object, sqlstr$, arr, fp$, ws$
    fp = "E:\测试\拆分表\合并工作簿7\广州.xlsx": ws = "A级"
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended properties='Excel 12.0 Xml;Hdr=yes;IMEX=1';data source=" & fp
    sqlstr = "SELECT * FROM [" & ws & "$]"
'--------------------整体写入数组,转置输出
'    arr = cnn.Execute(sqlstr).Getrows  '将Recordset对象的多条记录检索到数组中
'    [a1].Resize(UBound(arr, 2) + 1, UBound(arr) + 1) = WorksheetFunction.Transpose(arr)
'--------------------不写入数组,直接输出
    Set rs = cnn.Execute(sqlstr)
    [a1].CopyFromRecordset rs  '输出查询结果
    cnn.Close: Set cnn = Nothing
End Sub

代码运行结果与之前一致

查询工作簿所有工作表名称

Sub ADO查询工作簿所有工作表名称()
    Dim cnn As Object, rs As Object, sqlstr$, fp$, s$
    fp = "E:\测试\拆分表\合并工作簿7\广州.xlsx"
    Set cnn = CreateObject("ADODB.Connection"): Set rs = CreateObject("ADODB.Recordset")
    cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended properties='Excel 12.0 Xml;Hdr=yes;IMEX=1';data source=" & fp
    Set rs = cnn.OpenSchema(20)
    Do Until rs.EOF
        If rs.Fields("TABLE_TYPE") = "TABLE" Then
            s = Replace(rs("TABLE_NAME").Value, "'", "")  '表名以数字开头时有多余的单引号,如“1月”
            If Right(s, 1) = "$" Then s = Left(s, Len(s) - 1): Debug.Print s  '排除无效表名及结尾的$
        End If
        rs.MoveNext
    Loop
    rs.Close: cnn.Close: Set rs = Nothing: Set cnn = Nothing
End Sub

查询工作簿所有工作表数据

Sub ADO查询工作簿所有工作表数据()
    Dim cnn As Object, rs As Object, sqlstr$, fp$, ws, wss, s$, ss$, delimiter$, r&
    fp = "E:\测试\拆分表\合并工作簿7\广州.xlsx": delimiter = Chr(28): tm = Timer
    Set cnn = CreateObject("ADODB.Connection"): Set rs = CreateObject("ADODB.Recordset")
    cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended properties='Excel 12.0 Xml;Hdr=no;IMEX=1';data source=" & fp
    Set rs = cnn.OpenSchema(20)
    Do Until rs.EOF  '获取所有工作表名称
        If rs.Fields("TABLE_TYPE") = "TABLE" Then
            s = Replace(rs("TABLE_NAME").Value, "'", "")
            If Right(s, 1) = "$" Then s = Left(s, Len(s) - 1): ss = ss & delimiter & s
        End If
        rs.MoveNext
    Loop
    r = 1: wss = Split(Mid(ss, 2), delimiter)  '工作表名称数组
    For Each ws In wss  '遍历工作表获取数据,并写入
        sqlstr = "SELECT * FROM [" & ws & "$]"
        Set rs = cnn.Execute(sqlstr)
        Cells(r, "a").CopyFromRecordset rs  '输出查询结果
        r = Cells(1, "a").CurrentRegion.Rows.Count + 1  '下次写入行号
    Next
    rs.Close: cnn.Close: Set rs = Nothing: Set cnn = Nothing
    Debug.Print "获取写入完成,用时:" & Format(Timer - tm, "0.00")
End Sub

Hdr=no,即获取第1行表头数据,写入当前工作表
在这里插入图片描述


http://www.niftyadmin.cn/n/5071023.html

相关文章

无重复字符的最长子串[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: …

Spring总结的question

Spring 一. 控制反转(IoC) 1.手动 使用了Spring的Configuration和Bean注解来明确指定了哪些类需要被纳入容器的管理。在AppConfig配置类中,通过Bean注解创建了Service和Controller的实例,Spring会自动将这些实例纳入容器的管理,并处理它们…

助力电力行业数字化转型:智慧风电项目介绍

智慧电力作为电力领域的突破性进展,旨在实现能源领域的数字化转型。智慧电力借助数字孪生、IOT、云计算等技术,将传统的电力系统升级为高智能、高效能的系统,助力传统能源企业实现数字化转型。下面让我们来看一看山海鲸可视化提供的智慧电力相…

跨平台应用开发比较,QT还是Electron

开发技术比较 在技术选择中,我们选中了两个技术路线,一个是基于C的QT,一个是基于nodejs的electron,我们仔细比价了两个产品的优缺点。 electronQT开发简单,上手快速上手慢,但是性能高适用于一些单一功能的…

三分钟阿里云服务器全方位介绍(看一篇就够了)

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云百科aliyunbai…

ACE综述

1、ACE综述 ACE自适配通信环境(ADAPTIVE Communication Environment)是可自由使用、开放源码的面向对象(OO)框架(framework),它实现了许多用于并发通信软件的核心模式。ACE提供了一组丰…

字段位置顺序对值的影响

Unity中验证AB加载场景时报错: Cannot load scene: Invalid scene name (empty string) and invalid build index -1 报错原因是因为把字段放在了Start函数后面(图一)改成(图二)就好了。图一中协程使用的sceneBName字段值为null。 图一: 图二&#xff1a…

【重磅】这就是元宇宙碰撞的后果

筹备了一年多——朋友们,它终于来了! 我们刚刚宣布官方 Aavegotchi x Sandbox 在 X 上共享元宇宙体验。 10 月 25 日在 The Sandbox 上线,有两份可领取的空投。 Gotchi 游戏即将爆发。你们兴奋吗?