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