会出现在⾸页醒⽬的位置,选中它,点击添加。
图⽚
的选项卡,稀稀疏疏的包含了⼏个命令按钮。
图⽚
Excel.run(function(context){ var sheet = context.workbook.worksheets.add("看见星光");//新建⼀张⼯作表 var Range("a1:b2")//取a1:b1区域 range.values=[['姓名',''], ['看见星光','Excel星球']]; sheet.activate();//选中⼯作表 return context.sync();//发送命令队列})//catch获取结果信息.catch(function (error) { console.log(error); if (error instanceof OfficeExtension.Error) { console.log(error.debugInfo); }});
……
虽然说Office.js是命令队列的性质,但如果我们只是设置Excel的属性或者调⽤Excel的⽅法,代码看起来是正常的,完全符合VBA的线性思维逻辑。
不过……
如果我们需要从Excel读回数据,事情就变了。
举个例⼦。
将当前⼯作表A2单元格的值,赋值给B2单元格。
使⽤VBA代码解决这个问题很简单,⼀句代码即可:
Range("b2").Value = Range("a2").Value
但Office.js则是⿇烦她妈带⿇烦去⿇烦他爷爷还有⿇烦他奶奶⿇烦他⼆舅⿇烦他三姨真是⿇烦太多了。
⽰例代码如下:
Excel.run(async function(context){ var sheet = context.ActiveWorksheet();//获取当前⼯作表对象 var a_Range("a2"); a_range.load("values");//加载a2的值属性 await context.sync();//发送请
求 Range("b2").values=a_range.values; return context.sync();}).catch(function (error) { console.log(error); if (error instanceof OfficeExtension.Error) { console.log(error.debugInfo); }});
第2⾏代码获取当前⼯作表对象。第3⾏代码获取当前⼯作表的A2单元格对象。
第4⾏代码使⽤load语句加载A2单元格对象的指定属性,本例为values,也就是值。
第5⾏代码发送命令队列,加载A2单元格的值数据。
await context.sync()
第6⾏代码将当前⼯作表的B2单元格的内容设置为A2单元格的值。
……
为啥要这么绕呢?像VBA那么直来直去不好吗?饱暖思淫欲,幸福的⽇期已经过不下去了吗??
问题在于,在Office.JS的运⾏机制⾥,语句组成了命令队列,load语句也不例外,它像其它语句⼀样⽼⽼实实排队。但是——
在context.sync()发送命令请求后,系统并不会按照排队顺序执⾏它,⽽是在执⾏完设置属性或调⽤⽅法的语句后,才执⾏load语句——这就乱套了不是?
排队排了个寂寞,资本主义的产物果然没有社会主义核⼼价值观的公平正义平等o(* ̄︶ ̄*)o
为了解决这个问题,我们可以将第1⾏的批处理函数,增加关键字async。
Excel.run(async function(context)
在第5⾏使⽤await context.sync();语句发送⼀次命令请求,系统执⾏命令队列,并返回代理对象,此时的a_range对象就拥有了values属性。
然后我们才能正常读取该属性,并使⽤它。
……
整个Office.js的基本语句结构和运算机制,差不多就是这样的。很显然,对于VBA朋友⽽⾔,确实不⼤友好;对于没有任何编程基础的朋友⽽⾔,那就更不友好了。
如果微软打算⽤它来代替VBA……我个⼈觉得可能性并不⼤。Office.js⾃⾝的定位,是跨平台制作Office外部插件,完全可以独⾃美丽。
不过话说回来,世上再没有⽐VBA更傻却⼜更全⾯的脚步语⾔了——不管是WPS还是微软,考虑的更多的都是跨平台性,⽽不是在功能上全⾯替代⿇雀虽⼩五脏俱全的VBA。
4 ⼁
实际案例
vba编程技巧打个响指,最后给⼤家举两个实际案例。
1⼁条件判断语句
以下代码获取当前⼯作表A2:A10区域的成绩,并按照是否⼩于60分为标准,判断成绩是否及格。
代码解析见注释
代码看不全可以左右拖动...▼
Excel.run(async function(context) {//异步 var sheet = context.ActiveWorksheet();//当前⼯作表 var range = Range("B:B");//B列对象 range.clear();//清空B列 Range("b1").values=[["结果"]];//
B1单值 var val_Range("a2:a10");//A2:A10区域对象 val_range.load("values");//获取值 await context.sync();//发送请求,获取属性 var r=val_range.values;//获取值集
合 //console.log("Debug: " + JSON.stringify(r)) var rowCount=r.length;//⾏数 for(var i=1;i<=rowCount;i++){//循环判断 var v=r[i-1]; var Cell(i,1); v<60 ? range.values=[["不及格"]]:range.values=[["及格"]];//判断是否及格 } return context.sync();}).catch(function (error) { console.log(error); if (error instanceof OfficeExtension.Error) { console.log(error.debugInfo); }});
2 ⼁字典和数组
假设有两张表,⼀张是数据源表,⼀张是结果表。现在需要根据数据源表的数据,查询结果表中对应⼈名的成绩。
这样的问题在VBA中最常⽤的思路是数组+字典,相关形式的JS实现代码参考如下:
代码解析见注释
代码看不全可以左右拖动...▼
Excel.run(async function(context) {//异步 var wb = context.workbook;//当前⼯作簿 var rng_data=Item("数据源").getUsedRange();//数据源 var sht_res=Item("结果表"); var rng_res=Used 询区域 rng_data.load("values"); rng_res.load("values"); await context.sync();//发送请求,获取值属性 var d={};//对象 rng_data.values.forEach((v)=>{d[v[0]]=v[1]});//数组转对象结构 var r= rng_res.values for(var i=1;i<=r.length-1;i+ { var t=d[r[i][0]]; if(!t){r[i][1]="查⽆"} else {r[i]
[1]=t} }; sht_res.activate(); rng_res.values=r; //console.log("Debug: " +JSON.stringify(r)); return context.sync();}).catch(function (error) { console.log(error); if (error instanceof OfficeExtension.Error) { console.log(error.deb
没了,今天给⼤家分享的内容就这些。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论