投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/11/14 00:23:50
先の投稿が部分的に間違っていたので、修正のため、再度投稿しなおしておきます。

----------- 再投稿 ここから -----------
> TextMatrixのが遅いかなと思ってたのですがもしかして早いのでしょうか。。
> ちょっと試してみます。

先ほどと同じ件数(15000行)で試してみて、平均で 0.039 秒ぐらいでした。

Dim t As Single     '経過時間測定用  
t = Timer

Dim n As Integer
MSHFlexGrid1.Redraw = False
For n = 1 To Limit
    'MSHFlexGrid1.TextMatrix(n, 0) = CStr(n) & "行目" & vbCrLf   '★間違い 
    MSHFlexGrid1.TextMatrix(n, 0) = CStr(n) & "行目"
Next
MSHFlexGrid1.Redraw = True

Debug.Print FormatNumber(Timer - t, 4) & "秒"
MsgBox FormatNumber(Timer - t, 4) & "秒", vbInformation

----------- 再投稿 ここまで -----------

なお、さらにその前に投稿した、Clip を使う方法についても、
> s = s & CStr(n) & "行目" & vbCrLf
のように、うっかり vbCrLf 区切りになってしまっていますので、
 s = s & CStr(n) & "行目" & vbCr
などの vbCr 区切りに読み替えておいてください。m(_ _;)m

=============================================================

> 上記の()付きの方が、驚くくらい早かったです。
「& 演算子」は、文字数が増えるほどに低速化していきます。
括弧を付けることで、短い文字列の連結を先に済ましてやると、
時間のかかる「長い文字列連結」の回数を減らすことができるというわけです。


> そして、それよりもTextMatrixのが早くてさらにびっくりです。
今回は、TextMatrix を使った方が望ましいでしょう。

Mid+Clip 法と、TextMatrix 法の処理速度は殆ど同じですし、
何よりも TextMatrix の方が分かり易く、融通も利きますからね。
(先の条件を 100万件にして比較したところ、どちらも 3秒弱で完了しました)


MSHFlexGrid.TextMatrix や DbGrid.DataSource を使うのであれば、
今回の Clip 法の出番は無いかと思いますが、「高速な文字列連結処理」というのは、
他の場所で使う機会があるかも知れないので、それぞれの実装法と
その速度の違いを覚えておくと、後々役に立つかと思います。


> ( Midステートメント法は、試してないです。。すみません。。。)

Mid ステートメントは、「文字列の一部を差し替える」ための物です。
S = "abcdefghij"
Mid(S, 4, 3) = "XYZ"
Debug.Print S   '「abcXYZghij」になる。 

これを文字列連結処理に応用したのが先のサンプルです。
Mid を使うと、最初に確保したメモリ領域が使いまわされる為、長い文字列でも処理速度が低下しません。


ただし、最初に充分な文字列サイズを確保しておかなければならないため、
データが固定長の場合には良いですが、今回のような可変長データだと、
(先のコードのような)やや分かりにくいコードになってしまうのが難点です。


なお、高速化が望める文字列連結法としては、他にも

 (案1) 外部ファイルを使う方法
   →ループ中で Print # でテキスト追記。最後に Get # で一括バイナリ読み込み。
 (案2) Dictionary + Join 関数を使う方法
   →ループ中で.Add メソッドで追記。最後に .Items メソッドを Join 関数で結合。
 (案3) ADODB.Stream のバイナリモードを使う。
   →.Write メソッドで追記。最後に先頭位置から .Read メソッドで一括読み込み。

などがあります。Mid ステートメント法ほどの速度は出ませんけれどね。
(1 や 3 で得たバイナリは、最後に StrConv 関数で文字列に復元させます)