ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何将VBA的增删改查转换成WPS JS宏

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-8-31 17:24 | 显示全部楼层 |阅读模式
如题:将VBA的增删改查代码转换成WPS JS宏,文件里四个表两个一组,写了VBA代码(可以使用),代码论坛里找的。
WPS JS宏搞不出来,大佬可以帮忙搞一下吗?实现VBA代码的功能。

学习一下WPS JSA,网上没有找到实例。

无标题zcgc.jpg
工作簿1增删改查.rar (61.35 KB, 下载次数: 14)

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-2 08:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
继续研究,论坛和百度来的代码拼凑而成
查询部分基本可用,偶尔会出错,表现为删除查询界面所有行内容,找不出原因
走过路过的大佬,大神帮优化一下嘛
(按钮是插入的形状添加文字,再指定宏。宏按钮太丑了,没有用。)

无标题zcgc1.jpg
工作簿1 WPS_JS增删改查2.rar (13.65 KB, 下载次数: 10)


左边查询按钮代码
  1. function 查询1_Click(){
  2.         //工作台=员工考核信息新增修改查询删除2    信息库=员工考核信息表2  参考实例对应工作表
  3.         var gztSt,xxkSt,findkey,intRow,cxMaxRow,bcMaxRow,xxkMaxRow;
  4.         //gztSt 查询工作台,xxkSt 数据信息库,findkey 查询关键字
  5.         //intRowNo 表头标题行, cxMaxRow 查询前工作台最后行,bcMaxRow 查询后工作台最后行;xxkMaxRow 信息库最后行
  6.         gztSt=Sheets.Item("工作台");                        xxkSt=Sheets.Item("信息库");
  7.         findkey=gztSt.Range("B2").Value2;        intRow=5;
  8.         xxkMaxRow=xxkSt.Cells(Rows.Count,"A").End(xlUp).Row;        //查询前查看信息库A列最后行
  9. //        Console.log(xxkMaxRow);                                                                //立即窗口输出xxkRowNo值
  10. //        cxMaxRow=gztSt.Cells(Rows.Count,"A").End(xlUp).Row;        //查看工作台A列最后行
  11. //        Console.log(cxMaxRow);
  12.         Range("A6:D10000").ClearContents();                                //清空工作台数据显示区A6-D10000列

  13.        
  14.         for (let rngCell of xxkSt.Range("A3:D"+xxkMaxRow)){
  15.                 if (rngCell.Value()===findkey){
  16.                         intRow++;
  17.                         rngCell.Offset(0,0).Resize(1,4).Copy(gztSt.Range("A"+intRow));
  18. //                        rngCell.Offset(0,0).Resize(1,4).Copy(gztSt.Range(`A${intRow}`));
  19.                 }else{
  20. //                        MsgBox("没有找到,工号填了没有");
  21.                 }
  22.         }

  23. //        bcMaxRow=gztSt.Cells(Rows.Count,"A").End(xlUp).Row;        //        查询完毕查看A列最后行
  24. //        Console.log(bcMaxRow);
  25. }
复制代码


右边查询按钮代码
  1. function 筛选示例1(){
  2.         var gztSt,xxkSt,findkey,intRow,cxMaxRow,bcMaxRow,xxkMaxRow,mbRow;
  3.         //gztSt 查询工作台,xxkSt 数据信息库,findkey 查询关键字,  mbRow 信息库找到的目标行
  4.         //intRowNo 表头标题行, cxMaxRow 查询前工作台最后行,bcMaxRow 查询后工作台最后行;xxkMaxRow 信息库最后行
  5.         gztSt=Sheets.Item("工作台");                        xxkSt=Sheets.Item("信息库");
  6.         findkey=gztSt.Range("H2").Value2;        //intRow=5;
  7.         xxkMaxRow=xxkSt.Cells(Rows.Count,"A").End(xlUp).Row;        //查询前查看信息库A列最后行
  8. //        Console.log(xxkMaxRow);                                                                //立即窗口输出xxkRowNo值
  9.         Range("G6:J1000").ClearContents();                                //清空工作台数据显示区A6-D列

  10.         var arr=xxkSt.Range("A3:D"+xxkMaxRow).Value();
  11.           var brr=arr.filter((v,i)=>v[0]== findkey)
  12. //  var crr=brr.map(v=>([v[0],v[1],v[2],v[3])        //map不懂
  13. //  crr.sort((a,b)=>b[4]-a[4])                                        //排序不懂
  14.         gztSt.Range("G6").Resize(brr.length,4).Value2=brr        //从G6输出筛选结果
  15. }
