Top > OOobbs2 > 132

** [[OOobbs2/132]] [#y4d6c685]
-''サマリ'': シートごとのセルカーソル
-''環境'': Calc
-''状態'': 未解決
-''状態'': 解決
-''投稿者'': [[七志乃権兵衛]]
-''投稿日'': 2008-08-27 (水) 01:26:08

*** 質問 [#yfafa4eb]
アクティブでないシートのセルカーソルの位置を変えることは出来るのでしょうか?
*** 回答 [#zf5a4126]
- セルカーソル・・・。表示されているカーソルは .uno:GoToCell コマンドで移動できますが、現在のシート以外の範囲を指定するとアクティブなシートも同時に変わってしまいます。select で選択しても同様です。

-- はにゃ? &new{2008-08-27 (水) 08:51:38};
- すいません、質問があいまいでした。 アクティブなシートを他に移して、また戻すと選択状態などは解除されていますが、アクティブなシートの変更前にカーソルがあった位置にセルカーソルがあります。 その、アクティブではない時に保持しているカーソル(?)位置を変更したいのです。 -- 七志乃権兵衛 &new{2008-08-28 (木) 00:44:41};
- やはり、アクティブでないシート上のカーソルを動かそうとするとアクティブシートまで変更されてしまいます。 -- はにゃ? &new{2008-08-28 (木) 01:01:58};
- コントローラで ViewData を restoreViewData すればうまくいくかもしれません。試したことがないのですが・・・。 -- はにゃ? &new{2008-08-28 (木) 01:05:47};
- restoreViewData で変更できるようです。ViewData を理解するにはソースコードを調べる必要があるのですが・・・。

次のコードを実行すると ViewData が取得できます。
 Sub viewdata_1
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  
  inputbox ,,oController.getViewData()
 End Sub

たとえば、ViewData は次のようになっています。シートが三つのとき。

 100/60/0;0;tw:270;0/0/0/0/0/0/2/0/0/0/0;; (1)
 100/60/0;0;tw:270;3/2/0/0/0/0/2/0/0/0/0;; (2)
 100/60/0;1;tw:270;3/2/0/0/0/0/2/0/0/0/0;1/7/0/0/0/0/2/0/0/0/0; (3)

+ 最初のシートのみ表示したことがある。カーソルは 0, 0
+ 同上。カーソルが 3, 2
+ 二番目のシートまで表示したことがある。二番目のシートのカーソルが 1, 7

0/0/0/0/0/0/2/0/0/0/0 は Column/Row/0/0/0/0/2/0/0/0/0 を指定します。

たとえば、次のようにすると二番目のシートのカーソルが 5, 7 に移動します。省略してある指定していないシートのカーソルは移動しません。
 oController.restoreViewData(_
    "100/60/0;1;tw:270;;5/7/0/0/0/0/2/0/0/0/0;")

-- はにゃ? &new{2008-08-28 (木) 01:57:29};
- 変更する必要のないシートの指定は削除したほうがいいんでしょうかねぇ・・・?

次のコードでは元の ViewData をいじってシートインデックス 0 のシート上のカーソルを 4, 3 に移動します。
 Sub viewdata_2
   oController = ThisComponent.getCurrentController()
   sData = oController.getViewData()
 
   sData = MakeViewData(sData, 0, 4, 3)
   oController.restoreViewData(sData)
 End Sub

 'returns ViewData to change the position of the cursor on the sheet
 'sViewData: taken from getViewData method
 'nSheetIndex: index of the sheet that you want to change the cursor
 'nColumnIndex, nRowIndex: new position of the cursor on the sheet
 
 Function MakeViewData( _
    sViewData As String, _
    nSheetIndex As Integer, _
    nColumnIndex As Long, nRowIndex As Long ) As String
  sData = Split(sViewData, ";")
  
  nSheetNum = 3 + nSheetIndex
  sSheetData = sData(nSheetNum)
  sSheetDesign = Split(sSheetData, "/")
  If UBound(sSheetDesign) > 0 Then
    sSheetDesign(0) = CStr(nColumnIndex)
    sSheetDesign(0) = CStr(nRowIndex)
    sSheetData = Join(sSheetDesign, "/")
  Else
    sSheetData = CStr(nColumnIndex) & "/" & CStr(nRowIndex) & "/0/0/0/0/2/0/0/0/0"
  End If
  
  Dim sNewData(UBound(sData)) As String
  For i = 0 To 2 step 1
    sNewData(i) = sData(i)
  Next
  sNewData(nSheetNum) = sSheetData
  
  MakeViewData = Join(sNewData, ";")
 End Function

追記: %%このままだと画面の分割や表示位置がリセットされてしまいます。あとで修正してみます。%%修正済み。

-- はにゃ? &new{2008-08-28 (木) 02:20:47};
- そもそも ViewData はドキュメントのカーソル位置などをドキュメントに/から保存、復元するためにあります。こういった用途で使用しているのは見たことがありません、というか使用しているのも見たことがありませんが。 -- はにゃ? &new{2008-08-28 (木) 02:30:49};
- 細かくありがとうございます。 そうですか、あまり使われない方法なのですね。 他の方法でできないか模索し、だめなようならこの方法を使わせていだだきます。 -- 七志乃権兵衛 &new{2008-08-29 (金) 18:09:21};

#comment
*** 感想,コメント,メモ [#q1669e39]
- ViewData メモ。2.4.1。3 系では変更されている?

前半

 1/2/3;4;5:6

+ 表示倍率。2.4.1 ではシートごとに倍率が設定できない
+ 2
+ 3
+ アクティブシートインデックス
+ 5
+ Horizontal Scrollbar の左位置

シートごと

 1/2/3/4/5/6/7/8/9/10/11

+ カーソルの Column
+ カーソルの Row
+ 横方向での区切り。1: 普通。2: Freeze
+ 縦方向での区切り。1: 普通。2: Freeze
+ 横方向での区切り位置
+ 縦方向での区切り位置
+ 7
+ 左右区切り時には左の表示開始 Column インデックス
+ 左右表示区切り時の右側の表示開始 Column インデックス
+ 上下区切り時の上段の表示開始 Row インデックス
+ 上下区切り時には下段の表示開始 Row インデックス

//横方向表示区切り時の左側の最左部での表示 Column インデックス

-- はにゃ? &new{2008-08-28 (木) 02:33:57};

#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