ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 跟我学JavaScript in WPS

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2022-5-22 01:18 | 显示全部楼层
LIUZHU 发表于 2022-5-21 18:08
请教楼主,VBA或JS怎么接业务?

还招人不?

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-22 04:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
读取和写入再总结一下:

方法1
function del(){
var endr=Application.Worksheets.Item("Sheet1").Range("A65536").End(xlUp).Row;
Application.Worksheets.Item("Sheet1").Range("A5:D"+endr).Delete();
}
注释:动态删除A5:D列的若干行,可以把Delete换成Clear,删除变清除。
第一次写JS代码,注意大小写的区别,否则一写就错。
开始学习的时候,注意学习并习惯它们是如何表达的,非常关键。
方法2
function ywsz(){
        let brr=[1,2,3,4];
        Range("A1").Resize(1,brr.length).Value2=brr;
}
说明:一维数组赋值和写入
注意:ValueValue2的区别:Value只能读取,而Value2可读可写。
写入时还有一种写法
function ywsz(){
        let brr=[1,2,3,4];
        Range("A4").Resize(1,brr.length).Formula=brr;
}
方法3
function test(){
        let arr=Range("A1:D5").Value2;
        Range("A10").Resize(arr.length,arr[0].length).Value2=arr;
}
注释:二维数组的赋值和写入
另外一种写法:
function shz(){
        let brr=[[5,6,7,8],[1,2,3,4]];
        Range("A1:D2").Value2=brr;
}

注意,单元格区域,不管是单行还是单列,都是二维数组。后续会如何处理,先提醒一下坛友。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-22 05:03 | 显示全部楼层
    书写规范
              1)每一行代码后面用 分号结束
        这个不是硬性规定,但是录制出的代码中每句后面都有分号,所以为了保持一致,我们还是加分号为妥。
      2)代码中的关键字严格区分大小写(说起来容易,做起来经常出错,初学者特别要引起重视)
                3)代码中具有逻辑结构的段落要注意缩进,以保持清晰的结构
   运行并调试
      运行并调试代码快捷键对照表
                  
VBA
JS
  运行
F5
F5
逐句运行
F8
F11
设置断点
F9
F9

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-22 05:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
常用输出信息的方法并注意区别
function shcxx()
{
        Console.log("WPSJS程序");     //在立即窗口中显示
        Debug.Print("调试代码");      //在立即窗口中显示
        alert("测试代码");        //在应用程序中显示(即在WPS窗口中显示对话框)
        MsgBox("注意事项",jsOKCancel+jsQuestion+jsDefaultButton2,"标题") //vb的参数移植过来即可,把vb改为js即可
        Console.clear();      //清除立即窗口中的所有信息
}
VBAJS的差异
1. 方法的差异
Vba的方法不加括号,js的方法必须加括号,否则会被JS判断为属性
VbaApplication.Workbooks(1).Close
JSApplication.Workbooks.Item(1).Close();
Vba的方法支持部分参数赋值,但JS对缺省的参数需要用undefined站位补齐。
VbaSet rng = Range("G:G").Find("深灰", LookIn:=xlValues)
JSlet rng=Range("A:A").Find("深灰",undefined,xlValues);
vba可通过数组方式取集合中的对象,JS必须通过Item方法获取集合中的对象
VbaApplication.Workbooks(1).Close
JSApplication.Workbooks.Item(1).Close();
④二维数组取值时,JS必须用Value2
Vbacells(2,3).value
JScells.Item(2,3).Value2
2. 属性的差异
vba中调用书写错误的属性会报错,而JS不会file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml1608/wps1.png。这就麻烦了!
vba支持thisdocument对象,而JS不支持该对象,用ActiveDocument代替。
3. 数据类型差异
VBA在数据定义时需要指明数据类型,但JS是动态类型,赋值侯才有类型,JS包括的基本类型有:字符串(string),数字(Number),布尔(Boolean),对空(Null),未定义(Undefined),Symbol,声明这些类型都是用关键字var
定义变量的对比
dim i as integer
var i;
dim j as string
var j;
注意:JS的数据类型都是小写,如:booleannumberstringtruefalse等等。
4. 运算符的差异
运算符差异
 
VBA
JS
算术运算符
Target.row mod 2 = 1
(Target.Row)%2==1
连接符
&
+
逻辑运算符
①AND②OR③<>
①&&②||③!=
JS中的运算符:
算术运算符:+-*/%
连接运算符:+
比较运算符:>,<,>=,>=,!=,==,===
逻辑运算符:||&&,!
赋值运算符:=+=-=*=/=
自增自减运算符:--++

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-22 05:17 | 显示全部楼层
本帖最后由 ctp_119 于 2022-5-22 13:23 编辑

     编程对世界的理解:
         1653167552(1).png
       什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
       对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用

TA的精华主题

TA的得分主题

发表于 2022-5-22 19:00 | 显示全部楼层
支持支持,一楼能做下大纲链接,点击后直接跳转到对应楼层就更好了

点评

后续吧,现在为时过早  发表于 2022-5-22 21:07

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-23 08:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
           今天,我们简单说一下变量

           变量,是存在内存中可以改变值的单元,单元的名字,就是变量名,变量的名称遵循命名规则(数字不可在首位,不可有特殊符号等,不可与系统的关键字重名),可以是单个字母,也可以是有意义的字母组合。
           变量,遵循三原则:
           1)定义变量(即声明变量,向内存一个地址,用于存储它)
           2)给变量赋值   即给内存地址存储东西
           3)使用变量,这是我们的最终目的。
           申明变量有关键字var,let,const三个关键字,分别表示的含义如下:
           var申明的变量是全局变量,在函数体整个过程可见。
           let申明的变量是局部变量,在代码块中可见。
           const申明的变量是常量,一旦声明,不可改变其值,并且必须在申明的时候赋值。
           例如:
           var i,j//声明变量i
           var sht;
           i=2;sht=Sheets("物料明细");  //给变量赋值
           const pi=π;//申明并赋值
           j=i++;     //使用变量

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-24 07:56 | 显示全部楼层
           下面我们将通过实例来学习JS的知识点
