Top > OOobbs2 > 1
  • The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
  • Go to OOobbs2/1.

** [[OOobbs2/1]] [#wecf89c5]
-''サマリ'': 選択セルが変更されたときマクロを起動する方法。 
-''環境'': Calc 
-''状態'': 未解決 
-''投稿者'': [[ゆうこ]] 
-''投稿日'': 2006-10-01 (日) 15:45:27 

*** 質問 [#p84de463]
Excel & VBA ではよく使っているのですが、OOo Basic での実現方法がわかりません。ご教授いただけると幸いです。

Excel の場合のソース。

 Private Sub Worksheet_Activate()
   Application.MoveAfterReturnDirection = xlToRight
 End Sub

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  tr = Target.Row
  tc = Target.Column
  
  If tc = 3 Then
    Cells(tr+1, 1).Select
  End If

 End Sub

これをワークシートのモジュールにコーディングしています。

ワークシートを選択した際に、エンターキーを押したときの移動設定を右になります。
3列目にカーソルがくると次の行の1列目にカーソルが移動します。

データをぱたぱた入力する際にとても便利です。
いろんなところを調べたのですが、
どうやってOOo Basic で記述するのか全くわかりません。
イベントリスナを使うのでしょうか?
*** 回答 [#k77845f1]
- 一つ目の、移動方向の変更はこんな感じでしょうか。


まず、アクティブシートが変更されたときに呼び出されるリスナーを追加してやる必要があります。com.sun.star.sheet.XActivationEventListener を使用します。Add_isActiveListener() を実行します。リスナーが要らなくなったときに削除するように Remove_isActiveListener() を用意しておきました。

リスナーは Global 変数に保持しないと、リスナーを追加した後で一度 Sub を抜けてしまった場合に削除できなくなります。そのときには一度ドキュメントを閉じればリスナーがなくなります。

あとは、リスナーのためのプロシージャを用意しておきます。

 Global oActiveSheetChangeListener As Object
 Public oController As Object
 
 
 Sub Add_isActiveListener()
   oController = ThisComponent.CurrentController
   oActiveSheetChangeListener = CreateUnoListener( _
       "ActiveSheetChange_", _
       "com.sun.star.sheet.XActivationEventListener")
   oController.addActivationEventListener( _
       oActiveSheetChangeListener )
 End Sub
 
 
 Sub Remove_isActiveListener()
   oController = ThisComponent.CurrentController
   oController.removeActivationEventListener( _
       oActiveSheetChangeListener )
 End Sub
 
 
 Sub ActiveSheetChange_activeSpreadsheetChanged( evt )
   change_movedirection()
 End Sub
 
 Sub ActiveSheetChange_disposing( evt )
 
 End Sub
 
 Sub change_movedirection
 Dim oGSheetSettings As Object
   oGSheetSettings = CreateUnoService( _
       "com.sun.star.sheet.GlobalSheetSettings")
   oGSheetSettings.MoveDirection = _
       com.sun.star.sheet.MoveDirection.RIGHT
 End Sub

Enter キーを押したときの入力範囲の移動方向は、ツールメニューのオプション - OpenOffice.org Calc - 全般 - Enter キーを押して選択方向に入力範囲を移動のところで変更できるプロパティーを change_movedirection で変更します。このようにして変更した場合、OpenOffice.org Calc 自体の設定が変更されてしまいます。

-二つ目の、セルのカーソルが列 C になったときに次の行の列 A に移動する方法です。

ここでもやはりリスナーを追加してやります。選択範囲の変更を検出するリスナー com.sun.star.view.XSelectionChangeListener を使用します。

 Global oSelectionChangeListener As Object
 Public oController As Object
 
 Sub Add_SelectionChangeListener()
   oController = ThisComponent.CurrentController
   oSelectionChangeListener = CreateUnoListener( _
       "SelectionChange_", _
       "com.sun.star.view.XSelectionChangeListener" )
   oController.addSelectionChangeListener( _
       oSelectionChangeListener )
 End Sub
 
 
 Sub Remove_SelectionChangeListener()
   oController = ThisComponent.CurrentController
   oController.removeSelectionChangeListener( _
       oSelectionChangeListener )
 End Sub
 
 
 Sub SelectionChange_selectionChanged( evt )
   obj = evt.Source.Selection
   If obj.ImplementationName = "ScCellObj" Then
     tr = obj.CellAddress.Row
     tc = obj.CellAddress.Column
     If tc = 2 Then
       ThisComponent.CurrentController.select( _
           obj.SpreadSheet.getCellByPosition( 0, tr+1 ) )
       oFrame = ThisComponent.CurrentController.getFrame()
       executeCommand( ".uno:Deselect", oFrame )
     End If
   End If
 End Sub
 
 
 Sub SelectionChange_disposing(  )
 
 End Sub
 
 
 Sub executeCommand( sCommand As String, oFrame As Object )
 Dim aArr(0) As New com.sun.star.beans.PropertyValue
 Dim oDispatch As Object
   oDispatch = CreateUnoService( _
       "com.sun.star.frame.DispatchHelper")
   oDispatch.executeDispatch( _
       oFrame, sCommand, "", 0, aArr())
 End Sub

選択範囲が変更されたときに呼び出される SelectionChange_selectionChanged で処理を行います。選択されたのが選択範囲や図形描写オブジェクトでないかどうかを調べておきます。単一セルオブジェクトの ''ImplementationName'' が "ScCellObj" であることを利用しています。

-OOo Calc のセルのインデックスは 0 から始まるの
-getCellByPosition メソッドの引数は列、行の順

続く処理は順に、

セルを ''select'' メソッドで選択状態にします。セルの範囲カーソルを移動させるにはこの方法を使用します。セルの範囲をマウスで選択したような黒く選択されます。

セルが選択状態では不都合なので、セルの選択状態を解除しておきます。セルの選択状態を解除するには、.uno:Deselect コマンドで行います。

[[リスナー>OOoBasic/Generic/listener]]、[[Enter を押したときの移動方向>OOoBasic/Calc/settings]]、[[セルの選択>OOoBasic/Calc/selection]]、[[コマンド>OOoBasic/Generic/command]]

一応、作成したファイルを添付しておきます。&ref(OOobbs2-1.ods);

-- [[はにゃ?]] &new{2006-10-01 (日) 21:02:23};
- ".uno.GoToCell" を使うとセルを選択状態にしなくてもセルカーソルの移動ができるようです。移動セルの位置を文字列で与える必要があり面倒です。 -- [[はにゃ?]] &new{2006-10-01 (日) 22:39:59};

-".uno.GoToCell" を使ってみました。

 Sub SelectionChange_selectionChanged( evt )
   obj = evt.Source.Selection
   If obj.ImplementationName = "ScCellObj" Then
   tr = obj.CellAddress.Row
   tc = obj.CellAddress.Column
   If tc = 2 Then
     oCell = obj.SpreadSheet.getCellByPosition( 0, tr+1 )
     oCellRangeAddress = ThisComponent.createInstance( _
         "com.sun.star.sheet.SheetCellRanges" )
     oCellRangeAddress.insertByName( "cell", oCell )
     sCellName = oCellRangeAddress.getRangeAddressesAsString()
     
     Dim aArr(0) As New com.sun.star.beans.PropertyValue
     aArr(0).Name = "ToPoint"
     aArr(0).Value = GetCellName( sCellName )
     
     oFrame = ThisComponent.CurrentController.getFrame()
     executeCommand( ".uno:GoToCell", oFrame, aArr() )
   End If
 End If
 End Sub
 
 
 Sub executeCommand( _
     sCommand As String, oFrame As Object, aArg )
 Dim oDispatch As Object
   oDispatch = CreateUnoService( _
       "com.sun.star.frame.DispatchHelper")
   oDispatch.executeDispatch( _
       oFrame, sCommand, "", 0, aArg())
 End Sub
 
 
 Function GetCellName( sRange As String ) As String
   nCom = InStr( sRange, "." )
   If nCom > 0 Then
     GetCellName = Mid( sRange, nCom +1 )
   Else
     GetCellName = sRange
   End If
 End Function

-- [[はにゃ?]] &new{2006-10-01 (日) 23:03:53};

#comment
*** 感想,コメント,メモ [#z81007eb]

#comment

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