复制代码



TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-2 22:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 fsdbbs 于 2023-9-4 19:34 编辑

无标题zcgc3.jpg
右边按钮代码完工(左边侧舍弃,可能有更好的,我搜索不动了。)
都拼凑的,代码感觉有点乱,走过路过的大佬,大神帮优化一下嘛,先谢谢了
代码都论坛+百度来的,喜欢的随便拿走,能帮优化一下更好。

形状按钮换回宏按钮
  1. //WPS JSA 增删改查

  2. //查询
  3. function CommandButton2_Click(){
  4.         var gztSt,xxkSt,cxKey,intRow,dateRow,cxMaxRow,bcMaxRow,xxkMaxRow,mbRow;                //声明常用变量
  5.         /*        gztSt 查询工作台,xxkSt 数据信息库,cxKey 查询关键字   mbRow 信息库查询标行  intRow 表头标题行, dateRow 保存数据起始行  
  6.         cxMaxRow 查询前工作台最后行 bcMaxRow 查询后工作台最后行  xxkMaxRow 信息库最后行*/
  7.         gztSt=Sheets.Item("工作台");                xxkSt=Sheets.Item("信息库");
  8.         cxKey=gztSt.Range("H2").Value2;        //intRow=5;        dateRow=6;
  9.         xxkMaxRow=xxkSt.Cells(Rows.Count,"A").End(xlUp).Row;        //查看信息库A列最后行        UsedRange.Rows.Count
  10.         bcMaxRow=gztSt.Cells(Rows.Count,"G").End(xlUp).Row;                //查看查询台A列最后行
  11.         
  12.         if(bcMaxRow>5){
  13.                 gztSt.Range("G6:J"+bcMaxRow).ClearContents();                        //清空查询台数据显示区
  14.         }

  15.         let f=xxkSt.Range("A3:A"+xxkMaxRow).Find(cxKey);
  16.         if(f==undefined){
  17.                 if(cxKey==null){
  18.                         MsgBox("工号还没填,查空气甜不甜?")
  19.                 }else{
  20.                         MsgBox("工号:"+cxKey+" 没有找到!");
  21.                 }
  22.         }else{
  23.                 var arr=xxkSt.Range("A3:D"+xxkMaxRow).Value();
  24.                   var brr=arr.filter((v,i)=>v[0]== cxKey)
  25.                  gztSt.Range("G6").Resize(brr.length,4).Value2=brr        //从G6输出筛选结果
  26.         }
  27. }

  28. //保存
  29. function CommandButton3_Click(){
  30.         var gztSt,xxkSt,cxKey,intRow,dateRow,cxMaxRow,bcMaxRow,xxkMaxRow,mbRow;                //声明常用变量
  31.         gztSt=Sheets.Item("工作台");                        xxkSt=Sheets.Item("信息库");
  32.         cxKey=gztSt.Range("H2").Value2;                intRow=5;        dateRow=6;

  33.         bcMaxRow=gztSt.Cells(Rows.Count,"G").End(xlUp).Row;                //查看查询台A列最后行
  34.         xxkMaxRow=xxkSt.Cells(Rows.Count,"A").End(xlUp).Row;        //查看信息库A列最后行
  35.         
  36.         if(gztSt.Range("G6").Value2==null){
  37.                 MsgBox("没有数据可保存");
  38.         }else{
  39.                 let ln=bcMaxRow-dateRow;
  40.                 for(let i=0; i<=ln; i++){
  41.                         let n=i+dateRow;
  42.                         let gzt1=gztSt.Range("G"+n)
  43.                         let f=xxkSt.Range("A3:A"+xxkMaxRow).Find(gzt1);
  44.                         let ii=i+dateRow;
  45.                         var msg;
  46.                         if(f==undefined){
  47.                                 let k=xxkMaxRow+1+i;
  48.                                 xxkSt.Cells(k,1).Value2=gztSt.Cells(ii,7).Value2;
  49.                                 xxkSt.Cells(k,2).Value2=gztSt.Cells(ii,8).Value2;
  50.                                 xxkSt.Cells(k,3).Value2=gztSt.Cells(ii,9).Value2;
  51.                                 xxkSt.Cells(k,4).Value2=gztSt.Cells(ii,10).Value2;
  52.                                 let ghNo=gzt1.Value2
  53.                                 msg="工号:"+ghNo+" 已新增!"
  54.                         }else{
  55.                                 let j=f.Row;
  56.                                 let jj=j+i;
  57.                                 xxkSt.Cells(jj,1).Value2=gztSt.Cells(ii,7).Value2;
  58.                                 xxkSt.Cells(jj,2).Value2=gztSt.Cells(ii,8).Value2;
  59.                                 xxkSt.Cells(jj,3).Value2=gztSt.Cells(ii,9).Value2;
  60.                                 xxkSt.Cells(jj,4).Value2=gztSt.Cells(ii,10).Value2;
  61.                                 let ghNo=gzt1.Value2
  62.                                 msg="工号:"+ghNo+" 已更新!"
  63.                         }
  64.                         MsgBox(msg);
  65.                 }
  66.         }
  67.         
  68.         if(bcMaxRow>5){
  69.                 gztSt.Range("G6:J"+bcMaxRow).ClearContents();                        //清空查询台数据显示区
  70.         }
  71. }

  72. //删除
  73. function CommandButton4_Click(){
  74.         var gztSt,xxkSt,cxKey,intRow,dateRow,cxMaxRow,bcMaxRow,xxkMaxRow,mbRow;                //声明常用变量
  75.         gztSt=Sheets.Item("工作台");                        xxkSt=Sheets.Item("信息库");
  76.         intRow=5;        dateRow=6;                                //cxKey=gztSt.Range("H2").Value2;               

  77.         bcMaxRow=gztSt.Cells(Rows.Count,"G").End(xlUp).Row;                //查看工作台A列最后行
  78.         xxkMaxRow=xxkSt.Cells(Rows.Count,"A").End(xlUp).Row;                //查看信息库A列最后行
  79. //        Console.log(xxkMaxRow);                                                                        //立即窗口输出xxkMaxRow值
  80.         
  81.         if(gztSt.Range("G6").Value2==null){
  82.                 MsgBox("没有数据可删除");
  83.         }else{
  84.                 var ln=bcMaxRow-dateRow;
  85.                 for(let i=0; i<=ln; i++){
  86.                         let n=i+dateRow;
  87.                         let ghNo=gztSt.Range("G"+n).Value2
  88.                         let f=xxkSt.Range("A3:A"+xxkMaxRow).Find(ghNo);
  89.                         if (f==undefined){
  90.                                 var msg="工号:"+ghNo+" 没有找到!"
  91.                         }else{
  92.                                 let j=f.Row;
  93.                                 xxkSt.Range("A"+j).EntireRow.Delete();
  94.                                 var msg="工号:"+ghNo+" 已删除!"
  95.                         }
  96.                         MsgBox(msg);
  97.                 }
  98.                 if(bcMaxRow>5){
  99.                         gztSt.Range("G6:J"+bcMaxRow).ClearContents();                        //清空查询台数据显示区
  100.                 }
  101.         }
  102. }

  103. //清除
  104. function CommandButton5_Click()
  105. {
  106.         let sht=Sheets.Item("工作台");UsedRange.Rows.Count
  107.         let i=sht.Cells(Rows.Count,"G").End(xlUp).Row;                //查看查询显示区A列最后行
  108.         if(i>5){
  109.                 sht.Range("G6:J"+i).ClearContents();                        //清空查询数据显示区
  110.         }
  111. }
