- 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