一直以來用著Libreoffice的Calc製作各種計算,雖然函式很多,也非常好用,但就是少了一點什麼,而這一點什麼就是類似迴圈等自動跑出一個結果的功能
。在MS Office中有著許多人都說非常好用又簡單的VBA,因此我就把腦筋動到了提供一樣功能的Libreoffice Basic上了。Libreoffice basic的教學資料其實非常的多,尤其是從Openoffice所一脈相傳下來的大量教學,參考價值都非常足夠,但早在幾年前就有這個想法了,又怎麼會在今天才做呢?
那時在找資料看到了給初學者的官方英文文件,但真的很簡短,而且對於API沒有很詳細的說明,看了就一頭霧水,也沒有非常必要立刻學會,就暫時把它給忘了。直到這兩天想說反正公司電腦是配MS Office,就看看VBA怎麼寫好了,不看還好,看了就告訴自己當初怎麼不從這裡切入就好了...因為從VBA的語法去查對應的Libreoffice basic語法比官方文件清楚容易多了。下面就用我目前最需要的讀取儲存格資料處理後放回儲存格來做Libreoffice basic的說明。
在Libreoffice basic需要先告訴Libreoffice你要處理的是哪個部份,不然就無法執行,因此必須要透過下方程式碼來告知
ThisComponent.Sheets.getByIndex(0)
這段程式碼的ThisComponent指的是這個檔案,Sheets則是指工作表,而Libreoffice的編碼都是從0開始,getByIndex(0)從英文字面上就是從索引標籤取得,因此getByIndex(0)就是第一個工作表,那麼如果每次需要讀取資料都要這麼一長串程式碼就太麻煩了,所以可以用一個變數來儲存上面這段程式碼所取得的值,如下
DIM Sheet0 as Object
Sheet0 = ThisComponent.Sheets.getByIndex(0)
DIM Sheet0 as Object是宣告Sheet0為一個物件的變數,第二行就是很單純的把提取的資料儲存到Sheet0這個變數裡而已。但事實上Basic不需要像C語言一樣宣告變數就可以使用變數,所以不需要DIM Sheet0 as Object也是可以的,而且大小寫也不會分辨為不同的變數,不過日後程式碼變多就會變得很難閱讀,因此還是建議要宣告一下比較好。
有了這個之後就可以開始來對試算表裡的資料做讀取與寫入了,那要怎麼找到哪個儲存格呢?程式碼與找到工作表類似,而前面我們已經用了Sheet0來告知那個工作表了,所以這裡就可以用Sheet0來開頭,不需要再用ThisComponent.Sheets.getByIndex(0)這麼長一串了
Sheet0.getCellByPosition(0,1).Value
這裡的.getCellByPosition(0,1)從英文字面上就是由位置來取得儲存格的值,(0,1)第一個數值代表欄(直的方向),第二個數值代表列(橫的方向),所以代表的就是A2這個儲存格,而.Value則是指這個儲存格的數值。指定好那個工作表的那個儲存格之後就可以讀取和寫入數值啦~下面是一個簡單的把A1儲存格的數值乘2放到A2儲存格去的程式碼供大家參考
Sub Main
DIM Sheet0 as Object
DIM A1
Sheet0 = ThisComponent.Sheets.getByIndex(0)
A1 = Sheet0.getCellByPosition(0,0).Value
Sheet0.getCellByPosition(0,1).Value = A1 * 2
End Sub