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

news2024/11/24 21:43:43

目录

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

不打开工作簿读取数据,以下举例都为《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.coloradmin.cn/o/1069673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国庆作业day10.4

QT实现TCP服务器客户端搭建的代码,现象 服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器servernew QTcpServer(this);c…

探秘小米增程汽车与仿生机器人的未来:AI大模型的潜在影响及苹果iPhone15Pro发热问题解决之道

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

智能井盖传感器:城市安全卫士

随着城市人口的不断增加和城市基础设施的不断发展,井盖作为城市道路和排水系统的重要组成部分,承担着确保城市安全和便利性的关键角色。然而,井盖在日常使用中常常面临倾斜、水浸和翻转等问题,这些问题可能导致交通阻塞、行人坠井…

漏洞挖掘--edusrc两连杀

免责声明:文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为! 最近闲来无事,研究了下通达的day,由于本人太菜了&#xff…

软考网络工程师考前如何复习?

先看一下这知识点总结图,在备考复习前大致简单了解一遍! 第一步: 通读教程(《网络工程师》),首先对教程中的各章节及知识点有一个基本的认识,第一阶段基本以泛读为主,不求立刻记得所…

Maven 配置阿里云镜像

1. 查找maven setting.xml配置文件 find / -name "setting.xml" 2. 添加阿里云镜像 修改maven根目录下的conf文件夹中的setting.xml文件中的mirrors下添加mirror标签 <settings> <localRepository>E:\Maven\repository</localRepository> <…

LLMs Python解释器程序辅助语言模型(PAL)Program-aided language models (PAL)

正如您在本课程早期看到的&#xff0c;LLM执行算术和其他数学运算的能力是有限的。虽然您可以尝试使用链式思维提示来克服这一问题&#xff0c;但它只能帮助您走得更远。即使模型正确地通过了问题的推理&#xff0c;对于较大的数字或复杂的运算&#xff0c;它仍可能在个别数学操…

【Kotlin精简】第2章 集合

1 简介 在 Kotlin 中集合主要分为可变集合与只读集合&#xff0c;其中可变集合使用 “Mutable” 前缀 集合类名表示&#xff0c;比如 MutableList、MutableSet、MutableMap 等。而对于只读集合就是和 Java 中集合类名是一致。 Java 中的 List 非 Kotlin 中的 List , 因为 Kot…

深度学习——权重衰减(weight_decay)

深度学习——权重衰减&#xff08;weight_decay) 文章目录 前言一、权重衰减1.1. 范数与权重衰减1.2. 高维线性回归1.3. 从零开始实现1.3.1.初始化模型参数1.3.2. 定义L₂范数惩罚1.3.3. 定义训练代码实现1.3.4. 不管正则化直接训练1.3.5. 使用权重衰减 1.4. 简洁实现 总结 前言…

寒露到了,冬天还会远吗?

寒露惊秋晚&#xff0c;朝看菊渐黄。 日复一日间&#xff0c;光影如梭&#xff0c;我们便很快将告别了秋高气爽&#xff0c;白日将变得幽晦&#xff0c; 天寒夜长&#xff0c;风气萧索&#xff0c;雾结烟愁。 还没好好体会秋高气爽,寒露就到了。 今天晚上9点多&#xff0c;我们…

成都直播产业未来发展新方向一览,又一大型直播基地入驻成都!

成都直播产业正迎来一股蓬勃发展的新浪潮&#xff0c;展现出无限的潜力和前景。最新消息显示&#xff0c;又一座大型直播基地——成都天府蜂巢直播产业基地即将入驻成都&#xff0c;为这座城市的直播产业注入了新的动力和活力。 天府蜂巢 行业模范 成都天府蜂巢直播产业基地采…

LLMs 入门实战系列

link 【LLMs 入门实战系列】 【LLMs 入门实战系列】交流群 (注&#xff1a;人满 可 添加 小编wx&#xff1a;yzyykm666 加群&#xff01;) 【LLMs 入门实战系列】 第一层 LLMs to Natural Language Processing (NLP) 第一重 ChatGLM-6B 系列 ChatGLM-6BChatGLM2-6B 第十一重 L…

WebSocket ----苍穹外卖day8

介绍 实现步骤 各个模块详解 OnOpen OnOpen:标记一个方法作为处理WebSocket连接打开的方法 当一个客户端与服务器建立 WebSocket 连接时&#xff0c;服务器会接收到一个连接请求。一旦服务器接受了这个连接请求&#xff0c;一个 WebSocket 连接就会被建立。这时&#xff0c;被…

Eclipse iceoryx™ - 真正的零拷贝进程间通信

1 序言 通过一个快速的背景教程&#xff0c;介绍项目范围和安装所需的所有内容以及第一个运行示例。 首先&#xff1a;什么是冰羚&#xff1f; iceoryx是一个用于各种操作系统的进程间通信&#xff08;IPC&#xff09;中间件&#xff08;目前我们支持Linux、macOS、QNX、FreeBS…

一文搞懂频率响应中的相位响应与信号在时域变化的关系

我们知道一个信号通过一个系统后&#xff0c;输出信号的频谱输入信号的频谱*传递函数的频谱 那么衡量输出信号与输入信号的关系通常是考虑他们的幅度和相位。即&#xff1a;传递函数的相位相应和幅度响应。幅度响应好理解&#xff0c;即输出信号相比于输入信号幅值放大多少倍。…

时空智友企业流程化管控系统 sessionid泄露漏洞 复现

文章目录 时空智友企业流程化管控系统 sessionid泄露漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 时空智友企业流程化管控系统 sessionid泄露漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从…

Django开发之初识篇

Django初识篇 前言一、Django 框架介绍二、Django 项目初始化方式一&#xff1a;Windows通过CMD创建并初始化项目方式二&#xff1a;Pycharm 总结 前言 通过Django初识篇、基本篇、进阶篇来学习Django&#xff0c;并能快速开发一个中型的Web网站。 一、Django 框架介绍 Djan…

【IEEE会议征稿】第三届IEEE电气工程与控制科学国际学术会议(IC2ECS 2023)

第三届IEEE电气工程与控制科学国际学术会议&#xff08;IC2ECS 2023&#xff09; 2023 3rd International Conference on Electrical Engineering and Control Science 第三届电气工程与控制科学国际学术会议 (IC2ECS 2023) 定于2023年12月1日在中国杭州召开。会议主要围绕“…

【RHAL】板子烧widevine key

前言&#xff1a;国庆回来工作后很懵逼…又遇见了新问题&#xff0c;因为旧板子烧坏了&#xff0c;新板子系统没带widevine key&#xff0c;我用旧板子命令烧pass&#xff0c;新板子apk烧就fail。 又接触到了新的领域&#xff0c;新名词。不错的&#xff0c;甲方乙方一起带我学…

Flink---13、容错机制(检查点(保存、恢复、算法、配置)、状态一致性、端到端精确一次)

星光下的赶路人star的个人主页 大鹏一日同风起&#xff0c;扶摇直上九万里 文章目录 1、容错机制1.1 检查点&#xff08;CheckPoint&#xff09;1.1.1 检查点的保存1.1.2 从检查点恢复状态1.1.3 检查点算法1.1.3.1 检查点分界线&#xff08;barrier&#xff09;1.1.3.2 分布式快…