ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

LibreOffice Calcでダイアログ上のテキストフィールドからセルへの転記

先回は、LibreOffice Calcのスプレッドシート上に置いたプッシュ・ボタンを押すとダイアログ(フォーム)が開き、そのダイアログ上のコマンド・ボタンを押すとそのダイアログが閉じるマクロをLibreOffice Basicによって作った。

今回は、このダイアログを用いてスプレッドシート上のセルに文字列を入力・転記するコードを書くのが目的。その手順を以下に書き留める。

ここで前提とするLibreOfficeのバージョン
LibreOffice 6.1 Calc
マクロ作成に使用する言語
LibreOffice Basic (Apache OpenOffice Basic)
スプレッドシート・ドキュメントの前提条件
Sheet1という名のシートを1つだけ用意

実装したい機能

今回実現したい機能はおおよそ次のとおり。

  1. LibreOffice Calcのスプレッドシート上に設けたプッシュ・ボタンを押すとダイアログが表示される。
  2. そのダイアログが表示される際、スプレッドシート上のA5というセルに入力されている文字列が、ダイアログ上にあるテキスト・フィールドにも反映される。
  3. ダイアログのテキスト・フィールドに全角または半角の文字列を入力して特定のコマンド・ボタンを押すと、その文字列が10文字以内(11文字未満)であるかどうかを検証し、10文字以内であればその文字列をスプレッドシート上のA5というセルに転記する。
  4. テキスト・フィールドに入力された文字列が11文字以上である場合はその旨を表示して処理を中止する。
  5. ダイアログ上の特定のコマンド・ボタンを押すと、テキスト・フィールドに入力された文字列が削除される。
  6. ダイアログ上の特定のコマンド・ボタンを押すとそのダイアログが非表示になる。

ダイアログとはダイアログ・ボックスのこと。Microsoft Excelではユーザーフォームと呼ばれているものに当たる。

ダイアログ上へ各種コントロールを追加

まずは、前回作成したダイアログ上に各種コントロールを追加する。例えば次のように配置する。

いちばん上にあるのがラベルフィールドと呼ばれるコントロール。上から2番目にあるのがテキスト・フィールドと呼ばれるコントロール。その下にコマンド・ボタンと呼ばれる3つのコントロールが配置されている。

コントロールの属性(プロパティ)の値を変更

ダイアログ上の各種コントロールの属性(プロパティ)の値は次のとおり。ここではそのデフォルトの値を変更した属性のみを示した。

ダイアログ自身
属性名
名前 Dialog1
ラベルフィールド
属性名
名前 Label1
タイトル 文字列を全角10文字以内で入力してください。
テキスト・フィールド
属性名
名前 TextField1
最大文字数 10

最大文字数の値は半角文字にしか適用されないようだ。全角文字だとテキスト・フィールドに何文字でも入力することができてしまう。そのため、マクロを使って10文字未満でないと受け付けないようにコーディングすることにした。

安全なマクロを作成するためには、受け入れるデータができるだけ予想外のものにならないように予め限定することが大事。

コマンド・ボタン1
属性
名前 CommandButton_closeDialog
タイトル 閉じる
コマンド・ボタン2
属性
名前 CommandButton_postText
タイトル セルへの転記
コマンド・ボタン3
属性
名前 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)

イベントに対してマクロ(サブルーチン)を割り当てる手順は次のとおり。

  1. 目的のコントロールを選択された状態にする。
  2. プロパティウィンドウの中の「イベント」タブを選び、「マウスボタンを離した時」というイベントの右端にあるボタンを押す。
  3. そうすると「アクションの割り当て」ダイアログが開く。そのイベント一覧で「マウスボタンを離した時」が選ばれていることを確認の上、「マクロ」ボタンを押す。
  4. そうすると「マクロセレクター」ダイアログが開く。ライブラリの一覧からModule1を選ぶ。
  5. そうするとマクロ名(サブルーチン名)の一覧が表示されるので、適切なマクロを選ぶ。
  6. そしてOKボタンを押してダイアログを閉じれば割り当ては完了。

各種の作業の後に作業中のスプレッドシートをその都度保存することを忘れずに。

実行結果

今回作ったマクロ(ダイアログを使った入力データの転記)の実行結果は次のようになる。

関連記事

コメント


  1. セルへの転記」をクリックしたときに最終セルの下に記入されるようにするには

    返信削除

コメントを投稿

このブログの人気の投稿

Visual Studio 2019にはC++のためのフォームデザイナーがない件

10の補数と9の補数と2の補数と1の補数

LibreOffice 6 Calcでフォーム(ダイアログ)を作成してマクロで表示