投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/9/8 16:00:10
あぁ、懐かしいコードが出てきましたね…。

でも移植内容がちょっと不自然。コメントと処理が合致していないようです。
> If String.IsNullOrEmpty(BMK) = 0 Then

> End If
> BMK = Range.getBookmark
IsNullOrEmpty の戻り値は Integer ではなく Boolean ですし、
そもそもこれでは、If 文が何の役目も果たしていません。


これの原文は私が 2000/06/30 に VB 系メーリングリストに投稿した
VB6 向けのコードなのですが、その当時は下記のように書いていたはずなんですよね。

> '検索文字列を入れておいてください。
> If Len(Text1.Text) = 0 Then Exit Sub

> Set Doc = WebBrowser1.Document
> Set Body = Doc.Body
> Set objRange = Body.createTextRange

> '≫≫≫≫≫ 検索開始
> Do While objRange.findText(Text1.Text)
>  '最初に見つかった位置を保存しておきます。
>  If Len(BMK) = 0 Then BMK = objRange.getBookmark

>  '検索した語句を黄色く反転させる。
>  objRange.execCommand "BackColor", False, "YELLOW"

>  '論理カーソル位置を、検索した語句の末尾に移動させる。
>  objRange.collapse False
> Loop
> '≪≪≪≪≪ 検索終了

> 'ついでに、最初に見つけた語句の位置までスクロールさせています。
> If Len(BMK) Then
>  objRange.moveToBookmark BMK
>  objRange.scrollIntoView
> End If

> '最後は一応、後始末を。
> Set objRange = Nothing
> Set Body = Nothing
> Set Doc = Nothing


なお、.createTextRange や .getBookmark はプロパティではなくメソッドなので、
本来は .createTextRange() や .getBookmark() と書いた方が望ましいです。



> なぜこれだけで処理速度が改善したのかはさっぱり分かりません。

うぅむ、何故でしょうね。
順番を入れ替えた場合、outerHTML の内容が微妙に違っていたりはしますか?



とりあえず実験。短めのコンテンツなので速度検証はしておりませんが、
順番を入れ替えても HTML の内容に差は生じていませんでした。

コンテンツの内容や互換モードの設定、IHTMLTxtRange の範囲にもよるのかな。


 1⃣ 【原文】XHTML 1.1 で書かれたコンテンツ
<div style="background-Color:green">
  <label for="U"><font color="white">ログインID</font></label>
  <input id="U" name="U" size="18" value="" />
</div>


 2⃣  [1] に対して、"ログイン" の BackColor を Red にした場合。
<div style="background-Color:green">
  <label for="U">
    <font color="white">
      <FONT style="BACKGROUND-COLOR: red">ログイン</FONT>
      ID
    </font>
  </label>
  <input id="U" name="U" size="18" value="">
</div>


 3⃣ [1] に対して、"ログイン" の ForeColor を Blue にした場合。
<div style="background-Color:green">
  <label for="U">
    <font color="white">
      <FONT color="blue">ログイン</FONT>
      ID
    </font>
  </label>
  <input id="U" name="U" size="18" value="">
</div>


 4⃣ [2] に対して、ForeColor を Blue にした場合と、
    [3] に対して、BackColor を Red にした場合の結果は同じだった。
<div style="background-Color:green">
  <label for="U">
    <font color="white">
      <FONT style="BACKGROUND-COLOR: red" color="blue">ログイン</FONT>
      ID
    </font>
  </label>
  <input id="U" name="U" size="18" value="">
</div>