• 締切済み

読み込んだデータの表示

読み込んだデータを指定したインターバルごとにラベルに表示したいのですが,作成したプログラムを実行すると,配列の1番目しか表示されません.なにがいけないのでしょうか.Visual Basic6.0を使用しております. ' 共通変数 Dim yy() As Double Private Sub Command1_Click() ' ダイアログのタイトルを設定する CommonDialog1.DialogTitle = "データ保存" ' 初期表示するディレクトリを設定する If strCurDir = "" Then CommonDialog1.InitDir = Mid$(strStartDir, 1, 3) Else CommonDialog1.InitDir = strCurDir End If ' ダイアログ設定 Call SetDialog ' エラーをトラップしない On Error Resume Next ' ダイアログを表示する Me.CommonDialog1.ShowOpen ' [キャンセル] ボタンが選択されなかった場合は、選択したファイル名を表示する If Err.Number = ErrorConstants.cdlCancel Then On Error GoTo 0 Exit Sub End If ' エラー処理を通常のロジックに戻す On Error GoTo 0 ' FileSystemObject (FSO) の新しいインスタンスを生成する Dim cFso As FileSystemObject Set cFso = New FileSystemObject ' カレントドライブ設定 strCurDir = cFso.GetParentFolderName(CommonDialog1.FileName) FileNumber = FreeFile Open CommonDialog1.FileName For Input As #FileNumber Dim n As Integer ' カウンタ Dim i As Integer Dim intN As Integer ' 最初の配列数 Dim nn As Integer ' 配列の増分量 ' データ数のカウンタ n = 0 i = 0 ' 最初の配列数 '  配列の上限を上げる処理は何回でも出来ますが、その処理を繰り返す ' ことより同じデータ数の場合には処理時間はかかります。 '  ですから、読み取りデータ数の上限が分かっている場合は、その数を ' intN に指定してください。この場合には配列の上限を判断するプログラム ' 部分を省くことができます。 intN = 500 ' 配列の増分量 '  データ数が未定のときは、なるべく配列の上限を増やす処理を少なく ' する配列数を指定してください。 nn = 200 ' 最初の配列数設定 ReDim yy(intN) Do While Not EOF(1) ' ファイルの終端までループを繰り返します。 ' 配列増分処理 If n > intN Then ReDim Preserve yy(UBound(yy) + nn) intN = intN + nn End If ' データ読み取り Input #FileNumber, yy(n) ' データ配列に代入します。 n = n + 1 Loop Close #FileNumber ' 配列のサイズを揃える ReDim Preserve yy(n - 1) blnGetData = True ' データ取得 End Sub ' ダイアログの設定 Private Sub SetDialog() ' 初期表示するファイル名を設定する CommonDialog1.FileName = "Data.txt" ' ファイルのフィルタを設定する CommonDialog1.Filter = "テキスト ファイル|*.txt|すべてのファイル|*.*" ' ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) CommonDialog1.FilterIndex = 1 ' 存在しているファイルを指定した場合は、上書きするかどうかの問い合わせを表示する CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNOverwritePrompt ' 存在しないパスを指定した場合は警告を表示する CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNPathMustExist ' 有効な Win32 ファイル名でなくとも返す (検証しない) 'CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNNoValidate ' [読み取り専用] チェックボックスを非表示にする ' (省略しても表示はされませんが、ダイアログの大きさが変わります) CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNHideReadOnly ' 長いファイル名を使用する CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNLongNames ' [キャンセル] ボタンを選択した場合はエラーを発生させる CommonDialog1.CancelError = True ' エラーをトラップしない On Error Resume Next End Sub Private Sub Command2_Click() Timer1.Enabled = True End Sub Private Sub Command3_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Label1.Caption = yy(i) i = i + 1 End Sub

みんなの回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

一応、動くようにしてみました。 変更点は以下です。 (1) 共通変数としているところを、 ' 共通変数 Dim yy() As Double Dim j As Integer Dim n As Integer (2) Command1_Click イベントで、 Dim n As Integer ' カウンタ をコメントアウト(あるいは削除)。共通変数に設定。 なお、動かす上でこのプロシージャの中で出てくる strCurDir、strStartDir、FileNumber、blnGetDataなどの変数は 便宜上このプロシージャの始めで以下のように設定。 なお、blnGetDataなる変数で立てるフラッグはどこで使用するのか 分からないが、このプロシージャでは用はないが一応設定。 (本来はPublicで設定しているのかもしれませんが) Dim strCurDir As String Dim strStartDir As String Dim FileNumber As Integer Dim blnGetData As Boolean (3) Command2_Clickイベントで、 Private Sub Command2_Click() Timer1.Interval = 1000 Timer1.Enabled = True End Sub のようにして1秒間隔で表示するようにして動作の確認。 (4) Timer1_Timerイベントで、 Private Sub Timer1_Timer() Label1.Caption = yy(j) j = j + 1 If j = n Then Timer1.Enabled = False End If End Sub のように設定。質問の場合は変数のiが使用されていたが この場合はフォームの共通変数に設定したjを使用する。 なお、このプロシージャの後半の、 If j = n Then Timer1.Enabled = False End If は変数jの数値がCommand1_Clickイベントで取得した配列の 要素数を超えてエラーにならないようにするために設定。 (5) 確認に使ったデータ 1,2,3,4,5 10,20,30,40,50 11,21,31,41,51 12,22,32,42,52 13,23,33,43,53 14,24,34,44,54 上記をData.txtに設定して確認。 以上のようにして一応確認してみました。 なお、共通変数に設定している変数のjは Integerとしていますが、必要ならば変更 してください。

回答No.2

Private Sub Timer1_Timer() の中でいきなり i を使っているけど その i はどこで宣言しましたか?

shuko8749952
質問者

補足

Dim n As Integer ' カウンタ Dim i As Integer Dim intN As Integer ' 最初の配列数 Dim nn As Integer ' 配列の増分量 上のほうになるんですが,ここで宣言しています.

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.1

Private Sub Timer1_Timer()プロシージャ内でのi変数はどう変わっているかをチェック

関連するQ&A