WPS JS宏入门案例集锦
JS宏官方API文档:https://qn.cache.wpscdn.cn/encs/doc/office_v19/index.htm
批量创建工作表/簿
批量创建工作表:
function 批量创建工作表(){ for (var city of ["成都","上海","北京"]){ let sht = Worksheets.Add(); sht.Name = city; } }
批量创建工作簿:
function 批量创建工作簿(){ for (var city of ["成都","上海","北京"]){ book = Workbooks.Add(); book.SaveAs(`E:/tmp/${city}`); book.Close(); } }
若book.SaveAs不传入全路径,则默认可能保存到我的文档文件夹中。
批量拆分工作表到工作簿
数据如下:
执行代码:
function 批量拆分工作表(){ for (var sh of Sheets){ // 如果既不指定 Before 也不指定 After,则新建一个工作簿,其中包含复制的工作表。 sh.Copy(); ActiveWorkbook.SaveAs(`E:/VBA/wps/${sh.Name}.xlsx`); ActiveWorkbook.Close(); } }
分解出3个独立的文件:
批量判断处理单元格数据
数据和需求如下:
简单的方法就是直接筛选再复制粘贴,但是现在我们需要完全基于js宏的语法实现:
function 分数筛选(){ var Arr1=[]; var Arr2=Range("a2:b13").Value(); for (var row of Arr2){ if (row[1]>=100){ Arr1.push(row); } } Range("d4").Resize(Arr1.length,2).Value2=Arr1 }
运行后:
工资条制作
数据如下:
执行如下代码:
function 工资条制作() { Application.DisplayAlerts=false; let src=Sheets("工资表"); for(let sht of Sheets){ if(sht.Name=="结果") sht.Delete(); } Application.DisplayAlerts=true; var sht=Worksheets.Add(); sht.Name="结果"; for(i=0;i src.Range("a1:m4").Copy(); sht.Cells.Item(5*i+1,1).PasteSpecial(); src.Range(`A${i+5}:M${i+5}`).Copy(); sht.Cells.Item(5*i+5,1).PasteSpecial(); } sht.Activate() } Range("a1:m4").Select(); for (var i=1;i Selection.Copy(); ActiveCell.Offset(5, 0).Range("A1:M4").Insert(xlShiftDown, undefined); Application.CutCopyMode = false; ActiveCell.Offset(5, 0).Range("A1:M4").Select(); } } var vs=Range("A1").CurrentRegion.Value().flat(); // 过滤掉空值并去重 vs=Array.from(new Set(vs.filter(v=v!=undefined))); // 一维数组默认赋值给一行,赋值给一列需要先转置二维 vs = WorksheetFunction.Transpose(vs); var wb = Workbooks.Add(); wb.Sheets(1).Range("A1").Resize(vs.length,1).Value2 = vs; }blockquote p注意:上面的代码使用JavaScript的语法对数组进行了去重。/p pre class="brush:python;toolbar:false"Array.from(new Set(arr)) /pre p过滤空值:/p pre class="brush:python;toolbar:false"arr.filter(v=>v!=undefined)
最终得到一列:
批量合并工作表并添加来源表名
原数据:
执行代码:
function 合并工作表数据(){ var NewArr=[],n=1; for (var ws of Sheets){ var Arr=ws.Range("a1").CurrentRegion.Value(); if (n++ ==1){var title=Arr[0].concat("工作表名")}; delete Arr[0] Arr.forEach(ar=>NewArr.push(ar.concat(ws.Name))); } NewArr.unshift(title); var wb=Workbooks.Add(); wb.Sheets(1).Range("a1").Resize(NewArr.length,NewArr[0].length).Value2=NewArr; }
成功合并得到如下结果:
语音朗读
代码如下:
function Workbook_Open() { Application.Speech.Speak("美好的一天就从这一刻开始吧!",true) } function Workbook_NewSheet(Sh) { Application.Speech.Speak("果然狠人老表,区区几张sheet是不够你消遣的!",true) } function Application_WorkbookBeforeClose(Wb, Cancel) { Application.Speech.Speak("就想问老板,可以下班了吗?") } function Application_SheetSelectionChange(Sh, Target){ if(Sh.Name!="词汇"|Target.Value()==undefined) return; Application.Speech.Speak(Target.Value()); }
保存上面的代码后,当打开或关闭该文件或新建工作表都会朗读对应的文字。
对于词汇这张工作表,点击任何有值的单元格都会对其进行朗读。
Application.Speech.Speak第二个参数传入true表示异步,默认为同步。
富文本弹窗
alert函数支持传入HTML:
function testAlert_CSS(){ let foo = `Hi
Hi ${new Date().toLocaleDateString()}
`; alert(foo) }
执行效果:
判断目标是否在指定区域内
function _m_isInArea(uArea,cell){ uArea = typeof(uArea) =="string" ? Range(uArea):uArea; cell = typeof(cell) =="string" ? Range(cell):cell; if(uArea.Parent.Name!=cell.Parent.Name) return false; let s_row=uArea.Row,e_row=s_row+uArea.Rows.Count-1; let s_col=uArea.Column,e_col=s_col+uArea.Columns.Count-1; let t_row = cell.Row,t_col = cell.Column; // Console.log(`${s_row}-${e_row},${s_col}-${e_col},(${t_row},${t_col})`); return s_row Console.log(_m_isInArea("A2:C20","B3")); Console.log(_m_isInArea("A2:C20","D3")); } let txtFile = "E:/tmp/a.txt"; let f = FreeFile() ; Open(txtFile,f,jsOutput,jsWrite); Write(f,"123"); Write(f,"456,789"); Write(f,"aaa,bbb"); Close(); Console.clear() let fNumber = FreeFile() Open(txtFile, fNumber,jsInput) while(!EOF(fNumber)) { let p=LineInput(fNumber); Console.log(p) } Close(fNumber) } name:'John', age:34} // 返回 object typeof new Date() // 返回 object typeof function () {} // 返回 function typeof myCar // 返回 undefined (如果 myCar 没有声明) typeof null // 返回 object name}, 你今年${age}岁了!`; 被执行的代码块 } document.write(cars[i] + "
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。