OOobbs/26
質問サンプル・プログラムの「Sub search_2」のSearchStringを変えて実行してみると、findFirstは旨くいきました。しかし、さらにいくつも該当項目があるのに、findNextを実行するとIsNull(oFound)がTrueになってしまい、次が探せません。但し、文書ドキュメントでサンプルプログラムを実行すると実際、findNextは次々と該当SearchStringを探していきます。Calcで旨くいかないのはなぜでしょう? このfindNext(.uno.XInterface xStartAt, .util.XSearchDescriptor xDesc)の第一パラメータとして用いられているoFound.Endとはどのような意味ですか?また、その他にxStartAtに入れられる値にはどんなものがあり、それぞれどんな意味をもつのでしょうか?教えていただければうれしいです。 回答
?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が使えるようになりたいです。はにゃ先生、よろしくお願いします。
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 今度のは試してみたので,うまくいくと思います。
|