Top > OOobbs2 > 132

OOobbs2/132 Edit

  • サマリ: シートごとのセルカーソル
  • 環境: Calc
  • 状態: 解決
  • 投稿者: 七志乃権兵衛?
  • 投稿日: 2008-08-27 (水) 01:26:08

質問 Edit

アクティブでないシートのセルカーソルの位置を変えることは出来るのでしょうか?

回答 Edit

  • セルカーソル・・・。表示されているカーソルは .uno:GoToCell コマンドで移動できますが、現在のシート以外の範囲を指定するとアクティブなシートも同時に変わってしまいます。select で選択しても同様です。
  • はにゃ? 2008-08-27 (水) 08:51:38
  • すいません、質問があいまいでした。 アクティブなシートを他に移して、また戻すと選択状態などは解除されていますが、アクティブなシートの変更前にカーソルがあった位置にセルカーソルがあります。 その、アクティブではない時に保持しているカーソル(?)位置を変更したいのです。 -- 七志乃権兵衛 2008-08-28 (木) 00:44:41
  • やはり、アクティブでないシート上のカーソルを動かそうとするとアクティブシートまで変更されてしまいます。 -- はにゃ? 2008-08-28 (木) 01:01:58
  • コントローラで ViewData を restoreViewData すればうまくいくかもしれません。試したことがないのですが・・・。 -- はにゃ? 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)
  1. 最初のシートのみ表示したことがある。カーソルは 0, 0
  2. 同上。カーソルが 3, 2
  3. 二番目のシートまで表示したことがある。二番目のシートのカーソルが 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;")
  • はにゃ? 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

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

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

感想,コメント,メモ Edit

  • ViewData メモ。2.4.1。3 系では変更されている?

前半

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

シートごと

1/2/3/4/5/6/7/8/9/10/11
  1. カーソルの Column
  2. カーソルの Row
  3. 横方向での区切り。1: 普通。2: Freeze
  4. 縦方向での区切り。1: 普通。2: Freeze
  5. 横方向での区切り位置
  6. 縦方向での区切り位置
  7. 7
  8. 左右区切り時には左の表示開始 Column インデックス
  9. 左右表示区切り時の右側の表示開始 Column インデックス
  10. 上下区切り時の上段の表示開始 Row インデックス
  11. 上下区切り時には下段の表示開始 Row インデックス
  • はにゃ? 2008-08-28 (木) 02:33:57


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