ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] JSA实现多工作簿多工作表数据查询SQL(附件带JSA链接MySQL)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-3-30 11:04 | 显示全部楼层 |阅读模式
本帖最后由 imnnoii 于 2022-3-30 11:05 编辑
这篇帖子是JSA如何多工作簿多工作表查询
思路来源VBA。不要和VBA比较了,我认输。
搬砖仔还在学习JS中~~~~~希望JS大佬多多指正问题。

image.png
如图:如果需要在这么多工作簿中找一个叫张三的档案~~~~
依次打开查询明显不符合我我摸鱼的风格。

如果你需要在很多规范的表中查找一个数据,且你是WPS用户,那么这篇文章可能对你有用。
为了方便演示,采用了站内的资源。并且参考了其中的VBA代码。这个多工作簿多表查询算是我学VBA的入门帖子了,给大家推荐下。
VBA原帖入口[Excel 程序开发] 【83期】VBA多工作簿多工作表数据查询[已小结]

采用了ODBC(所以需要驱动,特别是MySQL需要自行安装)。过程也不是很优雅,只能算能用。

关于如何连接,代码写的比较清楚了。如果你自己使用建立DSN也是可以的
       SQL 语句---代码SQL数组部分和最后组成的sqlstr
关于代码的一些基本说明:
代码运行后选择文件夹(当然也可以改成多选文件),其中所有xls表格都将作为数据源。
image.png
的,如图,目前对源数据的要求比较高。
源数据的表格,格式需要保持高度一致。
下载附件: JSA连接数据库-WPSPUB.zip (453.76 KB, 下载次数: 227)

