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 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());}
var[x, y, z]=['hello','JavaScript','ES6'];
console.log('x = '+ x +', y = '+ y +', z = '+ z);// x = hello, y = JavaScript, z = ES6[x,[y, z]]=['hello',['JavaScript','ES6']];
console.log('x = '+ x +', y = '+ y +', z = '+ z);// x = hello, y = JavaScript, z = ES6
var person={fname:"John",lname:"Doe",age:25};for(x in person)// x 为属性名{
txt=txt + person[x];}
循环遍历Array的索引:
var a =['A','B','C'];for(var i in a){
console.log(i);// '0', '1', '2'
console.log(a[i]);// 'A', 'B', 'C'}
注意:for ... in对Array的循环得到的是String而不是Number。
for…of循环
具有iterable类型的集合还可以通过for ... of循环来遍历,它是ES6引入的新的语法。
var a =['A','B','C'];var s =newSet(['A','B','C']);var m =newMap([[1,'x'],[2,'y'],[3,'z']]);for(var x of a){// 遍历Array
console.log(x);}for(var x of s){// 遍历Set
console.log(x);}for(var x of m){// 遍历Map
console.log(x[0]+'='+ x[1]);}
for of循环和for in循环的区别
for ... in循环遍历的实际是对象的属性名称,手动给Array对象添加了额外的属性后:
当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:
var a =['A','B','C'];
a.name ='Hello';for(var x in a){
console.log(x);// '0', '1', '2', 'name'}
for ... of循环则只循环集合本身的元素:
var a =['A','B','C'];
a.name ='Hello';for(var x of a){
console.log(x);// 'A', 'B', 'C'}
iterable内置的forEach方法
var a =['A','B','C'];
a.forEach(function(element, index, array){// element: 指向当前元素的值// index: 指向当前索引// array: 指向Array对象本身
console.log(element +', index = '+ index);});var s =newSet(['A','B','C']);//Set没有索引,因此回调函数的前两个参数都是元素本身
s.forEach(function(element, sameElement,set){
console.log(element);});var m =newMap([[1,'x'],[2,'y'],[3,'z']]);//Map的回调函数参数依次为value、key和map本身
m.forEach(function(value, key, map){
console.log(value);});
回调函数可以省略参数:
var a =['A','B','C'];
a.forEach(function(element){
console.log(element);});
while 循环
语法:
while(条件){
需要执行的代码
}// 或do{
需要执行的代码
}while(条件);
例子:
while(i<5){
x=x +"The number is "+ i +"<br>";
i++;}do{
x=x +"The number is "+ i +"<br>";
i++;}while(i<5);
var obj ={birth:1990,getAge:function(){var b =this.birth;// 1990varfn=()=>newDate().getFullYear()-this.birth;// this指向obj对象returnfn();}};
obj.getAge();// 25
var obj ={birth:2000,getAge:function(year){var b =this.birth;// 1990varfn=(y)=> y -this.birth;// this.birth仍是2000returnfn.call({birth:2010}, year);}};
obj.getAge(2015);// 15