LibreOffice CalcのVBで印刷範囲を変更する

Dim args(2) as new com.sun.star.beans.PropertyValue
args(0).Name = "PrintArea"
args(0).Value = "$A$1:$U$30"
args(1).Name = "PrintRepeatRow"
args(1).Value = "$A$10"
args(2).Name = "PrintRepeatCol"
args(2).Value = ""
Dim dispatcher as Object
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(ThisComponent.CurrentController.Frame, ".uno:ChangePrintArea", "", 0, args())

LibreOfficeで他のドキュメントのマクロ(Function)を実行する

Calcを使用して「test.ods」から「呼び出されるドキュメント.ods」のFunctionを呼び出して結果を取得するのが目的。Version: LibreOffice 6.4.7.2

呼び出されるドキュメント.odsのFunctionは下記の通り。

Function Test(a, b)
    Print a
    b = "test3"
    Test = 1
End Function

test.odsから呼び出して結果を取得する。

Dim document As Object
document = StarDesktop.loadComponentFromURL(ConvertToUrl("/home/user/Desktop/呼び出されるドキュメント.ods"), "_blank", 0, Array())
Dim scriptProvider As Object
scriptProvider = document.getScriptProvider()
Dim url As String
url ="vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document"
Dim script As Object
script = scriptProvider.getScript(url)
Dim args As Object
args = array("test1", "test2")
Dim argsAfterFinishing As Object
argsAfterFinishing = array()
'test1と1が表示される
Print script.invoke(args, 0, argsAfterFinishing)
'test2が表示される
Print args(1)
'test3が表示される
Print argsAfterFinishing(1)

LibreOfficeでPostgreSQLデータベースにJDBCで接続

On Error Goto ErrorHandler
'Properties
Dim properties(2) As New com.sun.star.beans.PropertyValue
properties(0).Name = "user"
properties(0).value = "UserName"
properties(1).Name = "password"
properties(1).value = "Pass"
properties(2).name = "JavaDriverClass"
properties(2).value = "org.postgresql.Driver"
'Driver manager
Dim driverManager As Object
driverManager = createUnoService("com.sun.star.sdbc.DriverManager")
'Connection
Dim connection As Object
connection = driverManager.getConnectionWithInfo("jdbc:postgresql://192.168.0.1:5432/database-name", properties())
'Statement
Dim statement As Object
statement = connection.createStatement()
'Execute and number of update records
Print statement.executeUpdate("DELETE FROM table1;")
'ResultSet
Dim resultSet As Object
resultSet = statement.executeQuery("SELECT * FROM table2;")
While resultSet.Next
    Print resultSet.getString(1)
Wend
'Close
statement.close()
connection.close()
connection.dispose()
Exit Sub
'Error handle
ErrorHandler:
If IsNull(statement) = false Then
    If statement.isClosed() = false Then
        statement.close()
    End If
End If
If IsNull(connection) = false Then
    If connection.isClosed() = false Then
        connection.close()
        connection.dispose()
    End If
End If
If InStr(Error$, "org.postgresql.Driver") > 0 Then
    MsgBox("ツール→オプション→LibreOffice→詳細→クラスパスからPostgreSQLのJDBCドライバーを追加してください。", 64, "初期設定")
Elseif Len(Error$) > 0 Then
    MsgBox(Error$, 16, "エラー")
End If

LibreOffice Calcでダイアログを作成して表示する

「ツール」→「マクロ」→「ダイアログの管理」から追加した”Dialog1″を表示してダイアログ内のテキストフィールドの値を取得するコード。ちなみにダイアログをコードで閉じるにはdialogオブジェクトのendexecute()メソッドを呼ぶ。

'Show dialog
DialogLibraries.LoadLibrary("Standard")
dialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
dialog.execute()
'Get text
Dim textField As Object
textField = dialog.getControl("TextField1")
Dim value As String
value = textField.getText()

ファイルの保存ダイアログを表示する

Dim filePicker As Object
Dim saveFiles() As Variant
Dim saveFileUrl As String
Dim saveFilePath As String

filePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
filePicker.initialize(Array(com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE))

filePicker.appendFilter("テキストファイル(*.txt)", "*.txt")

If filePicker.execute() = 1 Then
    saveFiles = filePicker.getFiles()
    saveFileUrl = saveFiles(0)
    saveFilePath = ConvertFromURL(saveFileUrl)
    MsgBox(saveFilePath) '拡張子付いてないかも
End If

ファイルの選択ダイアログを表示する

Dim filePicker As Object
Dim loadFiles() As Variant
Dim loadFileUrl As String
Dim loadFilePath As String

filePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
filePicker.initialize(Array(com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE))

filePicker.appendFilter("テキストファイル(*.txt)", "*.txt")
filePicker.appendFilter("HTMLファイル(*.htm, *.html)", "*.htm;*.html")
filePicker.appendFilter("すべてのファイル(*.*)", "*.*")

If filePicker.execute() = 1 Then
    loadFiles = filePicker.getFiles()
    loadFileUrl = loadFiles(0)
    loadFilePath = ConvertFromURL(loadFileUrl)
    MsgBox(loadFilePath)
End If