はじめまして。
例えばテキストファイルに
aaaaa
bbbbb
ccccc
と書いてあり、それをボタンをクリックするごとに、textに
aaaa。 bbbb。 cccc。と順番にその一行だけ表示をさせたいのですが、
どのようにすれば良いのでしょうか?
お願いします。
オープンしたテキストファイルをLine Inputで読みこみ、
一つの配列にいれれば良いと思います。
あとはボタンをクリックする度に、配列の中身を順に表示させるだけですね。
書き忘れました(^^;
一つの配列に格納すると言うのは、テキストファイルの行数によって
配列数を動的に増やす必要があります。
読みこみ部分のサンプルを書いてみましたのでご参考下さい
Open strFilePath For Input As intFileNo
Do Until EOF(intFileNo)
ReDim Preserve strBuf(intI) '←配列を動的に増やしている部分
Line Input #intFileNo, strBuf(intI)
intI = intI +1
Loop
Close intFreeNo
Close intFreeNo
は
Close intFileNo
の間違いです。
失礼しましたm(__)m
お返事ありがとうございます。
ちょっと今はできないんですが、すぐに参考にしてみたいと思います。
丁寧な説明、本当にありがとうございました。
また何か、わからなくなったらお願いします。
配列に取り込むなら、
FileSystemObjectのTextStreamオブジェクトの
RealAllメソッドで一気読みして、
vbCrLfでSplitしたほうが簡単かも。
ReDim は既存の配列を解放し、同じランクを持つ配列を新規作成する
…という事で Preserve で配列の要素数だけコピー処理が発生して
遅くなる…と聞いた事があります。実際に…気になるほど大量の
データを扱ったことが無いので何とも言えませんが、処理が遅いよう
なら一考ください。
もともとこれは『ボタンをクリックして順番に表示する』
と言う仕様でしょ、そんなに件数が多くないと思いますが、
あんまり多いと腱鞘炎になってしまう。
私にはListBoxを使うしか思いつかないんですが。
>もともとこれは『ボタンをクリックして順番に表示する』
>と言う仕様でしょ、そんなに件数が多くないと思いますが、
>あんまり多いと腱鞘炎になってしまう。
その通りですね(^^;)まぁ、おまけの予備知識とスレッド上げ
の意味でしたので、それほど深い…というか質問の回答に不可欠
と思って書き込んだわけでは無いです。さらっと流して下さい(ー人ー)
まぁ20行ずつ送る(ボタン押下の関数を20回呼ぶ)ページ送りボタンを
用意したり、ボタンを押し続ける事で早送り機能を持たせたりはできる
と思いますが…。
表示しないでメモリに確保しておくなら、ローカルのレコードセットとか
連想配列とか…入れ物は色々あるので何が早いのか調べてみる価値は
あるかもしれませんね。
>Preserveで配列の要素数だけコピー処理が発生して遅くなる
私自身、あまり大きなテキストを扱うことがなかったため、いつもさくっと
配列で処理させていました。(^^;
ちょっと興味が湧きましたので、時間を作って、大きなテキストファイルでの
処理速度の比較をやってみようかなあと思います。
まるるうさん、情報ありがとうございます(^^
>Preserve で配列の要素数だけコピー処理が発生して遅くなる
という書き込みがある事は知っていますが、まさかそこまではという気がします。
この件については以前かなり突っ込んだ事があります、やってみると判るのですが
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Dim a() As String
Private Sub Command1_Click()
Dim t As Long
Dim n As Long
ReDim a(10000) 'はじめに確保
t = timeGetTime
For n = 1 To 10000
a(n) = String(500, "A") 'Aを500個配列に
Next
Debug.Print timeGetTime - t
t = timeGetTime
ReDim a(0)
For n = 1 To 10000
ReDim Preserve a(UBound(a) + 1) '一回づつ確保
a(n) = String(500, "A")
Next
Debug.Print timeGetTime - t
End Sub
とやると結果は 31(msec)と94(msec)となり気になる程の差は出ません。
ただしループを10,000から100,000に増やすと私の環境ですが77,481回目で
ReDim Preserve a(UBound(a) + 1)の方はメモリーが足りない
というエラーメッセージが出ます。不思議なことにスワップが出来ないのです。
変です、なんとなくVBのバグの匂いがします。
そこで配列が足りなくなったらまとめて増やすという方法をとってみます
これだと時間も45(msec)とそこそこですし100,000回でエラーも出ません。
1,000,000まで増やしました、73秒かかりましたがエラーは出ません。
大きなデーターを配列に入れたい人にはお勧めかもしれません。
Dim t As Long
Dim n As Long
ReDim a(0)
t = timeGetTime
On Error GoTo e
For n = 1 To 10000
a(n) = "" 'エラーを出させてまと確保
a(n) = String(500, "A")
Next
Debug.Print timeGetTime - t
Exit Sub
e:
ReDim Preserve a(UBound(a) + 100) '100個分確保
Resume Next
上のプログラムを実行するとプログラムを停止後、他のプログラムを起動する時
スワップの領域開放の為かハードディスクに激しくアクセスします、ほっておけば
終わります。
これはボクにとってかなり貴重な情報&ソースでした(ノ゜▽゜)ノ
蛇足でも書きこんで良かったです。ねろさん有難う御座います。
参考にさせて頂きますm(__)m
ツイート | ![]() |