あまプロではLibreOfficeを使ってマクロやアプリの開発を行う事が有ります。
先日LibreOffice Basicでグリッド(テーブル) コントロールを使った際にどはまりしたんで、あメログ。
ハマり過ぎて、Bugzillaにバグを起票してしまいました🦋
例えば、Calcでシートをデータベースとして、ダイアログ(フォームコントロール)をフロントエンドとするアプリを実装してみます。
新規で適当なodsファイルを作成します。
シートをデータベースとして使うので、適当なシート名と適当なデータを挿入します
一行目がヘッダ行です
ツール > マクロ > マクロの管理 > Basic... を押下します
マクロの起動先ツリーからosdファイルのStandardを選択して、管理ボタンを押下します
Basicマクロ管理画面が表示されるので、ダイアログタブを選択し、osdファイルのStandardを選択して、新規作成ボタンを押下します
新しいダイアログで、適当な名前を入力して、OKボタンを押下します
入力した名前のダイアログが作成され、ツリーに追加されます
ツリーを選択して、編集ボタンを押下します
LibreOffice Basic( IDE)が起動します
ダイアログにグリッド(テーブル)コントロールを追加します
何故かメニューのダイアログには無いので
ツールバーのテーブルコントロールを押下します
ドラッグアンドドロップで適当な大きさのテーブルコントロールを追加します
自動的に名前(GridControl1)が生成されます
ツール > マクロの管理 > Basic... を押下して、Basicマクロを表示します
ツリーのodsファイルのStandardを選択して、新規作成ボタンを押下します
新しいモジュールが表示されるので、適当な名前を入力して、OKボタンを押下します
モジュールが作成され、自動的にMainサブルーチンも生成されます
Mainに以下のLibreOffice Basicを実装します
Sub Main
'ライブラリをロードして、ダイアログを作成する お約束
DialogLibraries.LoadLibrary( "Standard")
Set oDialog = CreateUnoDialog( DialogLibraries.Standard.Dialog1)
Dim GridControl1 As Object: Set GridControl1 = oDialog.getControl( "GridControl1")
With ThisComponent.getSheets( ).getByName( "flowers")
'ヘッダ行からカラム名を取得 列幅は50px
col0 = GridControl1.Model.ColumnModel.createColumn()
col0.Title = .getCellByPosition( 0, 0).String
col0.MaxWidth = 50
GridControl1.Model.ColumnModel.addColumn( col0)
col1 = GridControl1.Model.ColumnModel.createColumn()
col1.Title = .getCellByPosition( 1, 0).String
col1.MaxWidth = 50
GridControl1.Model.ColumnModel.addColumn( col1)
col2 = GridControl1.Model.ColumnModel.createColumn()
col2.Title = .getCellByPosition( 2, 0).String
col2.MaxWidth = 50
GridControl1.Model.ColumnModel.addColumn( col2)
GridControl1.Model.GridDataModel.removeAllRows( )
Dim i As Integer: i = 1
Do While .getCellByPosition( 0, i).String <> ""
'セルのデータを配列化してグリッドに行追加する
GridControl1.Model.GridDataModel.addRow( 0, _
Array( .getCellByPosition( 0, i).String, .getCellByPosition( 1, i).String, .getCellByPosition( 2, i).String))
i = i + 1
Loop
End With
oDialog.Execute()
End Sub
簡単に説明すると、シートのヘッダから列を生成して、データから行を追加してます。
GridControl1(のメンバのModel)にColumnModelとGridDataModelというメンバが有りまして、そこにaddColumnしたりaddRowしたりしなければならない為にこの様に実装します。
参考
UNO Grid ControlColumnModelと
GridDataModel 最後に、odsファイルを開いた際に、このMainを実行する様に設定します
Calcの ツール > マクロ > マクロの管理 > Basic... を押下します
実装したModule1のMainを選択して、割り当てボタンを押下します
カスタマイズが表示されるので、文書を開いた時を選択してマクロボタンを押下します
マクロセレクターが表示されるので、Module1のMainを選択して、OKボタンを押下します
マクロが割り当てられます
OKボタンを押下します
保存して、Calcを終了します。
odsファイルを開きます
設定によってセキュリティ警告が表示された場合は、マクロの有効化を押下します
グリッド(テーブル)コントロールにデータが表示されます
これを応用すれば、データを整理して表示する様なアプリに使えます。
非常に便利なんですが、ドキュメントが無かったので…載せておきます。
サンプルはこちらです グリッド.ods
試した環境はこちらです