iLEDについて

Javaサンプル

Netbeans

Libre Office Basicマクロ

その他


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

Libre Office Basic マクロ


OpenOfficeマクロプログラミング―「Writer」「Calc」「Base」…OOoをBasicで便利に! (I・O BOOKS)

Libre Officeは一般的な使用においてはなかなかの互換性を実現しているのですが、 マクロに関しても以前のOpenOfficeに比べるとなかなかのレベルになってきているとは思います。 しかし、ある程度複雑なマクロになってくると、多少の手直しは必要な場合が出てきます。 MS Officeで作成したマクロをLibre Officeに書き換えて使うために、いろいろな情報がNet上にも 紹介されるようになってきていますが、まだ断片的な状態が多いですね。
ここでもいくつかのTipsをご紹介して少しでもLibre Officeの利用の手助けとしたいと思います。

今回紹介するのはファイルオープンダイアログで複数ファイルを選択する場合で、 格納配列の挙動に関してご紹介します。

固定IP無料!業界最安水準。月額980円で即日利用可能。最大2週間無料体験。

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

以下は、LibreOfficeのマクロ(BASIC)で、ファイル選択ダイアログを利用して複数のドキュメントファイルを開くという処理の サンプルです。
このサンプルでは、FilePickerのsetDisplayDirectory()にフォルダのパスを引数としてセットして呼び出すことで 初期表示フォルダを指定していますが、 プログラムコード内のコメントにあるように、Windows Vista 以降のOS(7、8を含む)では、 .setDisplayDirectory()を動作させるためには、LibreOfficeのメニュー-「ツール」-「OpenOffice.org」の「全般」の 「開くダイアログと保存ダイアログ」の 「OpenOffice.org ダイアログを使用する」にチェックを入れないと うまく初期表示フォルダの指定ができません。もう何年も前からOpenOfficeで確認されている不具合(?)仕様(?)のようですが、 仕方ありませんね。setDisplayDirectory()を使う場合には気を付けましょう。
以下のサンプルでは、マクロを起動するとファイル選択ダイアログ(FilePicker)が開き、選択したファイルをLibreOfficeのCalcで オープンします。
ファイルピッカーを使って複数ファイル選択を行う場合に注意したい点は、ファイル名を入れる配列のインデックスの0番(配列の先頭) に入るのは、ファイルの場所(フォルダのパス)であるという点に気を付けましょう。そして2番目以降の配列内には、 ファイル名のみが格納されておりパスは入っていませんから、アクセスするためにはフォルダのパスを頭に結合して フルパスを作って使用します。

sub test
    ' FilePicker を使った複数ファイルの選択, オープン
    Dim Array(1) as integer
    Dim sFiles(100)
    Dim FileProperties(2)  As New com.sun.star.beans.PropertyValue
    Array(0) = com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE

    oFilePicker = createUnoService( "com.sun.star.ui.dialogs.FilePicker" )
     strUrl = convertToUrl("D:\Doc\")
    With oFilePicker
        .initialize( Array() )
        'Windows Vista 以降のOSでは、.setDisplayDirectory()はメニュー-ツール-OpenOffice.orgの全般の
        ' 「開く」ダイアログと「保存」ダイアログの OpenOffice.org ダイアログを使用するにチェックを入れる。
          .setDisplayDirectory(strUrl)
        .appendFilter( "ドキュメント", "*.ods; *.xls" )
        .setMultiSelectionMode(True) '複数ファイル選択
    End With
     nAccept = oFilePicker.execute()
     If nAccept > 0 Then
         FileProperties(0).Name = "MacroExecutionMode" 
         FileProperties(0).Value = com.sun.star.document.MacroExecMode.USE_CONFIG 
         sFiles() = oFilePicker.getFiles()
         i=0
         For Each v In sFiles
             if i=0 then 
                 'sFiles(0)に入っているのはフォルダーのパス
                 folderPath=v
             else
                 sFP = ConvertFromURL( folderPath & v )
                 sFilePaths = sFilePaths & sFP & Chr$(13)
                 Doc=StarDesktop.loadComponentFromURL(folderPath & v,"_blank",0, FileProperties())            
             end if
             i=i+1
         next v
    end if
end sub

oFilePicker.getFiles()で得られる戻り値配列の中身が、最初の要素がフォルダパス、2番目以降が ファイル名となるのは複数ファイルを選択した場合です。選択が1個だけの時は最初の要素にファイル名を含む フルパスが入ります。したがってファイルが一つだけ選択されたか、複数選択されたかで処理を変えるのが 正しいでしょうね。たとえば以下のような感じ。FilePickerの挙動はいくつかややこしい点がありますね。

sub test2
    ' FilePicker を使った複数ファイルの選択, オープン
    Dim Array(1) as integer
    Dim sFiles(100)
    Dim FileProperties(2)  As New com.sun.star.beans.PropertyValue
    Array(0) = com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE

    oFilePicker = createUnoService( "com.sun.star.ui.dialogs.FilePicker" )
     strUrl = convertToUrl("D:\Doc\")
    With oFilePicker
        .initialize( Array() )
        'Windows Vista 以降のOSでは、.setDisplayDirectory()はメニュー-ツール-OpenOffice.orgの全般の
        ' 「開く」ダイアログと「保存」ダイアログの OpenOffice.org ダイアログを使用するにチェックを入れる。
          .setDisplayDirectory(strUrl)
        .appendFilter( "ドキュメント", "*.*; *.txt" )
        .setMultiSelectionMode(True) '複数ファイル選択
    End With
     nAccept = oFilePicker.execute()
    FileProperties(0).Name = "MacroExecutionMode" 
    FileProperties(0).Value = com.sun.star.document.MacroExecMode.USE_CONFIG 
 
    If nAccept > 0 Then
       sFiles() = oFilePicker.getFiles()
       i=0        
        if UBound(sFiles())>1 then
            For Each v In sFiles
                if i=0 then 
                    'sFiles(0)に入っているのはフォルダーのパス
                    folderPath=v
                else
                    sFP = ConvertFromURL( folderPath & v )
                    Doc=StarDesktop.loadComponentFromURL(folderPath & v,"_blank",0, FileProperties())            
                end if
                i=i+1
            next v
        else
            Doc=StarDesktop.loadComponentFromURL( sFiles(0),"_blank",0, FileProperties())
            next v
        end if
    end if
end sub

画像は、マクロ実行時のファイル選択ダイアログです。複数選択ができています。

fig

File Picker

Kom., 2013