复制代码



补充内容 (2023-9-5 09:39):
代码113 行 “UsedRange.Rows.Count” 是不需要的,不知道咋跑出来的

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-6 10:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
3楼代码,保存1号的时候,行号f.Row成11了,信息库中在A3啊,应该是3,为啥变成11了,来个大佬,帮看一下

TA的精华主题

TA的得分主题

发表于 2023-9-9 00:19 | 显示全部楼层
处理数据一般用数组或者对象,很少直接操作单元格
QQ截图20230909000137.png
QQ截图20230908235001.png

增删改查.zip

42.45 KB, 下载次数: 21

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-12 18:43 | 显示全部楼层
仙女配凡人 发表于 2023-9-9 00:19
处理数据一般用数组或者对象,很少直接操作单元格

哇,看起就漂亮!
试了一下,身份证号不能录,表格改成文本只对查询有效,保存后身份证后面全是0000
=> 这种语句也看不懂,伤心,其实基本都看不懂,哎;
  1.     let index = opt ? 0 : 6
  2.     let arr = job.find(val => val[index] == txt)
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-12 19:59 | 显示全部楼层
本帖最后由 fsdbbs 于 2023-9-13 12:50 编辑

求注释各行代码

  1. //查询
  2. function submit() {
  3.     let { opt, txt, rng, job } = getInfo()
  4.     if (!/^[\S]{6,18}$/.test(txt)) return alert('只能输入6-18位数字, 不得含有其他字符');
  5.     reset()

  6.     let index = opt ? 0 : 6       
  7.     let arr = job.find(val => val[index] == txt)       
  8.     if (arr) {
  9.         rng.unshift('C6')
  10.         rng.forEach((v, i) => Range(v).Value2 = arr[i])

  11.     } else { alert('未找到:' + txt) }
  12. }
  13. //重置
  14. function reset() { Range('C6:I6,C8:I8,C10:I10,C12:I12').Value2 = '' }

  15. //新增
  16. function addItems() {
  17.     let { inp, job, sh } = getInfo()
  18.     let len = job.length
  19.     console.log(len);
  20.     let end = job[len - 1][0].toString()
  21.     console.log(end);
  22.     let yy = end.substr(0, 4)
  23.     console.log(yy);
  24.     let num = Number(end.substr(4)) + 1
  25.     console.log(num);
  26.     num = num < 10 ? '00' + num : num < 100 ? '0' + num : num

  27.     let year = new Date().getFullYear().toString()
  28.     let id = yy == year ? yy + num : year + '001'
  29.     if (MsgBox('确定新增职工编号:' + id, jsYesNo) != 6) return;

  30.     Range('C6').Value2 = id
  31.     inp.unshift(id)
  32.     sh.Range(`A${len + 1}:L${len + 1}`).Value2 = inp
  33. }
  34. //删除
  35. function deleteDate() {
  36.     let { id, job, sh } = getInfo()
  37.     if (MsgBox('确定删除职工编号:' + id, jsYesNo) != 6) return;

  38.     let delRow
  39.     job.find((v, i) => { if (v[0] == id) delRow = i + 1 })
  40.     if (delRow) {
  41.         sh.Rows(delRow).Delete()
  42.         reset()
  43.     } else {
  44.         alert('失败,未找到' + id)
  45.     }
  46. }
  47. //更新
  48. function update() {
  49.     let { id, inp, job, sh } = getInfo()
  50.     if (MsgBox('确定更新职工编号:' + id, jsYesNo) != 6) return;

  51.     job.find((v, i) => {
  52.         if (v[0] == id) {
  53.             sh.Range(`B${i + 1}:L${i + 1}`).Value2 = inp
  54.         }
  55.     })
  56. }
  57. //获取基本信息
  58. function getInfo() {
  59.     let rng = ['E6', 'G6', 'I6', 'C8', 'E8', 'G8', 'C10', 'E10', 'G10', 'I10', 'C12']
  60.     return {
  61.         opt: OptionButton1.Value,           //搜索选项
  62.         txt: TextEdit1.Value,               //文本框内容
  63.         id: Range('C6').Value2,             //职工编号
  64.         sh: Sheets('职工信息'),             //职工信息表
  65.         rng: rng,                           //单元格位置
  66.         inp: rng.map(i => Range(i).Value2), //提前表单
  67.         job: Sheets('职工信息').Range('A1').CurrentRegion.Value2 //职工信息数据
  68.     }
  69. }
复制代码


TA的精华主题

TA的得分主题

发表于 2023-9-12 20:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
fsdbbs 发表于 2023-9-12 18:43
哇,看起就漂亮!
试了一下,身份证号不能录,表格改成文本只对查询有效,保存后身份证后面全是0000
=> ...

你这个是用来学习JSA吗,=>是箭头函数

TA的精华主题

TA的得分主题

发表于 2023-9-13 17:02 | 显示全部楼层
fsdbbs 发表于 2023-9-12 18:43
哇,看起就漂亮!
试了一下,身份证号不能录,表格改成文本只对查询有效,保存后身份证后面全是0000
=> ...

身份证号是单元格格式问题,改成文本就行了
QQ截图20230913135400.png

let index = opt ? 0 : 6
let arr = job.find(val => val[index] == txt)
这些都是JS语言的基础知识,注意不是JSA或者JS宏
QQ截图20230913160213.png


JSA/JS宏感觉没啥学的,Excel百分之九十的操作都是调用Workbook对象打开关闭工作簿、Worksheet对象、Range对象读写单元格......
简单看看文档十几分钟就能搞定了,前提是要有JS语言基础知识
QQ截图20230913162257.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-13 19:05 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-17 10:18 , Processed in 0.052303 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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