ReDim Preserveについて。

解決


前田のクラッカー  2003-02-13 08:33:47  No: 106025  IP: [192.*.*.*]

サンプル.txtの中身を読み込んで、
そのテキストファイルの1行目だけをtext1に表示したいのですが、
たまに、サンプル.txtの中身が変更られているにもかかわらず、
text1には変更された内容ではなく、
前の読み込んだデータが表示されるのです。
原因が分からないので、何方か教えてください。
下記がプログラムです。

Private Sub sample()

   intFileNo = FreeFile
   Open "C:\WINDOWS\デスクトップ\サンプル.txt" For Input As #1
   Do Until EOF(1)
   ReDim Preserve strArray(intIndex)
   Line Input #1, strArray(intIndex)
   intIndex = intIndex + 1
   Loop
   Close #1
   Text1 = strArray(Int(0))

End Sub

編集 削除
とおりすがり  2003-02-13 09:04:37  No: 106026  IP: [192.*.*.*]

Redim Private は ヘルプを見ていただいても判ると思いますが、内容を記述すると、既存の配列に格納されている値を失うことなく、配列の最後の次元の要素数を変更する場合に使用する、キーワードです。
つまり、「strArray」の中身を初期化しないといけないと云う事です。
Do Untilの前に「Erase strArray」を使用して初期化しましょう。

編集 削除
前田のクラッカー  2003-02-13 09:46:05  No: 106027  IP: [192.*.*.*]

早速の回答ありがとうございます。
現状では「Erase strArray」を使用していないのですが
初期化される場合と初期化されない場合があります。
これは何故なのでしょうか?

編集 削除
nanashi  2003-02-13 09:57:00  No: 106028  IP: [192.*.*.*]

Redim Preserveでは初期化はされません。
試しにRedim Preserveの直後にブレイクポイントを設定して中身を見てください。

編集 削除
たかみちえ  URL  2003-02-13 10:35:31  No: 106029  IP: [192.*.*.*]

VBでは変数は、宣言と同時に初期化される…様な話を聞いたことあります。
  だから、最初は初期化されるので、そう見えただけでは?

  ところで、Preserveがなければ、配列内容はクリアされたと思いますけど?

編集 削除
前田のクラッカー  2003-02-13 19:17:02  No: 106030  IP: [192.*.*.*]

デバッグで「Do Until」の前に「Erase strArray」を追加して行ったのですが、
1回目は「TEXT1」にテキストファイルの内容を表示するのですが、
2回目以降は「TEXT1」が空欄、何も表示しないのです。
デバッグ停止して再度行うと、1回目だけは表示するのですが、
2回目以降は何も表示しないのです。

「ReDim Preserve strArray(intIndex)」を
「ReDim strArray(intIndex)」とすると、最初から何も表示しないのです。

とんちんかんなデバッグをしているかもしれませんが、
何方か教えてください。

編集 削除
Y2  2003-02-13 23:42:28  No: 106031  IP: [192.*.*.*]

intIndex = 0に初期化されていないみたいですけど、
予想ですが、その状態でEraseだけ行っていませんか?
Do Untilの前に初期化を追加し、RedimにPreserveを付けておけば2回目以降も正常に動作すると思われます。

あと、気がついたことですが、せっかくFreeFileで使用可能なファイル番号を獲得しているのに、ファイル番号1で固定になっていますね。

編集 削除
前田のクラッカー  2003-02-15 08:21:41  No: 106032  IP: [192.*.*.*]

やっと気がつきました。
intIndexが初期化されずに、ず〜っとカウントアップされてました。
解決しました。
みなさんありがとうございました。

編集 削除