OOobbs/33
質問
OOoBASICでの初めてのコーディングです。 ダイアログ(Dlg1)を表示させるときに、デフォルトの値として、特定のシート(Sheet1)上の特定のセル(C3)に書き込まれている値を読み込んで、テクストボックス(TextBox1)内に表示させ、そして、その値を編集後、それを元のセルに書き戻す、という操作をやりたいと思っています。 まず、セルの値を読み込んで、それをダイアログ上のテクストボックス内に表示させる方法がわかりません。 もちろん、そのテクストボックス内の値を元のセルに書き戻す方法もわかりません。 ExcelのVBAでは、上記の操作を作成済みなのですが、それをOOoのCalcに移植したいと思っています。 どなたか、ご教授願えると幸いです。 回答
ええっと,ダイアログの表示のさせ方は分かったのでしょうか? とりあえず,ダイアログを次のように作成してみました。 そういえば,特定のセル (C3) というのは,決まった型の値のみが入力されることを前提にして作成するのでしょうか?たとえば,「値 Value」,「テキスト Text」,「数式 Formula」などがありますが。さまざまな値が入力される可能性があるのであれば,それぞれ判断して取得してやる必要があります。 とりあえず,数値 (Value) が入力されるとしていきます。 上記のようなダイアログに対して,次のようにしました。部分ごとに取り上げていきます。 このファイルを参考にしてください。 Dim oDialog As Object, oMDialog As Object Dim oDoc As Object Dim oSheet As Object, oCell As Object Sub Main DialogLibraries.LoadLibrary( "Standard" ) oDialog = createUnoDialog( DialogLibraries.Standard.Dlg1 ) oMDialog = oDialog.getModel() oDoc = ThisComponent oSheet = oDoc.getSheets().getByName("Sheet1") oCell = oSheet.getCellRangeByName("C3") oMDialog.TextField1.Text = oCell.Value oDialog.execute() oDialog.dispose() End Sub Sub OK_Click() oCell.Value = oMDialog.TextField1.Text oDialog.endExecute() End Sub まずは, Dim oDialog As Object, oMDialog As Object Dim oDoc As Object Dim oSheet As Object, oCell As Object つぎの部分で,ダイアログを準備します。 Sub Main DialogLibraries.LoadLibrary( "Standard" ) oDialog = createUnoDialog( DialogLibraries.Standard.Dlg1 ) oMDialog = oDialog.getModel() ダイアログの表示ができているかどうかわからないので,とりあえず次です。 次の部分では,ドキュメントにアクセスしています。 oDoc = ThisComponent oSheet = oDoc.getSheets().getByName("Sheet1") oCell = oSheet.getCellRangeByName("C3") oDoc = ThisComponent ドキュメントを使うときの定石です。 oSheet = oDoc.getSheets().getByName("Sheet1") シートコンテナからシート (Sheet1) オブジェクトを名前指定で取得。 oCell = oSheet.getCellRangeByName("C3") セル (C3) オブジェクトをセルの名前指定で取得。 次の行は,ダイアログの TextField1 へセル C3 から取得した値 (数値 Value) を入力する行です。 oMDialog.TextField1.Text = oCell.Value ダイアログのモデルオブジェクト oMDialog のプロパティーとしてアクセスできるようになっているテキストフィールド TextField1 の Text プロパティーに文字列を設定することで,テキストフィールドに文字を入力することができます。 セルから値を取得する時には,セルオブジェクトの Value プロパティーを使用します。 ここでは,数値を取得するので Value プロパティーを使用しています。テキストなら Text プロパティーを使用します。 そして,ダイアログの表示とダイアログの開放。 oDialog.execute() oDialog.dispose() End Sub 次の Sub OK_Click() は,ダイアログの OK ボタンをクリックしたときに動作するように設定します。 Sub OK_Click() oCell.Value = oMDialog.TextField1.Text oDialog.endExecute() End Sub 始めの行の, oCell.Value = oMDialog.TextField1.Text では,取得するときの逆にして設定します。 oDialog.endExecute() では,ダイアログを閉じています。 これで,簡単に値の取得,設定が行えました。 OK_Click() を OK ボタンに割り当てる方法ですが,ダイアログの編集画面で OK ボタンを選択した状態にしておき,プロパティーのイベント設定タブで「実行時 (When initiating)」に上記の OK_Click() を割り当てます。
Cyksartです。 以下のように、組みました。 CInputDialogを表示させ、calcというシート名の各セルの数値を読み込み、編集後、その数値をセルに戻す、というマクロです。 余分な質問をすれば、Retという整数変数にOKの戻り値を与えて、その値でIf文で動作を選択するには、どうするのかな、ということです。まあ、以下のコーディングで目的の動作をしてくれますので、充分です。 Dim CIDlg as object, oMDlg as object, oSheet as object, oDoc as object Dim oCell(4) as object Sub ConstInput() Dim Ret as integer DialogLibraries.LoadLibrary("Standard") CIDlg = CreateUnoDialog(DialogLibraries.Standard.CInputDialog) oMDlg = CIDlg.getModel() oSheet = ThisComponent.Sheets.getByName("calc") oCell(1) = oSheet.getCellRangeByName("C3") oCell(2) = oSheet.getCellRangeByName("C5") oCell(3) = oSheet.getCellRangeByName("C6") oCell(4) = oSheet.getCellRangeByName("C7") oMDlg.TextBox1.Text = oCell(1).Value oMDlg.TextBox2.Text = oCell(2).Value oMDlg.TextBox3.Text = oCell(3).Value oMDlg.TextBox4.Text = oCell(4).Value Ret = CIDlg.Execute() CIDlg.Dispose() End Sub Sub CIDlg_OK oCell(1).Value = oMDlg.TextBox1.Text oCell(2).Value = oMDlg.TextBox2.Text oCell(3).Value = oMDlg.TextBox3.Text oCell(4).Value = oMDlg.TextBox4.Text End Sub ありがとうございました。
oDialog と違って、oMDialog は見た目を取り扱うオブジェクトとみなせます。実際は、ダイアログオブジェクト oDialog にビジュアルを追加するような oMDialog オブジェクトを被せてあるような形です。同じことが、ダイアログに含まれる全てのコンポーネント (ボタンやテキストボックスなど) にもいえます。 Dim oTextBox1 As Object, oMTextBox1 As Object oTextBox1 = oDialog.getControl("TextBox1") oMTextBox = oDialog.getModel().TextBox1 getControl メソッドは com.sun.star.awt.XControl インターフェースを戻しますが,getModel メソッドでは com.sun.star.awt.XControlModel インターフェースが戻ります。 ダイアログコンポーネントによっては,どちらかでしか設定できないプロパティーなどがあるので,使い分ける必要があります。
これを使えば, Ret = CIDlg.Execute() If Ret = 0 Then CIDlg_OK End If CIDlg.Dispose() End Sub Sub CIDlg_OK oCell(1).Value = oMDlg.TextBox1.Text oCell(2).Value = oMDlg.TextBox2.Text oCell(3).Value = oMDlg.TextBox3.Text oCell(4).Value = oMDlg.TextBox4.Text End Sub のような形にして,Sub CIDlg_OK をボタンに割り当てる必要がなくなります。その代わり,OK に相当するボタンの,「ボタンの種類」を "OK" にしておきます。が,このときには Cancel ボタンを追加した方が使いやすいと思います。 |