Top > OOobbs > 88

OOobbs/88 Edit

  • サマリ: calcのセルをダブルクリックでマクロを走らせる方法
  • 環境: Calc
  • 状態: 解決
  • 投稿者: Kuma?
  • 投稿日: 2006-01-07 (土) 22:46:11

質問 Edit

OOo2.0.0のcalcで、シート上の任意のセル(例えばセル[D5])をマウスでダブルクリックした時に、クリックしたセルの列番号j=3、行番号i=4、を表示する下記の様なマクロをつくりたいのですが、

Sub DBL_click()

 MsgBox "列="+Str(j) + " 行="+Str(i)
 セルに{ESC}信号送信

End Sub

(1)ダブルクリックイベントを発生させる方法
(2)クリックしたセルの列/行番号をピックアップする方法。
(3)セルをダブルクリックすると、セルの編集モードに入ってしまうので、それをマクロから{ESC}信号を発生させて編集モード解除する方法。
をご教示頂きたく宜しくお願い致します。

追伸:上記お尋ねの内、(2)の『クリックしたセルの列/行番号を取得する方法』は、この掲示板過去記事から下記のマクロで出来ることが分かりましたので、(1)と(3)についてお教え下さい。

Sub Cell_Row

 Dim oSelection As Object
 oSelection=ThisComponent.CurrentController.Selection
 i=oSelection.CellAddress.Row
 j=oSelection.CellAddress.Column

End Sub

回答 Edit

  • 自己レスです。こちらの過去記事から、MouseClickHandlerを使うとマウスイベントを組み込めるとの例が出ているのを見ました。 それを参考にさせて頂き、セル[A1:B4]のエリアでマウスをクリックした時にクリックしたセルに『OK』を記入する下記の様なマクロを構成してみました。 最初に『Sub init』をRunしてからワークシートのセルをクリックする様にします。
global oMouseClickHandler As Object
global oController as Object
global oSheet as Object

Sub init

 oSheet=ThisComponent.Sheets(0)
 oController =ThisComponent.getCurrentController()
 oMouseClickHandler = CreateUnoListener("Ms_","com.sun.star.awt.XMouseClickHandler")
 call Main

End Sub

Sub Main

 oController.addMouseClickHandler(oMouseClickHandler)

End Sub

Sub Ms_mousePressed(oEvent)

 oSelection=oController.Selection
 rw=oSelection.CellAddress.Row
 col=oSelection.CellAddress.Column
 if rw>=0 and rw<=3 then
   if col>=0 and col<=1 then
     oCell=oSheet.getCellByPosition(col,rw)
     oCell.setString("ok")
   end if     
 end if
 call Main

End Sub

この結果、アクティブなセルが[A1:B4]エリア内にある状態で、そのエリア内のセルを初回にクリックした時だけ、OKの文字をセルに記入する事に成功(ただし、クリックして移動したセルではなく、その直前にアクティブだったセルに記入されてしまう)したのですが、続く2回目のクリックからは反応が有りません。

また、初回に[A1:B4]エリアの外でクリックした後、そのエリア内でクリックしても反応が有りません。

私としては『Sub Ms_mousePressed(oEvent)』関数の中の最後に、『Main』関数を呼び出す事で、『Main』関数の中の『oController.addMouseClickHandler(oMouseClickHandler)』を継続動作させ、何度クリックしても反応が続くように様にしたつもりだったのですが、1回しかイベントハンドラが機能してくれません。

どの様にすれば良いのかお分かりになりましたらお教えください。宜しくお願いいたします。-- Kuma? 2006-01-12 (木) 22:18:32

  • 遅レスですが回答します。

2回目の反応がない件については、ハンドラでの戻り値が設定されていないことが原因のようです。

MouseClickHandler ではmousePressed(),mouseReleased()の戻り値にはBooleanを返すようにします。

以下にサンプルを示します。

Global xMouseHdlr As Object
Global oNULL As Object

'---SpreadSheetViewにマウスクリックハンドラを登録
 Sub Register
       oController = ThisComponent.getCurrentController
       xMouseHdlr = CreateUnoListener _
               ("Ms_","com.sun.star.awt.XMouseClickHandler")
       oController.addMouseClickHandler (xMouseHdlr)
End Sub

'---マウスクリックハンドラを削除
Sub unRegister ( )
       ThisComponent.getCurrentController.removeMouseClickHandler (xMouseHdlr)
       xMouseHdlr = oNULL
end Sub
'---A1からB4までのセルをダブルクリックした場合"ok"と表示
Sub Ms_mousePressed (oEvent) As Boolean
       If oEvent.ClickCount >= 2 Then
               oSelection = ThisComponent.getCurrentController ( ).getSelection ( )
               If oSelection.SupportsService ("com.sun.star.sheet.SheetCell") Then
                       addr = oSelection.CellAddress
                       If (addr.Sheet=0) And (addr.Column<=1) And (addr.Row<=3) Then
                               oSelection.setString("ok")
                               Ms_mousePressed = True
                               Exit Sub    
                       Endif     
               Endif
       Endif
       Ms_mousePressed = False
End Sub

上記の例では、特定セルをダブルクリック以上した時のみ True を返しています。これにより本来の View の動作( Cell を編集モードにする)を抑止できるようです。

Sub Ms_mouseReleased (oEvent) As Boolean
       Ms_mouseReleased = False
End Sub

Sub Ms_disposing ( )
End Sub

mouseReleased()の方は False を返すようにしています。

残念ながら、動かしてみると反応がよくありません。シングルクリック仕様で作成されることをお勧めします。

EnhancedMouseClickHandlerを使うと、セルが選択される前にセル位置を取得することができて便利ですよ。-- Harada? 2006-07-28 (金) 23:22:48

  • Haradaさん、ご回答有難うございます。 -- Kuma? 2006-08-22 (火) 11:50:27

回答が来ているとは思わず、掲示板をしばらく見過ごしていました。お礼が遅くなって申し訳ありません。早速教えて頂いたコードを実行しましたら結果は完璧でした。本当に有難うございました。



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