- ベストアンサー
ラベルに全てのテキストデータを読み込みたい
メモ帳(.txt)に AAAA BBBB CCCC と書いて、これら3行をラベルに表示させたいのです。 Private Sub Form_Load() Dim myText As String Open "C:\myFile.txt" For Input As #1 Do While Not EOF(1) Input #1, myText Loop Close #1 Label1.Caption = myText End Sub 上記のコードだと1行目のAAAAしか表示されません(泣) どなたかご指導宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>Me.Controls("label" & I).Caption = myTextの >("label" & I)とはどういう意味なのでしょうか? Me.Controls("label1")と書くと、フォーム上の「label1」というラベルコントロールを表します。 それをループ中なので "label" & I と表したのです。 でもVB6.0なので、コントロール配列にすればいいと思いますよ。 Label1(I).Caption = myText って感じでつかえます。 さて。補足要求なのですが、ラベル1つに対して、テキスト1行を表示なのですか? それともラベルは1つしかなく、そこに全部表示? 1つのラベルに全部表示するなら、 >Label1.Caption = myText ではなく Label1.Caption = Label1.Caption & myText & vbCrLf とし、Loopの中に書きます。 (最後に改行が1つ余分に入っちゃいますが・・。)
その他の回答 (5)
- pen_pen_pen
- ベストアンサー率65% (52/79)
こんな感じかなぁ。 Private Sub Form_Load() Dim myText As String '読み込みバッファ Dim N As Integer 'ファイルNo Dim cntAll As Integer '全部を保存する配列数 Dim strOne() As String '1まとまり(「AAA,BBB,CCC」単位)保存用の配列 Dim cntOne As Integer '↑配列数 '初期化 myText = "" cntAll = -1 cntOne = -1 N = FreeFile Open "C:\tmp\myFile.txt" For Input As N Do While Not EOF(N) '1行読み込み Input #N, myText '空行でなければ1まとまり用の配列に保存 If Len(myText) > 0 Then cntOne = cntOne + 1 ReDim Preserve strOne(cntOne) strOne(cntOne) = myText End If '空行か、ファイルの終りになったら全体の配列用の配列に保存 If Len(myText) = 0 Or EOF(N) Then cntAll = cntAll + 1 ReDim Preserve strTextFile(cntAll) '配列strOneの内容を改行で区切って連結したものをセット strTextFile(cnt) = Join(strOne, vbCrLf) '次の為に1まとまり用の配列を初期化 cntOne = -1 Erase strOne End If Loop Close #N End Sub
お礼
回答ありがとうございます!! 何度も質問に答えてくれて感謝しています。 ありがとうございました。
- pen_pen_pen
- ベストアンサー率65% (52/79)
フォームの変数で Private strTextFile(3) As String を宣言。 フォームのLoadイベントで strTextFile(0)にmyFile1.txtの内容。 strTextFile(1)にmyFile2.txtの内容。 strTextFile(2)にmyFile3.txtの内容。 strTextFile(3)にmyFile4.txtの内容。 を読んでおく。 ボタンのClickイベントで Private Sub Command1_Click() Static strNo As Integer Label1.Caption = strTextFile(strNo) strNo = (strNo+1) Mod 4 End Sub とすれば、クリックする度に切り替わります。 -------------- ここまでがファイルが4つの場合。 1にファイルをまとめるなら、Loadイベントを工夫します。 例えば空行があるまでが1まとまりとしてstrTextFile()に1つ1つセットしていけば、ランダムアクセスの必要は無いでしょう。 例)myFile.txt AAAA ←ここから BBBB CCCC ←ここまでstrTextFile(0)に読み込む DDDD ←ここから EEEE FFFF ←ここまでstrTextFile(1)に読み込む GGGG ←ここから HHHH IIII ←ここまでstrTextFile(2)に読み込む JJJJ ←ここから KKKK LLLL ←ここまでstrTextFile(3)に読み込む ※「空行があるまでが1まとまり」というのは、あくまで例です。3行と決まってるなら、全部つめて3行読んだら次の配列に行くんでもOK。
補足
ありがとうございます! 「空行があるまで」というのはどのように書けばよろしいのでしょうか? Do Whileで書こうとしたのですが条件式が分かりません。 何度も質問して申し訳ございません。
#1さんの書かれている > 質問の通り実行しましたが、Label1には 「CCCC」が表示されます。AAAAが表示されるというのはちょっと考えられません。 を拝見し、私も質問者さんのコードを見て同じ事を思いました。 このコードではLabel1.Captionへの値の代入がLoopの外で行われているので、myTextには最後のレコードである「CCCC」が入っているのと、 代入の対象をLabel1に固定してしまっています。 「AAAA」しか表示されないと言われているので、 一度、Label1の高さを広げてみてください。 案外、 AAAA BBBB CCCC と表示されるかもしれません。 従って、実際に書かれているコードと質問文に書かれたコードとが微妙に異なっているのかも。
お礼
回答ありがとうございます!! 間違いました(汗) 「CCCC」です。 申し訳ございませんでした。 本当にすみませんでした。
VB の学習中のようですので回答の全てを示すべきかどうか迷うところですが・・・。 幾つか気になった点がありましたので・・・。 1、FreeFile が使われていない。 2、FileSystemObject が使われていない。 1点目ですが、 Private Sub コマンド0_Click() On Error Resume Next Dim I As Integer Dim N As Integer Dim myText As String N = FreeFile Open "C:\Temp\myFile.txt" For Input As #N Do While Not EOF(N) Input #1, myText I = I + 1 Me.Controls("label" & I).Caption = myText Loop Close #N End Sub と、書いたが良いと思います。 ファイル番号をプログラム中に埋め込むと、チトまずいです。 2点目ですが、 Private Sub コマンド1_Click() On Error Resume Next Dim I As Integer Dim N As Integer Dim strMyTexts() As String strMyTexts() = FileReadArray("C:\Temp\myFile.txt") N = UBound(strMyTexts) For I = 0 To N Me.Controls("label" & I + 1).Caption = strMyTexts(I) Next I End Sub と、非手続き的に書くスタイルを採用すればバグを相当に追放できます。 ※FileSystemObject を用いるには、Microsoft scripting runtime を参照させる必要があります。
お礼
VB6.0を学習中です。 質問があるのですが、 Me.Controls("label" & I).Caption = myTextの ("label" & I)とはどういう意味なのでしょうか? 宜しくお願いします。
補足
回答ありがとうございます!! 間違いました(汗)「CCCC」です。 申し訳ございませんでした。 早速、FreeFileとFileSystemObjectについて勉強します。 また不明な点があれば宜しくお願い致します。
質問の通り実行しましたが、Label1には 「CCCC」が表示されます。AAAAが表示されるというのはちょっと考えられません。 ファイルを読むたびに、MyTextにその内容が入り、それがLabel1に送られるというロジックになっています。Labelを配列コントロールにしそこへ順番に送っていく必要があります。
お礼
回答ありがとうございます!! 間違いました(汗) 「CCCC」です。 申し訳ございませんでした。 配列コントロールについて調べてみます。 ありがとうございました!
お礼
回答に対する補足訂正します。「#3さん」が抜けていました(汗) #1さん、#2さん、#3さん、#4さん回答ありがとうございました。
補足
#1さん、#2さん、#4さん回答ありがとうございました。 1つのラベルに3行すべて全表示させることができました。 また質問で恐縮なのですが、 フォームにボタンを追加して、それをクリックするたびに同じラベルに 別のテキストファイル(myFile2.txt、myFile3.txt、myFile4.txt)の内容を 順次表示させていきたいのです。 この場合、4つのテキストファイルのOpen→Input→Closeはどのようにしたらよいのでしょうか? また、別の方法として、4つのテキストファイルを1つにまとめて、 任意の位置を読み込んでいく(ランダムアクセスファイル?)ことは可能でしょうか?