Top > OOobbs2 > 1

OOobbs2/1 Edit

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

質問 Edit

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 で記述するのか全くわかりません。 イベントリスナを使うのでしょうか?

回答 Edit

  • 一つ目の、移動方向の変更はこんな感じでしょうか。

まず、アクティブシートが変更されたときに呼び出されるリスナーを追加してやる必要があります。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 コマンドで行います。

リスナーEnter を押したときの移動方向セルの選択コマンド?

一応、作成したファイルを添付しておきます。fileOOobbs2-1.ods

  • はにゃ?? 2006-10-01 (日) 21:02:23
  • ".uno.GoToCell" を使うとセルを選択状態にしなくてもセルカーソルの移動ができるようです。移動セルの位置を文字列で与える必要があり面倒です。 -- はにゃ?? 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
  • はにゃ?? 2006-10-01 (日) 23:03:53

感想,コメント,メモ Edit



Attach file: fileOOobbs2-1.ods 1060 download [Information]

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