iLEDについて

Javaサンプル

Netbeans

Libre Office Basicマクロ

その他


Author of This Site:
M. Kom. (kom9kmail@gmail.com)
Spam対策のため@マークは全角になっていますから、メール送信時には半角にしてください。

Libre Office Basic マクロ

札幌で、北海道産のお酒や北海道産のお米を主に販売しているサイトです。

今回紹介するのは、LibreOffice Calcにおいて、データの入っている最終行を返すFunctionのサンプルです。

<< SDメモリUSBメモリ激安 上海問屋 >>

表計算ソフト用のスクリプト(マクロプログラム)を作成するとき、頻繁に必要となるのがデータがどの行まで入っているかという ことを調べる処理です。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少ない値となります。

fig

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)
    ................