OOobbs3/16
質問
今日も感謝でついてる♪ 表の選択範囲の行列を知るすべが無いということで困っています。 仕方が無いので、すべてのセルを調べて、そのセルが選択されているかどうか確認できればよいのでは? と考えたのですが、そのセルが選択されているかどうかの情報を見つけることが出来ませんでした。 そのセルが選択されているかどうかを確認する方法は有りますか? 回答
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 も選択しているはずが選択範囲のセルアドレス表記に含まれていませんでした。変な風に分割、結合された表では選択中に見えている部分が取得できないかもしれません。
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
感想,コメント,メモ
|