Top > OOobbs > 52

OOobbs/52 Edit

  • サマリ: ボタンから起動したマクロを終了後、フォーカスを元に戻したい。
  • 環境: Calc
  • 状態: 解決
  • 投稿者: ジュビー?
  • 投稿日: 2005-03-14 (月) 04:49:10

質問 Edit

「マクロプログラムを割り当てたCalcドキュメント上のボタン」をクリックしてマクロを実行すると、そのマクロが正常終了した後もボタンがフォーカスされたままになってしまい、引き続いてシート上のアクティブに見えるセルに何かを入力しようと、キーボードをタイプし、"Enter"を押すと、再びマクロが実行されてしまいます。この現象は、ヒューマンエラーを引起す温床になる等、とても不便です。Basic的に解決できませんか?

前提とする情報 Edit

ここ(OOoBasic/Generic/form)にある様に、ボタンのイベント属性の"作動時"にマクロを割り当てる事で、ドキュメント上に配置したボタンにマクロプログラムを割り当てる事が出来ます。

ところで、実際にボタンをクリックして作動させてみると、ボタンが、"ボタンの文字の回りが破線で囲われた状態(フォーカスされた状態)"となります。この状態は、割り当てられたプログラムが正常に終了した後も継続してしまいます。

もし、マクロの終了に引き続き、その時アクティブに見えるセルに何かを入力しようとすると、普通、そのままキーボードをタイプし、"Enter"を押したくなります。しかし、そうしようとすると、"Enter"を押した際にセルに入力がなされる代わりに、実際にはフォーカスされたままのボタンが、再び作動してしまいます。

このため、ドキュメント利用者が、「セルに入力できなくなった」「意図しないのにマクロが起動して困る」と感じる事になります。

これでは画竜点睛を欠くばかりか、マクロによっては、ドキュメント利用者が訳が判らないままにマクロの起動を繰り返す事でドキュメントを崩壊させてしまう事があり、何とかしたいところです。

暫定的な対策 Edit

  • ボタンを押す副作用として、ボタンがフォーカスされるので、ボタンを押した後は、例えアクティブに見えるセルでも必ずマウスで一度クリックしてフォーカスを得てから入力するように周知徹底する。
    • ヒューマンエラーの対策としては全く不充分です。「アクティブに見えるセルに入力するには、キーボードを打ち、"Enter"を押す。」という手順は、表計算ソフト利用者の常識であるため、いくら周知をしてようとしても、徹底は困難です。
  • ボタンにマクロを割り当てる時に、イベント属性の"作動時"に割り当てるのではなく、"マウスボタンから離れた時"に割り当てる。
    • これは、雑談掲示板河井?さんから教えて頂いた方法ですが、キーボードの"Enter"を押す時に"作動時"のイベントが発生するので、"Enter"が押された時はボタンを空打ちさせるようにして、マウスでクリックした時にのみマクロ起動するようにする。という方法です。
      この方法で不時作動は防止できますが、ドキュメント利用者が、「セルに入力できなくなった」様に感じる問題は解決できません。

回答 Edit

この問題を解決するためには,フォーカスをドキュメントのウィンドウ側へ戻してやる必要があります。

フォームのボタンへ次のコードを割り当てて実行してみます。

Sub Main
Dim oDoc As Object
Dim oController As Object
Dim oFrame As Object
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oFrame = oController.getFrame()
  oFrame.ComponentWindow.setFocus()
End Sub

マクロの実行が終了してもボタンの文字が点線で囲まれておらず,フォーカスがボタンにありません。このまま Enter キーを入力してもマクロが実行されることはありません。

ComponentWindowsetFocus メソッドでドキュメントのウィンドウへフォーカスを持ってくることができるようです。

フォーム上のボタンをクリックさせてマクロを実行させるあとで,次の動作をキーボードから行うときには上記のマクロを組み込むことでフォーカスがウィンドウの方に戻されます。

感想・コメント・メモ Edit

  • 雑談掲示板の方から、ページを建て?させていただきました。
    一応回答は頂いておりますが、改めて、よろしくお願いします。 -- ジュビー? 2005-03-14 (月) 05:10:11


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes