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

目录

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

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

查询遍历写入数组

Sub ADO查询遍历写入数组()'读取指定工作簿的指定工作表,工作簿可处于打开状态Dim cnn As Object, rs As Object, sqlstr$, i&, j&, arr, fp$, ws$, xfp = "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=" & fpsqlstr = "SELECT * FROM [" & ws & "$]"rs.Open sqlstr, cnn, 1, 3  '1键集游标adOpenKeyset,3逐条记录乐观锁定adLockOptimisticReDim 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.EOFi = i + 1: j = 0For Each x In rs.Fieldsj = j + 1: arr(i, j) = x.ValueNextrs.MoveNextLoop[a1].Resize(UBound(arr), UBound(arr, 2)) = arrrs.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=" & fpsqlstr = "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=" & fpSet rs = cnn.OpenSchema(20)Do Until rs.EOFIf rs.Fields("TABLE_TYPE") = "TABLE" Thens = Replace(rs("TABLE_NAME").Value, "'", "")  '表名以数字开头时有多余的单引号,如“1月”If Right(s, 1) = "$" Then s = Left(s, Len(s) - 1): Debug.Print s  '排除无效表名及结尾的$End Ifrs.MoveNextLooprs.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 = TimerSet 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=" & fpSet rs = cnn.OpenSchema(20)Do Until rs.EOF  '获取所有工作表名称If rs.Fields("TABLE_TYPE") = "TABLE" Thens = Replace(rs("TABLE_NAME").Value, "'", "")If Right(s, 1) = "$" Then s = Left(s, Len(s) - 1): ss = ss & delimiter & sEnd Ifrs.MoveNextLoopr = 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  '下次写入行号Nextrs.Close: cnn.Close: Set rs = Nothing: Set cnn = NothingDebug.Print "获取写入完成,用时:" & Format(Timer - tm, "0.00")
End Sub

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/127830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java 进阶篇】HTML介绍与软件架构相关知识详解

HTML(Hypertext Markup Language)是一种用于创建网页的标记语言。它是互联网上信息传递和展示的基础,无论是在浏览器中查看网页还是在移动设备上浏览应用程序,HTML都扮演着关键角色。本文将向您介绍HTML的基础知识,并探…

钡铼BL124EC实现EtherCAT转Ethernet/IP的优势

钡铼技术的BL124EC是一款用于将EtherCAT从站转换为Ethernet/IP从站的网关设备。它是钡铼技术开发的高性能、可靠的工业自动化通信解决方案之一。 添加图片注释,不超过 140 字(可选) BL124EC网关可以应用于多种工业自动化场景,以下…

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller 我们提供三种不同类别的EDGEBoost I/O模块供选择,以实现最大程度的I/O定制: 数字和模拟输入/输出网络和连接边缘人工智能和存储 利用EDGEBoost I/O实现变革性技术 EBIO-2M2BK EBIO-2M2BK载板支持…

深度学习笔记之线性代数

深度学习笔记之线性代数 一、向量 在数学表示法中,向量通常记为粗体小写的符号(例如,x,y,z)当向量表示数据集中的样本时,它们的值具有一定的现实意义。例如研究医院患者可能面临的心脏病发作风…

常用排序算法详解

1.冒泡排序原理示例代码实现 2.快速排序原理示例代码实现 3.插入排序原理示例代码实现 4.希尔排序原理示例代码实现 5.选择排序原理示例代码实现 6.堆排序原理示例代码实现 7.归并排序原理示例代码实现 本文讲述了常见的排序算法的执行过程,有详细实现过程举例 1.冒…

21.6 CSS 弹性布局

1. 弹性盒子 CSS弹性盒子(Flexbox)是一种布局模型, 用于创建灵活的, 自适应的网页布局. 它的目的是在不同屏幕尺寸和设备上实现一致的布局效果.引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列, 对齐和分配空白空间.弹性容器通过设置display…

左值、右值、左值引用和右值引用

左值、右值和左值引用,在C11之前,我们都很熟悉也都很好理解。左值(LValue)就是有名字能够寻址的对象的值类型,右值就是在内存上没有名字的数值的值类型,左值引用就是指向左值的引用。 C11引入了右值引用,从而可以去读…

STM32 CubeMX ADC采集(HAL库)

STM32 CubeMX ADC采集(HAL库) STM32 CubeMX STM32 CubeMX ADC采集(HAL库)ADC介绍ADC主要特征最小识别电压值:2.4/4096≈0.6mv(不考虑误差)一、STM32 CubeMX设置二、代码部分三,单通道…

泛微OA e-office平台uploadify.php任意文件上传漏洞

泛微OA e-office平台uploadify.php任意文件上传漏洞复现 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的…

玩转Linux—如何在Linux环境中部署MySQL、Redis和nginx

1、Linux常用命令 Linux学习之路: VMware虚拟机安装Linux系统(详解版) 查看当前文件目录:ls查看目录中文件详细信息:ll输出当前所处的目文件目录:pwdLinux查看当前IP地址:ifconfigWindows查看当前IP地址&#xff1…

基于SpringBoot的民宿在线预定平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 民宿信息管理 民宿资讯管理 民宿分类管理 用户注册 民宿信息 我的订单 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实…

通过IP地址管理提升企业网络安全防御

在今天的数字时代,企业面临着越来越多的网络安全威胁。这些威胁可能来自各种来源,包括恶意软件、网络攻击和数据泄露。为了提高网络安全防御,企业需要采取一系列措施,其中IP地址管理是一个重要的方面 1. IP地址的基础知识 首先&a…