HI,大家好,我是星光。
近2年前WPS剛剛推出JS宏的時(shí)候,咱們說現(xiàn)在用個(gè)表格是越發(fā)不容易了,VB、SQL、JS、Python都來插一腿,聽說永中還支持Java,后來連Excel函數(shù)也漸趨于編程化……難怪有外國佬一本正經(jīng)的說用好Excel的都是程序員ε=(′ο`*)))。
最近JSA(WPS.JS宏的簡稱)慢慢熱起來了,今天就給大家回顧一下當(dāng)初的一篇舊文,重新了解一下這么幾個(gè)重要的問題??? 關(guān)于WPS.JS有沒有一些實(shí)際案例?? JS宏和VBA有哪些不同之處?
JS是Java Script的簡稱,是一門高端的動(dòng)態(tài)的弱類型的高效而通用的編程語言。它本身是面對Web的,但由于現(xiàn)代的Web瀏覽器,不論是電腦、智能手機(jī)、甚至游戲機(jī),都包含了Java Script解釋器,這就使JS成為了史上使用最廣泛的編程語言之一。事實(shí)上,咱們所熟悉的VBA和M語言,均可以調(diào)用一部分JS功能,比如VBA調(diào)取JS處理網(wǎng)頁數(shù)據(jù),M語言通過網(wǎng)頁函數(shù)調(diào)用JS的正則表達(dá)式等。
JS的條件語句和VBA相似,也是if和else結(jié)構(gòu)。但需要注意的是,當(dāng)if判斷結(jié)果存在多條語句時(shí),需要使用花括號{}包起來,形成一條復(fù)合語句。function myIF(){
let strID=Range('a1').Value2;
if(!strID){
let s=Range('a2').Value2;
if(s=='對') var t='公眾號Excel星球';
else var t='看見星光';
}
else {
var t='wps.js'
}
MsgBox(t)
}
2,使用JS實(shí)現(xiàn)循環(huán)語句在VBA教程里咱們講過,VBA循環(huán)語句有3種常見形式,for...to計(jì)數(shù)循環(huán)、for...ecah集合循環(huán)和while條件循環(huán)。實(shí)現(xiàn)這三種循環(huán)形式的JS代碼如下:for...to計(jì)數(shù)循環(huán)▼function mycycle1(){
Range('a1:a10').Clear();//清空全部
for (let i=1;i<=10;i++){
Cells(i,1).Value2=i;//單元格賦值
}
MsgBox('操作完成')
}
function mycycle2(){
for(let sht of Worksheets){//遍歷工作表集合
if(sht.Name=='看見星光'){//判斷工作表名稱是否為看見星光
MsgBox('工作表存在看見星光。');
return;
}
}
MsgBox('工作表不存在看見星光');
}
function mycycle3(){//條件循環(huán)為a1:a10賦值
Columns.Item(1).Clear();
let i=1;
while(i<11){//如果i小于11則執(zhí)行循環(huán)體
Cells(i,1).Value2=i;
i++
}
}
眾所周知,數(shù)組是編程中最重要的數(shù)據(jù)結(jié)構(gòu)。盡管如此,由于VBA太古老了,數(shù)組基本就是最原始的狀態(tài),所以數(shù)組的各種常用方法,比如靈活的查找、動(dòng)態(tài)的增刪、以及排序、去重等等……——一個(gè)都沒有!而JS的數(shù)組呢?方法有幾十個(gè),常用的數(shù)組串聯(lián)(join),增刪(splice),排序(sort),篩選(filter),判斷(some/every),查找(find),合并(concat),填充(fill),扁平化(flat)以及迭代的map、forEach、reduce等等。除此之外,JS的數(shù)組也比VBA靈活許多,不但大小動(dòng)態(tài),支持一次添加多個(gè)元素,而且添加的位置也很自由,可以輕松實(shí)現(xiàn)隊(duì)列、棧等數(shù)據(jù)結(jié)構(gòu)。舉一段簡單代碼(需要注意JS的數(shù)組是以中括號[]形式包裹起來的有序元素集合)。function array_test(){
let r=[];//聲明一個(gè)空數(shù)組
r[0]=1;//數(shù)組下標(biāo)為0添加一個(gè)值1
r.push(2,3);//在數(shù)組末尾添加2個(gè)元素
r.pop();//刪除數(shù)組最后一個(gè)元素
r.unshift(-1,0);//在數(shù)組開頭添加兩個(gè)元素
r.shift();//刪除數(shù)組首個(gè)元素
Range('1:1').Clear();//清空第一行所有
Range('a1').Resize(1,r.length).Value2=r;//數(shù)組結(jié)果寫入第1行
}
數(shù)組+字典是VBA數(shù)據(jù)處理的最佳組合方案,在JS宏中也是如此。JS也有類似字典的數(shù)據(jù)結(jié)構(gòu),只是它不叫字典,叫……對象。對象在JS中是使用花括號{}包括起來的數(shù)據(jù)內(nèi)容,是鍵值對結(jié)構(gòu):
{key1:value1,key2:value2,...}
和字典類似,key作為鍵名是對象的屬性,value是鍵名對應(yīng)的值。鍵名可以使用數(shù)值和字符串來表示。健值可以是任意類型。通常鍵名和值之間使用冒號分隔。例如,定義一個(gè)對象obj。示例代碼如下:
function d_test1(){
var d={名字:'看見星光',公眾號:'Excel星球'};
Console.log(d.名字);
}
代碼運(yùn)行后在本地窗口顯示字符串:看見星光。
JS對象同樣具有查改增刪等方法,相關(guān)示例代碼如下:function d_test2(){
var d={};//創(chuàng)建一個(gè)空對象
d['姓名']='看見星光';//添加鍵值對
d.愛好='學(xué)習(xí)';//如果沒有特殊符號,添加鍵值對也可以使用點(diǎn)號操作
Debug.Print(d['姓名']);//讀取屬性姓名對應(yīng)的值
d.姓名='公眾號Excel星球';//修改姓名對應(yīng)的值
delete d.愛好;//刪除屬性愛好
Debug.Print('愛好' in d);//使用in運(yùn)算符判斷對象中是否存在指定元素
if(!d.姓名){Debug.Print('不存在')}//!運(yùn)算符
else Debug.Print('存在');
let r1=Object.keys(d);//數(shù)組形式,返回對象屬性集合
let r2=Object.values(d);//數(shù)組形式,顯示值集合
let r3=Object.entries(d);//數(shù)組形式,返回對象鍵值對
}
從外觀上來看,JS宏的IDE和VBA長的差不多,也是由工程資源管理器、屬性窗口、本地窗口等部位組成,編寫方式也和VBA相類似。
兩者主要是語法不同。
聊幾點(diǎn)主要的不同之處。
VBA用Sub...End Sub關(guān)鍵字來定義過程,而JS用function(){}關(guān)鍵字來定義函數(shù),不存在Sub過程。VBA注釋使用單引號標(biāo)識,JS的單行注釋使用//,多行注釋使用/*和*/VBA聲明變量,需要使用Dim關(guān)鍵字,JS使用var或者let關(guān)鍵字(兩者間的不同后面我們開單章再聊,作為新人通常推薦使用var)。VBA變量聲明有數(shù)據(jù)類型,JS作為弱類型的編程語言,不需要聲明變量類型。另外,JS解釋器有自己的內(nèi)存管理機(jī)制,可以自動(dòng)對內(nèi)存進(jìn)行垃圾回收,當(dāng)不再有任何引用指向一個(gè)對象時(shí),解釋器就會自動(dòng)回收它所占用的內(nèi)存資源,這個(gè)比VBA的內(nèi)存管理更加穩(wěn)定高效。
此外,JS支持在1行語句中對多個(gè)變量進(jìn)行賦值。見下圖第3行代碼。首先,JS嚴(yán)格區(qū)分字母大小寫,其次,它使用分號(;)將語句分隔。語句如果各自獨(dú)占一行,語句間的分號通??梢允÷?,這時(shí)候換行符就等同于分號的作用——但作為初學(xué)者,還是建議大家養(yǎng)成使用分號的習(xí)慣。最后,當(dāng)將多條語句聯(lián)合在一起,形成一條復(fù)合語句時(shí),需要使用花括號{}將多條語句括起來。VBA可以直接使用集合索引的方式引用對象,比如引用第1個(gè)工作表:JS需要增加一個(gè)Item屬性,還是引用第1個(gè)工作表,語句如下:Worksheets.Item(1).Select()比較以上兩條語句,你還會發(fā)現(xiàn)一點(diǎn)不同。在VBA中,方法不需要加(),而JS必須加括號,比如Select()。屬性則不用加括號。除此之外,在VBA中,單元格對象默認(rèn)讀取Value屬性,JS沒有這個(gè)默認(rèn)屬性,而且它使用的關(guān)鍵字也不是Value,而是Value2。在VBA中判斷兩個(gè)值是否相等,使用運(yùn)算符(=),或者不等于(<>),而JS表示等號判斷的運(yùn)算符是(==),不等于的運(yùn)算符是(!=)VBA的邏輯與是And,邏輯或是Or,邏輯非是Not。JS的邏輯與是&&,邏輯或是||,邏輯非是!。VBA的文本連接符是&或+,JS不支持&,只支持+;此時(shí)要求合并的數(shù)據(jù)必須有一個(gè)是字符串,否則+就是加法運(yùn)算了。
沒了,以后想到啥就再補(bǔ)吧。雖然WPS的JS宏依然有很多不方便之處,但無論如何它都走出了自己的一步,不再處處追求兼容Excel,這才是走在成為國產(chǎn)之光的正確道路上對不對?只有和別人不一樣,才能發(fā)出光芒,不然頂多算個(gè)漂亮的影子。OK,今天和大家分享的內(nèi)容就這些。我是星光,左上角點(diǎn)關(guān)注,右下角點(diǎn)個(gè)贊,更多表格精彩內(nèi)容可以點(diǎn)擊菜單→資源福利等。揮揮手,明天再見。