** [[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 |