Top > OOobbs3 > 16
** [[OOobbs3/16]] [#h03c9f16]
-''サマリ'': 表のセルが選択されているかどうか?
-''環境'': Writer
-''状態'': 解決
-''投稿者'': [[robbieprise]]
-''投稿日'': 2010-08-16 (月) 17:15:55
*** 質問 [#pf32c1e6]
今日も感謝でついてる♪

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

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

そのセルが選択されているかどうかを確認する方法は有りますか?
*** 回答 [#v636e832]
- 前の投稿のときになにを書いたか忘れましたが、セルが分割、結合されていなければ次のようにすれば選択されているセル範囲のデータを配列として取得できます。

 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 も選択しているはずが選択範囲のセルアドレス表記に含まれていませんでした。変な風に分割、結合された表では選択中に見えている部分が取得できないかもしれません。

-- はにゃ? &new{2010-08-16 (月) 18:34:27};
- 回答感謝します。選択された部分セルの内容を取得したいのではなくて、セルをひとつずつ調べていってそのセルが選択されているか判断することは出来ませんか? -- ハリ・セルダン &new{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

-- はにゃ? &new{2010-08-20 (金) 13:45:48};
- 回答感謝します。 -- ハリ・セルダン &new{2010-08-23 (月) 17:25:13};

#comment
*** 感想,コメント,メモ [#fba9baaf]

#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