用WPS 打开,宏编辑器可直接查看源码
你可能能在代码中学习到以下基本方法你也可以写的更优雅
代码中的基本方法:
Application.FileDialog ----打开文件选择
Application.FileSearch ----遍历文件(真的好用,dir方法可能需要try 抛出错误
Sheets.QueryTables   ----链接数据源


速度方面差了一点
42(){GDPOAF9~FMZTSBBNH1.png


评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-3-30 17:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
JSA for WPS这个版块知道的人太少了。为你的努力点赞。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-3-30 19:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-3-30 20:49 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-3-31 17:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. function Main() {
  2. //选择文件夹方式查询
  3. //将查询选择的文件夹下面的所有xls表格
  4. //对数据源格式要求
  5. //访问WPS.PUB查看代码详解
  6.         Application.ScreenUpdating = true;
  7.         Application.ScreenUpdating = false;
  8.         const Driver = "{Microsoft Excel Driver (*.xls)}"        //ODBC驱动,所以如果你没有驱动,该程序运行将失败
  9.         let mypath = Application.FileDialog(msoFileDialogFolderPicker);
  10.         let files
  11.         let T = 0;
  12.         let QTnum1 = ThisWorkbook.Connections.Count
  13.         mypath.Filters.Clear();
  14.         mypath.Filters.Add("All files", "*.*");
  15.         if(mypath.Show() == -1) {
  16.                 mypath = mypath.SelectedItems.Item(1);
  17.                 mypath = mypath.replace("\","\\\");
  18.                 (obj=>{
  19.                         obj.LookIn = mypath;
  20.                         obj.SearchSubFolders = false;
  21.                         obj.FileName = "*.xls";
  22.                         obj.LastModified=msoLastModifiedAnyTime
  23.                         obj.Execute(msoSortByFileName,msoSortOrderAscending);
  24.                         files = obj.FoundFiles;
  25.                 })(Application.FileSearch)
  26.                 let r = Range("A65536").End(xlUp).Offset(1).Row;
  27.                 Rows("2:"+r).Delete()
  28.                 //计时开始
  29.                 let ST =new Date().getTime();
  30.                 //暂定每个表格中都用同一个格式(1部门,2部门,三部门
  31.                 let TableDB = Array("1部门","2部门","3部门");
  32.                 //后续需要更改
  33.                 let querystr = ThisWorkbook.Sheets(1).Range("B1").Value2
  34.                 let connstring="";                //连接字符
  35.                 let SQL = [];                        //存储SQL语句
  36.                 let WBDBS = ""                        //跨表字符串"[EXCEL 8.0;DataBase=xxxx.xls;]."
  37.                 let N = 1;                                //计数。1-49(总49)
  38.                 let QTadd = ""                        //查询
  39.                 for(let i=1;i<files.Count+1;i++){
  40.                         let filePath = files(i).replace(/\\/g,"\\\");
  41.                         let filenames = files(i).split("\");
  42.                         let filename = filenames[filenames.length-1].split(".")[0]
  43.                         //粗糙的做法。不能识别xxx.xxx.xls
  44.                         if(N==1){
  45.                                 connstring = "ODBC;Driver="+Driver+";DBQ="+filePath+";ReadOnly=0;FIL=excel 8.0;";
  46.                         }
  47.                         for(let v of TableDB){
  48.                                 WBDBS = N<=TableDB.length?"":"[EXCEL 8.0;DataBase="+filePath+";]."
  49.                                 SQL[N-1] = "SELECT [姓名],[客户号],[档案编号],'"+v+"' as [部门],'"+filename+"' as [文件名] FROM "+WBDBS+"["+v+"$A3:F100] WHERE [姓名]='"+querystr+"'"       
  50.                                 N++;
  51.                         }
  52.                         if(N%49==0){
  53.                                 //执行查询,重置计数器
  54.                                 sqlstr = SQL.join(" UNION ALL ");
  55.                                 r = Range("A65536").End(xlUp).Offset(1).Row;
  56.                                 QTadd = ThisWorkbook.Sheets.Item(1).QueryTables.Add(connstring,Range("A65536").End(xlUp).Offset(1),sqlstr);
  57.                                 QTadd.Refresh();
  58.                                 //ThisWorkbook.Connections.Item(QTnum+1).Delete()
  59.                                 if(r>2){Rows(r).Delete()}
  60.                                 N=1;
  61.                                 SQL = [];
  62.                                 sqlstr = "";
  63.                                 WBDBS="";
  64.                                 QTadd = "";
  65.                         }
  66.                 }//遍历所有文件
  67.                 if(SQL.length>0){
  68.                 //执行查询
  69.                         sqlstr = SQL.join(" UNION ALL ");
  70.                         r = Range("A65536").End(xlUp).Offset(1).Row;
  71.                         QTadd = ThisWorkbook.Sheets.Item(1).QueryTables.Add(connstring,Range("A65536").End(xlUp).Offset(1),sqlstr);
  72.                         QTadd.Refresh();
  73.                         //ThisWorkbook.Connections.Item(QTnum+1).Delete()
  74.                         //已知问题。会导致保存失败WPS崩溃
  75.                         if(r>2){Rows(r).Delete()}
  76.                         N=1;
  77.                         SQL = [];
  78.                         sqlstr = "";
  79.                         WBDBS="";
  80.                         QTadd = "";
  81.                        
  82.                 }
  83.                 T = new Date().getTime()-ST;
  84.         }
  85.         MsgBox("查询完毕!\n用时:"+T+"ms",jsOKOnly,"JSA多表联查-WPSPUB")
  86.         Application.ScreenUpdating = true;
  87.         let QTnum2 = ThisWorkbook.Connections.Count
  88.         //该循环避免了下次打开时提示外部数据方法。但在Excel中打开依然存在无效
  89.         //该循环是已知问题的修复办法
  90.         for(let i=QTnum2;i>QTnum1;i--){
  91.                 ThisWorkbook.Connections.Item(i).Delete()
  92.         }
  93. }
  94.        
复制代码




方便手机用户观看代码

TA的精华主题

TA的得分主题

发表于 2022-7-27 23:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-7-28 08:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-8-8 14:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个好,MYSQL数据库都解决了。

TA的精华主题

TA的得分主题

发表于 2022-10-6 20:37 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-11-8 19:17 | 显示全部楼层
感谢分享!想知道MariaDB的连接方法
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 16:07 , Processed in 0.043044 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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