Top > OOobbs > 26

OOobbs/26

  • サマリ: Calc/セル範囲/検索のfindNext(oFound.End, oSearchDesc)の使い方
  • 環境: Calc
  • 状態: 解決
  • 投稿者: suou?
  • 投稿日: 2004-06-19 (土) 12:43:44

質問

サンプル・プログラムの「Sub search_2」のSearchStringを変えて実行してみると、findFirstは旨くいきました。しかし、さらにいくつも該当項目があるのに、findNextを実行するとIsNull(oFound)がTrueになってしまい、次が探せません。但し、文書ドキュメントでサンプルプログラムを実行すると実際、findNextは次々と該当SearchStringを探していきます。Calcで旨くいかないのはなぜでしょう?

このfindNext(.uno.XInterface xStartAt, .util.XSearchDescriptor xDesc)の第一パラメータとして用いられているoFound.Endとはどのような意味ですか?また、その他にxStartAtに入れられる値にはどんなものがあり、それぞれどんな意味をもつのでしょうか?教えていただければうれしいです。

回答

  • 質問者のsuouです。お世話になります。findNextがなぜ使えないのか分かりませんので別の方法を考えてみました。次のように(oSeachDescは別途定義済みとして)、

?findAllを使ってoFoundsを取得した後、 ?oFoundsがXIndexAccessであることを利用してoFounds(i)で該当セル又は該当セル範囲にアクセスします。 ?その行番号をoFounds(i).RangeAddress.StartRowにより取得し、 ?例えば、その該当行の16列目の数字を加算していくようなことができます。

 dim oFounds as object
 dim iCount as integer, xRow as integer, iValue as long
 oFounds = oCellRange.findAll(oSearchDesc)
 iCount=oFounds.getCount()
 iValue=0
 For i = 0 to iCount - 1
	xRow = oFounds(i).RangeAddress.StartRow
	Do while xRow<=oFounds(i).RangeAddress.EndRow
		iValue = iValue + oSheet.getCellByPosition(15, xRow).Value
		xRow = xRow + 1
	Loop
 Next i
 msgbox iValue

oFounds(i).RangeAddress.StartRowとEndRowのくだりは、oFounds(i).CellAddress.Rowでもセル範囲が単一セルの場合は旨くいきますが、複数セルが固まっている場合はエラーとなり使えないための迂回策です。

以上の方法により、findNextを使ったと同じことになると思いますが、でも、やはり、findNextが使えれば、その方がスマートですよね。どれだけのスピードで実行してくれるかもまだ未テストです。やはり、findNextが使えるようになりたいです。はにゃ先生、よろしくお願いします。

  • suou? 2004-06-20 (日) 10:22:43
  • findNext の最初の引数の指定が間違っていました。ごめんなさい。ページの方は修正しておきました。

Calc の場合には, findNext メソッドの最初の引数は「セルオブジェクト」を指定するようです。また,次の検索を行うための開始セル位置になります。(指定した次のセルからのようです)

ということで,例の部分を修正すると次のようになります。

Sub search_2
Dim oDoc As Object, oSheet As Object
Dim oSearchDesc As Object, oFound As Object

  oDoc = ThisComponent
  oSheet = oDoc.Sheets(0)
  oSearchDesc = oSheet.createSearchDescriptor()
  oSearchDesc.SearchString = "find"
  oFound = oSheet.findFirst(oSearchDesc)
  'MsgBox oFound.ImplementationName
  Do While NOT IsNull(oFound)
    MsgBox oFound.CellAddress.Row
    oFound = oSheet.findNext(oFound, oSearchDesc) '<-
  Loop
End Sub

今度のは試してみたので,うまくいくと思います。

  • はにゃ?? 2004-06-20 (日) 18:39:30
  • ご回答ありがとうございました。早速試したところ旨くいきました。処理スピードもfindNextの方が速いようです。oFound.Endの.Endを取り外せばいいということは、oFoundに該当するxStartAtがcom.sun.star.uno.XInterface型であるところから推測できることなのでしょうか?このあたりが分かるようになるとSDKのManualが役に立つようになるのだと思います。何を読んでも見当がつかない状態の中で教えて頂き大変ありがとうございました。 -- suou? 2004-06-21 (月) 17:28:31


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