2016年10月10日 星期一

Libreoffice Basic 讀取及寫入儲存格數值

       一直以來用著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 

2 則留言: