LibreOffice Calcでダイアログ上のテキストフィールドからセルへの転記
先回は、LibreOffice Calcのスプレッドシート上に置いたプッシュ・ボタンを押すとダイアログ(フォーム)が開き、そのダイアログ上のコマンド・ボタンを押すとそのダイアログが閉じるマクロをLibreOffice Basicによって作った。
今回は、このダイアログを用いてスプレッドシート上のセルに文字列を入力・転記するコードを書くのが目的。その手順を以下に書き留める。
- ここで前提とするLibreOfficeのバージョン
- LibreOffice 6.1 Calc
- マクロ作成に使用する言語
- LibreOffice Basic (Apache OpenOffice Basic)
- スプレッドシート・ドキュメントの前提条件
- Sheet1という名のシートを1つだけ用意
実装したい機能
今回実現したい機能はおおよそ次のとおり。
- LibreOffice Calcのスプレッドシート上に設けたプッシュ・ボタンを押すとダイアログが表示される。
- そのダイアログが表示される際、スプレッドシート上のA5というセルに入力されている文字列が、ダイアログ上にあるテキスト・フィールドにも反映される。
- ダイアログのテキスト・フィールドに全角または半角の文字列を入力して特定のコマンド・ボタンを押すと、その文字列が10文字以内(11文字未満)であるかどうかを検証し、10文字以内であればその文字列をスプレッドシート上のA5というセルに転記する。
- テキスト・フィールドに入力された文字列が11文字以上である場合はその旨を表示して処理を中止する。
- ダイアログ上の特定のコマンド・ボタンを押すと、テキスト・フィールドに入力された文字列が削除される。
- ダイアログ上の特定のコマンド・ボタンを押すとそのダイアログが非表示になる。
ダイアログとはダイアログ・ボックスのこと。Microsoft Excelではユーザーフォームと呼ばれているものに当たる。
ダイアログ上へ各種コントロールを追加
まずは、前回作成したダイアログ上に各種コントロールを追加する。例えば次のように配置する。
いちばん上にあるのがラベルフィールドと呼ばれるコントロール。上から2番目にあるのがテキスト・フィールドと呼ばれるコントロール。その下にコマンド・ボタンと呼ばれる3つのコントロールが配置されている。
コントロールの属性(プロパティ)の値を変更
ダイアログ上の各種コントロールの属性(プロパティ)の値は次のとおり。ここではそのデフォルトの値を変更した属性のみを示した。
属性名 | 値 |
---|---|
名前 | Dialog1 |
属性名 | 値 |
---|---|
名前 | Label1 |
タイトル | 文字列を全角10文字以内で入力してください。 |
属性名 | 値 |
---|---|
名前 | TextField1 |
最大文字数 | 10 |
最大文字数の値は半角文字にしか適用されないようだ。全角文字だとテキスト・フィールドに何文字でも入力することができてしまう。そのため、マクロを使って10文字未満でないと受け付けないようにコーディングすることにした。
安全なマクロを作成するためには、受け入れるデータができるだけ予想外のものにならないように予め限定することが大事。
属性 | 値 |
---|---|
名前 | CommandButton_closeDialog |
タイトル | 閉じる |
属性 | 値 |
---|---|
名前 | CommandButton_postText |
タイトル | セルへの転記 |
属性 | 値 |
---|---|
名前 | CommandButton_clearText |
タイトル | クリア |
スプレッドシート上のプッシュ・ボタンの属性値は次のとおり。
属性 | 値 |
---|---|
タイトル | ダイアログ表示 |
名前属性の値は任意でよいけれども、その一部はマクロのコード内容と関連してくるので、今回ここで示すコードを実際に利用する場合には、このとおりの名前でなければコードがうまく機能しない可能性がある。要注意。タイトルは自由。
LibreOffice Basicによるマクロのコーディング
完成されたコードは次のとおり。
REM ***** BASIC ***** 'ダイアログ上のテキストフィールドに入力された文字列を 'スプレッドシート上の特定のセルに転記する簡単なコード '変数を明示的に宣言してから使う規則を適用 Option Explicit 'パブリックドメインで各種変数を宣言 'ダイアログオブジェクト用 Dim oDialog As Object 'テキストフィールドオブジェクト用 Dim oTextField As Object 'ドキュメントオブジェクト用 Dim oDoc As Object 'スプレッドシートオブジェクト用 Dim oSheet As Object 'セルオブジェクト用 Dim oCell As Object '文字列型変数 Dim sText As String 'ダイアログ表示用サブルーチン Sub openDialog 'LoadLibraryメソッドでStandardというライブラリを読み込む DialogLibraries.LoadLibrary("Standard") 'CreateUnoDialog函数でダイアログオブジェクトを生成 '末尾のDialog1が先ほど作成したダイアログ名 oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1) '現在のアクティブなドキュメントを取得 oDoc = ThisComponent '0番目のスプレッドシートを取得 oSheet = oDoc.getSheets.getByIndex(0) 'A5というセルを取得 oCell = oSheet.getCellRangeByName("A5") 'TextField1というテキストフィールドを取得 oTextField = oDialog.getControl("TextField1") 'セルの値を取得して文字列型に変換して代入 sText = Cstr(oCell.String) 'テキストフィールドのテキスト属性にそれを設定 oTextField.setText(sText) 'Executeメソッドでダイアログを開く oDialog.Execute() 'Disposeメソッドでリソースを廃棄 oDialog.Dispose() End Sub 'ダイアログを閉じるボタン用サブルーチン Sub closeDialog 'endExecuteメソッドでダイアログを閉じる oDialog.endExecute() End Sub 'セルへ挿入ボタン用サブルーチン Sub postText 'TextField1というテキストフィールドを取得 oTextField = oDialog.getControl("TextField1") 'getTextメソッドでテキストフィールドのテキスト属性を取得し 'Cstr関数で文字列型に変換して代入 sText = Cstr(oTextField.getText) 'Len関数で文字列の数を求めて 'その数が11文字未満ならば If Len(sText) < 11 Then '現在のアクティブなドキュメントを取得 oDoc = ThisComponent '0番目のスプレッドシートを取得 oSheet = oDoc.getSheets.getByIndex(0) 'A5というセルを取得 oCell = oSheet.getCellRangeByName("A5") 'セルに文字列を代入 oCell.String = sText '11文字未満でなければ Else 'メッセージボックスを表示 MsgBox "10文字以内にしてください。" End If End Sub 'クリアボタン用サブルーチン Sub clearText 'テキストフィールドを取得 oTextField = oDialog.getControl("TextField1") 'setTextメソッドでテキスト属性を空白に oTextField.setText("") End Sub
Option Explicitによって変数を明示的に宣言してから使う規則を適用した。
サブルーチンの外のパブリック領域にて、各種オブジェクトを格納するオブジェクト型の変数5つと、文字列型の変数1つを宣言。
openDialogというサブルーチンには、ダイアログを表示するためのコード、そしてA5というセルの値をダイアログ上のテキスト・フィールドに表示するためのコードを、それぞれ記述。スプレッドシート上に置かれた「ダイアログ表示」というプッシュ・ボタンのイベントに対してこのサブルーチンを割り当てる。
closeDialogというサブルーチンには、そのダイアログを閉じるためのコードを記述。ダイアログ上に置かれた「閉じる」というコマンド・ボタンのイベントに対してこのサブルーチンを割り当てる。
postTextというサブルーチンには、テキスト・フィールドのテキスト属性から取得した文字列を、その文字数が10文字未満かどうかチェックした上でスプレッドシート上のA5というセルに転記するためのコードを記述。ダイアログ上に置かれた「セルへ転記」というコマンド・ボタンのイベントに対してこのサブルーチンを割り当てる。
clearTextというサブルーチンには、テキスト・フィールドのテキスト属性値を空白にするためのコードを記述。ダイアログ上に置かれた「クリア」というコマンド・ボタンのイベントに対してこのサブルーチンを割り当てる。
各種イベントに対してマクロを割り当てる
各種コントロール(プッシュ・ボタンとコマンド・ボタン)のイベントの一つである「マウスボタンを離した時」に対して各種の処理内容を記したマクロ(サブルーチン)をイベント・ハンドラとして割り当てる。
それらの割り当て表を作ってみた。
イベント | マクロ(サブルーチン) |
---|---|
マウスボタンを離した時 | Standard.Module1.openDialog (document, Basic) |
イベント | マクロ(サブルーチン) |
---|---|
マウスボタンを離した時 | Standard.Module1.closeDialog (document, Basic) |
イベント | マクロ(サブルーチン) |
---|---|
マウスボタンを離した時 | Standard.Module1.postText (document, Basic) |
イベント | マクロ(サブルーチン) |
---|---|
マウスボタンを離した時 | Standard.Module1.clearText (document, Basic) |
イベントに対してマクロ(サブルーチン)を割り当てる手順は次のとおり。
- 目的のコントロールを選択された状態にする。
- プロパティウィンドウの中の「イベント」タブを選び、「マウスボタンを離した時」というイベントの右端にあるボタンを押す。
- そうすると「アクションの割り当て」ダイアログが開く。そのイベント一覧で「マウスボタンを離した時」が選ばれていることを確認の上、「マクロ」ボタンを押す。
- そうすると「マクロセレクター」ダイアログが開く。ライブラリの一覧からModule1を選ぶ。
- そうするとマクロ名(サブルーチン名)の一覧が表示されるので、適切なマクロを選ぶ。
- そしてOKボタンを押してダイアログを閉じれば割り当ては完了。
各種の作業の後に作業中のスプレッドシートをその都度保存することを忘れずに。
実行結果
今回作ったマクロ(ダイアログを使った入力データの転記)の実行結果は次のようになる。
「
返信削除セルへの転記」をクリックしたときに最終セルの下に記入されるようにするには
それね😅
返信削除