Top > OOobbs > 101

OOobbs/101 Edit

  • サマリ: 何も入力されていないセルの検索
  • 環境: Calc
  • 状態: 解決
  • 投稿者: suou?
  • 投稿日: 2006-06-03 (土) 14:12:37

質問 Edit

大変お世話になっております。 さて、検索において、SearchString="K"のように指定して"K"が入力されているセルを探すことはできます。逆に何も入力されていないセルを検索したうえで、何かが入力されているセルの値を調べる方法がないかと思っています。

dim oFound as object
Set aController = ThisComponent.CurrentController
Set oSheets = ThisComponent.Sheets
Set WkBK = oSheets.getByName("BK")
Set oSearchDesc = WkBK.createSearchDescriptor()
Set oSRange = WkBK.getCellRangeByPosition(2, 0, 2, 39)
oSearchDesc.SearchWords = true
oSearchDesc.SearchString = ""
oSearchDesc.SearchBackwards = False
Set oFound = oSRange.findAll(oSearchDesc)

のようにSearchString=""とすると、IsNull(oFound)はtrueとなってしまいうまくいきません。またSearchString=Nullとするとエラーになってしまいます。何か方法があれば教えてください。

回答 Edit

  • 検索で判断する方法はありませんが,個別のセルの内容が空かどうかは判断できます。 OOoBasic/Calc/contenttype
    • はにゃ?? 2006-08-19 (土) 18:22:55
  • haradaです。いつも参考にさせていただいております。 いくつか試してみましたので追加情報として書いておきます。
  • 空セルをまとめて処理したい場合は CellRange.queryEmptyCells ( ) というメソッドも使えるようです。
Sub paintEmptyCellDemo1
       oSheet = ThisComponent.Sheets.getByName("表1")
       '-- セル領域を取得
       oRange = oSheet.getCellRangeByPosition (2, 0, 2, 39)        
       '-- 未入力セル領域の取得
       oEmptyRanges = oRange.queryEmptyCells ( )
       '-- セル領域が得られなかったら終了
       If oEmptyRanges.Count = 0 Then
               Exit Sub
       Endif
       '-- セル背景色を灰色に
       oEmptyRanges.CellBackColor = &HCCCCCC
End Sub
  • 上のメソッドではスペース・改行などの空白文字が入力されたセルは取れません。 そこで、空白以外の文字が入力されたセルを検索した後、領域を反転させるというのをやってみました。
'--未入力&空白文字のセルを集めて返す
Sub collectBlancRanges (oRanges)
       '-- (1) 空白文字以外の文字が入力されたセルを取得する
       oSearchDesc = oRanges.createSearchDescriptor
       oSearchDesc.SearchRegularExpression = true
       oSearchDesc.SearchString = "[^ \t\x000d\x000a\x3000]+"  '-- スペース・タブ・CR・LF・全角スペース以外
       oCharacterRanges = oRanges.findAll(oSearchDesc)
       If IsNull (oCharacterRanges) Then
               Exit Sub
       Endif
       '-- (2) (1)の反転領域を得る
       oRanges.removeRangeAddresses (oCharacterRanges.getRangeAddresses)
End Sub

このような反転操作を行うためには、SheetCellRange ではなく SheetCellRanges オブジェクトが必要となります。

'-- セル領域のコレクションを取得
Function getCellRangesByPosition (oSheet, startcol, startrow, endcol, endrow) As Object
       Dim oAddress As New com.sun.star.table.CellRangeAddress
       oAddress.Sheet = oSheet.getRangeAddress.Sheet
       oAddress.StartColumn = startcol
       oAddress.StartRow = startrow
       oAddress.EndColumn = endcol
       oAddress.EndRow = endrow
       '-- 重なった領域を得る
       getCellRangesByPosition = oSheet.queryIntersection (oAddress)
End Function

動作確認用のサンプルです。

Sub paintEmptyCellDemo2
       oSheet = ThisComponent.Sheets.getByName("表1")
       '-- セル領域のコレクションを取得
       oRanges = getCellRangesByPosition (oSheet, 2, 0, 2, 39)        
       '-- セル領域の絞り込み 条件:空白セル
       collectBlancRanges (oRanges)
       '-- セル領域が得られなかったら終了
       If oRanges.Count = 0 Then
               Exit Sub
       Endif
       '-- セル背景色を灰色に
       oRanges.CellBackColor = &HCCCCCC
       Exit Sub
End Sub
  • harada? 2006-08-23 (水) 20:24:56
  • 遅くなり申し訳ございません。素晴らしいサンプルをありがとうございました。解決しました。 -- suou? 2006-12-24 (日) 17:34:05


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