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少ない値となります。

Getting Last Row Number
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)
................
