Libre Office Basic マクロ
OpenOfficeマクロプログラミング―「Writer」「Calc」「Base」…OOoをBasicで便利に! (I・O BOOKS)
Libre Officeは一般的な使用においてはなかなかの互換性を実現しているのですが、
マクロに関しても以前のOpenOfficeに比べるとなかなかのレベルになってきているとは思います。
しかし、ある程度複雑なマクロになってくると、多少の手直しは必要な場合が出てきます。
MS Officeで作成したマクロをLibre Officeに書き換えて使うために、いろいろな情報がNet上にも
紹介されるようになってきていますが、まだ断片的な状態が多いですね。
ここでもいくつかのTipsをご紹介して少しでもLibre Officeの利用の手助けとしたいと思います。
今回紹介するのはファイルオープンダイアログで複数ファイルを選択する場合で、 格納配列の挙動に関してご紹介します。
以下は、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
画像は、マクロ実行時のファイル選択ダイアログです。複数選択ができています。
Kom., 2013