「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:2141
現在:2


マクロによるチェックボックスのoff

ページOpenOffice.org FAQの登録ページ
投稿者urudakara
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-05-25 05:13:51 (水)
OSLinux Ubuntu10.04
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

こんにちは。今回はマクロについて解らないのでよろしくお願いします。

やりたいことは、特定のテキストボックスが更新されたときに、チェックボックスをoffにするマクロをを作りたいと思っています。。

サンプルファイルをアップします。

サンプルファイルのフォーム'個体情報'中のテキストボックス'tb_売却日'を更新したときに、 フォーム中のチェックボックス 'cb_在籍' をoffにしたいです。
その際に「在籍をoffにしますか?」とダイアログを出してyes であったらoffにして noであったらそのままの状態を保持出来ればと思います。。

自分で調べて、

・マクロはテキストボックスの更新後のイベントに保存
・msgboxを使う

ということ位しか解りませんでした。 解らない事ばかり申し訳有りませんが、教えていただければと思います。


はじめの一歩

M.Kamataki (2011-05-25 11:25:04 (水))

MsgBoxを表示するだけのマクロを試してみた限りだと、テキストボックス'tb_売却日'のイベント「更新後」にマクロを割り当ててみたところ期待した動作になりますね。1文字入力するたびにダイアログが出てしまうような気がしましたが、杞憂だったようです。

はじめの一歩として、「はい」「いいえ」ボタンを持つMsgBoxを表示するマクロを作成してみてはどうでしょうか。以下が参考になると思います。

メッセージボックスとインプットボックス (OpenOffice.org 実行時ライブラリ)
http://wiki.services.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Message_and_Input_Boxes_%28Runtime_Library%29

更新イベントは私も勘違いしてました

ike@九州 (2011-05-25 11:44:25 (水))

イベントの更新後はてっきりフォームの更新後だと思ってました。
フィールド毎の更新後になってるんですね

Msgbox 関数の使い方は kamataki さんの紹介先参照してくださいね

'更新後
Sub kousin(oEvent)
   oForm = oEvent.Source.getParent
   oCtrModel = oForm.getByName("cb_在籍")
   nID = oForm.findColumn(oCtrModel.datafield)
   If Msgbox("在籍をoffにしますか?",4) = 6 then oForm.updateInt(nID,0)
End Sub

ありがとうございます。もうすこし教えてください。

urudakara (2011-05-27 05:20:15 (金))

kamatakiさん、ike@九州さんいつもありがとうございます。

kamatakiさん
確かに何か自分で作ってからお聞きするべきでした。
今後は間違ってもいいからマクロの一部だけでも書いて投稿するようにします。
自分のレベルアップにもつながりますし。

友人にMicrosoft AccessのVBAコードを見せてもらいましたが、非常にシンプルで
かつ分かり易いものだったような気がします。
openofficeのbasicは初心者の私にはハードルがかなり高いものです。
もう少しわかりやすければなあ・・・と思ってしまいますね(笑)。
とにかく次回以後にはいくらかコードを書いてからにします。

ike@九州さん

いつも有り難うございます。
私の思い描いた通りのマクロです。

お手数をお掛けして申し訳無いのですが、私がいつもつまずくポイントがあります。
それが最初の定義の部分。

  oForm = oEvent.Source.getParent
  oCtrModel = oForm.getByName("cb_在籍")
  nID = oForm.findColumn(oCtrModel.datafield)


上記の部分がどうしてもわからないのです。
具体的に何をやっているのか一行づつコメントをいただけないでしょうか?
以前にも書いて頂いたコードと比べたりしているのですが、違いなどがいまいちわかりません。
本当にお手数をお掛けしてもうしわけありませんが、よろしくお願いします。

あまり詳しくないのですが…

ike@九州 (2011-05-27 09:01:39 (金))

過去の記述サンプルからの応用ですので詳しい説明ではありませんが

現在のフォーム(ResultSet含む)オブジェクトを取得する方法に違いがありますね。
フォーム上に配置したコントロール(部品)のイベントにマクロを割り当てた場合には、そのイベントをオブジェクトとして受け取る事が出来るという事です。
Sub kousin(oEvent) oEventは任意名で必須

今回はそのイベント元の親がフォームなので
oForm = oEvent.Source.getParent

フォーム上の"cb_在籍"という名のコントロールを取得
oCtrmodel = oForm.getByName("cb_在籍")

"cb_在籍"コントロールはフォームのフィールドにリンクしているので、
そのデータフィールドが何列目に当たるか調べています。
nID = oForm.findColumn(oCtrModel.datafield)
nID では無く nColumn の方がわかり易かったですね
(コピペなのでおほほ)

"cb_在籍"チェックボックス OFF に該当する値 0 を、現在行の該当列に書き込みます
結果フォーム上で反映される
oForm.updateInt(nID,0)

http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FDialog%2FCheckBox
上記ではチェックボックスの状態の型は short になってましたので
正確には oform.updateShort(nID,0) とすべきのようです

イベントを割り当てていない場合にフォームを取得する場合は、一つの方法しか無いことになりますね。
ThisComponent は Writerコンポーネントになります
oForm = ThisComponent.getDrawpage.getForms.getByName("フォームの名前")

イベントを割り当てた場合にはフォームの取得に二つの方法が取れるという事になります。

そして大事なのが取得したフォームは、指定したソース元のデータを全て内包しています。
フォームのソース元がAテーブルであれば
SELECT * FROM "Aテーブル" の結果を内包しているという事です
しかも、見えない現在のデータ行カーソルが存在し
oForm.next など有効なので確認できます。

理解しているのは、この程度ですが…参考になりますでしょうか

大変参考になりました

urudakara (2011-05-29 22:15:41 (日))

ike@九州さんコメントありがとうございます。

大変参考になりました。
なかなかこの様に丁寧に説明してもらう機会がないので、有難いです。
これから少しづつ勉強したいと思います。
また分からない事が出てくると思うので、よろしくお願いします。
本当にありがとうございました。

今回はこれで完了にしたいと思います。

お名前:
題名:


添付ファイル: filesample.odb 459件 [詳細]