Top > OOobbs3 > 16

OOobbs3/16 Edit

  • サマリ: 表のセルが選択されているかどうか?
  • 環境: Writer
  • 状態: 解決
  • 投稿者: robbieprise?
  • 投稿日: 2010-08-16 (月) 17:15:55

質問 Edit

今日も感謝でついてる♪

表の選択範囲の行列を知るすべが無いということで困っています。

仕方が無いので、すべてのセルを調べて、そのセルが選択されているかどうか確認できればよいのでは? と考えたのですが、そのセルが選択されているかどうかの情報を見つけることが出来ませんでした。

そのセルが選択されているかどうかを確認する方法は有りますか?

回答 Edit

  • 前の投稿のときになにを書いたか忘れましたが、セルが分割、結合されていなければ次のようにすれば選択されているセル範囲のデータを配列として取得できます。
Sub GetSelectedDataFromTable
 oDoc = ThisComponent
 oController = oDoc.getCurrentController()
 oViewCursor = oController.getViewCursor()
 oSelection = oDoc.getCurrentSelection()
 
 Dim vData() As Variant
 
 If oSelection.supportsService("com.sun.star.text.TextTableCursor") Then
   sRangeName = oSelection.getRangeName()
   oTable = oViewCursor.TextTable
   
   If InStr(sRangeName, ":") = 0 Then
     oSelectedRange = oTable.getCellByName(sRangeName)
     ReDim vData(0, 0)
     If oSelectedRange.getType() = com.sun.star.table.CellContentType.EMPTY Then
       vData(0, 0) = ""
     ElseIf oSelectedRange.getType() = com.sun.star.table.CellContentType.TEXT Then
       vData(0, 0) = oSelectedRange.getString()
     ElseIf oSelectedRange.getType() = com.sun.star.table.CellContentType.VALUE Then
       vData(0, 0) = oSelectedRange.getValue()
     ElseIf oSelectedRange.getType() = com.sun.star.table.CellContentType.FORMULA Then
       vData(0, 0) = oSelectedRange.getFormula() '?
     End If
   Else
     oSelectedRange = oTable.getCellRangeByName(sRangeName)
     vData = oSelectedRange.getDataArray()
   End If
 End If
End Sub

選択セルが一つのときに何を取得するか…。

前のページの例示した表を選択して試してみました。D1 も選択しているはずが選択範囲のセルアドレス表記に含まれていませんでした。変な風に分割、結合された表では選択中に見えている部分が取得できないかもしれません。

  • はにゃ? 2010-08-16 (月) 18:34:27
  • 回答感謝します。選択された部分セルの内容を取得したいのではなくて、セルをひとつずつ調べていってそのセルが選択されているか判断することは出来ませんか? -- ハリ・セルダン 2010-08-20 (金) 09:58:01
  • 選択された範囲オブジェクトから getCellRangeByName メソッドでサブセルを取得しようとするとエラーしか出ませんね。というわけで、セルの範囲アドレスをインデックスに変換して getCellByPosition としないといけません。素直に選択されたセル範囲のアドレスをインデックスに変換した方がいいと思います。以下の関数は適当にセル範囲名またはセル名を範囲アドレスに変換します。
Function GetCellRangeAddress(sAddr As String) As com.sun.star.table.CellRangeAddress
 aAddr = CreateUnoStruct("com.sun.star.table.CellRangeAddress")
 If InStr(sAddr, ":") = 0 Then
   
 Else
   sParts = Split(sAddr, ":")
   If UBound(sParts) <= 1 Then
     aRange1 = CellNameToAddr(sParts(0))
     aRange2 = CellNameToAddr(sParts(1))
     aAddr.StartColumn = aRange1.Column
     aAddr.EndColumn = aRange2.Column
     aAddr.StartRow = aRange1.Row
     aAddr.EndRow = aRange2.Row
   End If
 End If
 GetCellRangeAddress = aAddr
End Function


Function CellNameToAddr(sCellAddr As String) As com.sun.star.table.CellAddress
 aAddr = CreateUnoStruct("com.sun.star.table.CellAddress")
 
 nRow = 0
 nColumn = 0
 n = 0
 For i = 0 To Len(sCellAddr) - 1 step 1
   n = Asc(Mid(sCellAddr, i + 1, 1))
   If &H41 <= n AND n <= &H5A Then
     nColumn = nColumn * 24 + (n - &H41)
   ElseIf &H30 <= n AND n <= &H39 Then
     nRow = nRow * 10 + (n - &H30)
   End If
 Next
 
 aAddr.Column = nColumn
 aAddr.Row = nRow -1
 CellNameToAddr = aAddr
End Function

選択範囲のセル範囲アドレスを GetCellRangeAddress で変換、個別のセルを CellNameToAddr で変換します。

表にある全てのセルを一つずつチェックするにはテーブルカーソルを利用します。

Sub CheckAllCells()
 oDoc = ThisComponent
 oController = oDoc.getCurrentController()
 oViewCursor = oController.getViewCursor()
 oSelection = oDoc.getCurrentSelection()
 
 If oSelection.supportsService("com.sun.star.text.TextTableCursor") Then
   oDoc.lockControllers()
   oTable = oViewCursor.TextTable
   sRangeName = oSelection.getRangeName()
   
   aAddr = GetCellRangeAddress(sRangeName)
   
   oCursor = oTable.createCursorByCellName("A1")
   bInCol = True
   sCellName = ""
   While bInCol
       sCellName = oCursor.RangeName
       aCellAddr = CellNameToAddr(sCellName)
       If aAddr.StartColumn <= aCellAddr.Column AND aCellAddr.Column <= aAddr.EndColumn AND _
          aAddr.StartRow <= aCellAddr.Row AND aCellAddr.Row <= aAddr.EndRow Then
         oCursor.BackColor = RGB(255, 0, 0)
       Else
         oCursor.BackColor = -1
       End If
       bInCol = oCursor.goRight(1, False)
   WEnd
   oDoc.unlockControllers()
 End If
End Sub
  • はにゃ? 2010-08-20 (金) 13:45:48
  • 回答感謝します。 -- ハリ・セルダン 2010-08-23 (月) 17:25:13

感想,コメント,メモ Edit



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