请看示图:
       微信截图_20220524075149.png
  1. <font size="3" color="#0000ff">function test(){
  2.         var jh=new Set();     //定义变量jh为空集合
  3.         let obj={};     //定义变量obj为空对象
  4.         var i;         //定义变量i
  5.         var j=2;        //定义变量j并赋值,使变量j的值等于2
  6.         var endr=Range("A65536").End(xlUp).Row;     //动态获取A列的最后一行的行号
  7.         Range("D2:E100").ClearContents();       //清除D2到E100单元格区域的内容
  8.         for (i=2;i<=endr;i++){       //通过循环给集合和对象赋值
  9.                 if (jh.has(Cells.Item(i,1).Value2)){       //通过集合的has函数来判断是否存在该元素
  10.                         obj[Cells.Item(i,1).Value2]=obj[Cells.Item(i,1).Value2]+Cells.Item(i,2).Value2;       //如果集合中存在该元素,就读取对象值加上对应的值,重新赋值给该元素
  11.                 }
  12.                 else {
  13.                         jh.add(Cells.Item(i,1).Value2);      //如果不存在该元素,就把改元素添加到该集合中
  14.                         obj[Cells.Item(i,1).Value2]=Cells.Item(i,2).Value2;    //如果不存在该元素,就把该元素添加到obj对象中的属性和属性值
  15.                 }
  16.        
  17.         }
  18.         for (let b in obj){     //通过循环读取对象obj并写入表格中
  19.                 Cells.Item(j,4).Value2=b;     //读取对象obj的属性(即键名)并写入表格中
  20.                 Cells.Item(j,5).Value2=obj[b];   //读取对象obj的属性值(即键值)写入表格中
  21.                 j++;    //变量j后自增1,相当于j=j+1
  22.         }
  23.         //思考为什么下面的代码也可以,是你理解for  in和for  of的关键
  24.         //for (let b of jh){
  25.         //        Cells.Item(j,4).Value2=b;
  26.         //        Cells.Item(j,5).Value2=obj[b];
  27.         //        j++;
  28.         //}
  29.         //下面是对象属性的查看
  30.         var arr=Object.keys(obj);
  31.         debugger;     //类似vba中的Stop,代码运行这里暂停,便于查看变量的值
  32. }</font>
复制代码



坛友们也可以发挥自己的能力,,,写写其他方法。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-24 08:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ctp_119 于 2022-5-24 08:06 编辑

再看简化1代码
  1. function test1(){
  2.         var obj={};
  3.         var i,j;
  4.         i=Range("A65536").End(xlUp).Row;
  5.         for (j=2;j<=i;j++){
  6.                 if (Cells.Item(j,1).Value2 in obj){      //in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false
  7.                         if (obj.hasOwnProperty(Cells.Item(j,1).Value2)){     //使用对象的hasOwnProperty方法判断一下,是否为对象自身的属性
  8.                                 obj[Cells.Item(j,1).Value2]=obj[Cells.Item(j,1).Value2]+Cells.Item(j,2).Value2;  //这句完全和字典是一样的,开始学字典的时候不理解,现在终于理解了!!!
  9.                         }
  10.                 }
  11.                 else {
  12.                         obj[Cells.Item(j,1).Value2]=Cells.Item(j,2).Value2;
  13.                 }
  14.                
  15.         }
  16.         var arr=Object.keys(obj);   //通过object.keys方法读取obj对象的属性,并复制给变量arr,是一个一维数组
  17.         for (var s=0;s<arr.length;s++){
  18.                 Cells.Item(s+2,7).Value2=arr[s];
  19.                 Cells.Item(s+2,8).Value2=obj[arr[s]];
  20.         }
  21.        
  22. }
复制代码

通过这样的比较学习,一定能够比较深刻的理解,,,坛友们一定要自己去敲代码并调试,才能转化为自己的能力!
其实这个代码还有可以简化的,第一个IF   in  的代码就可以去掉,这里属于多余的,但是保留下来,是我思考问题的一个过程,,,所以保留了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-24 08:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 ctp_119 于 2022-5-24 08:14 编辑

当时我没有想到三元操作符,O(∩_∩)O哈哈~


  1. function test2(){
  2.         var obj={};
  3.         var i,j;
  4.         i=Range("A65536").End(xlUp).Row;
  5.         for (j=2;j<=i;j++){
  6.                 if (isNaN(obj[Cells.Item(j,1).Value2])){//如果JS中有类似于iif这样的函数,就更简单了!可是找了半天没有找到
  7.                         obj[Cells.Item(j,1).Value2]=0;
  8.                 }
  9.                 obj[Cells.Item(j,1).Value2]=obj[Cells.Item(j,1).Value2]+Cells.Item(j,2).Value2;  //这句完全和字典是一样的,开始学字典的时候不理解,现在终于理解了!!!
  10.         }
  11.         var arr=Object.keys(obj);   //通过object.keys方法读取obj对象的属性,并复制给变量arr,是一个一维数组
  12.         for (t=0;t<arr.length; t++){
  13.                 Cells.Item(t+2,10).Value2=arr[t];
  14.                 Cells.Item(t+2,11).Value2=obj[arr[t]];
  15.         }
  16. }
复制代码


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-22 10:21 , Processed in 0.039243 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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