Libre Office Basic マクロ
今回紹介するのは、LibreOffice Calcにおいて、データの入っている最終行を返すFunctionのサンプルです。
表計算ソフト用のスクリプト(マクロプログラム)を作成するとき、頻繁に必要となるのがデータがどの行まで入っているかという
ことを調べる処理です。Calc用にLibreOffice BASICで記述した例を示します。動作試験はバージョン 4.1.1.2で行いました。
Function GetEndRowがその処理を行うFunctionです。LibreOffice BASICは、対象とするドキュメント、シートなどは
オブジェクトとして扱うので、データ最終行を調べる対象となるドキュメントやシートも引数に指定して
呼び出すようにしています。現在のシートだけを対象にするのであれば、引数の個数を減らして作ってもいいかもしれません。
実行テストのために Sub GetEndRowTest() を付けてあります。あらかじめ現在のドキュメントのA列の適当な行にデータを入れておき、
Sub GetEndRowTest()を実行するとメッセージボックス内にA列のデータが入っている最終行の数字を表示します。
但し、BASIC内では行番号は0から始まるので、画面表示の行番号より1小さい値が表示されます。
Sub GetEndRowTest() Dim oDoc as Object Dim oSht as Object Dim n as Long oDoc = ThisComponent oSht = oDoc.Sheets(0) n = GetEndRow( oDoc, oSht, "A") msgbox( n, 0, "最終行") End Sub Function GetEndRow( oDc as Object, oSht as Object, sCol as String) as Long ' oDcはドキュメントオブジェクト ' oShtは対象とするシートオブジェクト ’sColは対象とする列名(アルファベット表示) '指定列のデータが入っている最終行を返す。 '行番号は0から始まるので、画面表示の行番号より1小さい。 Dim oCursor as Object Dim oCntrl as Object Dim oFrame as Object Dim oDispatcher as Object Dim oProp(2) as new com.sun.star.beans.PropertyValue Dim nShtEndRow as Long Dim nEndRow as Long Dim oDisp as String oCursor = oSht.createCursor() nShtEndRow = oCursor.getRangeAddress().EndRow ' oCntrl = oDc.getCurrentController() oFrame = oCntrl.Frame oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") ' oProp(0).Name = "ToPoint" 'oProp(0).Value = "$A$" & nShtEndRow oProp(0).Value = "$" & sCol & "$" & nShtEndRow oProp(1).Name = "Sel" oProp(1).Value = false oDispatcher.executeDispatch( oFrame, ".uno:GoToCell", "", 0, oProp()) ' oProp(0).Name = "By" oProp(0).Value = 1 oProp(1).Name = "Sel" oProp(1).Value = false oDispatcher.executeDispatch( oFrame, ".uno:GoUpToStartOfData", "", 0, oProp()) nEndRow = oCntrl.getSelection().getRangeAddress().EndRow ' GetEndRow=nEndRow End Function
マクロ実行時、A列の最終行9が表示されています。
前述のように、0行からカウントされるので画面表示の行より1少ない値となります。
Kom., 2013
このFunction GetEndRow()ではドキュメントオブジェクトを必ず指定する仕様になっていますが、
たとえばドキュメントオブジェクト引数を省略した場合は現在アクティブなドキュメントを操作対象とするなら、
ドキュメントオブジェクトはOptional属性の引数とし、Functinコード内で引数が指定されているかどうかを判定して、
処理を分岐させるとより親切なプログラムとなります。
このとき、オプショナルな引数は通常の必須引数の後に並べる必要があります。
Function GetEndRow( sCol as String, Optional oSht as object, Optional oDc as object ) as Long ................ oDoc = IIf(IsMissing(oDc), ThisComponent, oDc) ................