こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルを読み込んだらVBがフリーズする

↓のコードだと、ファイルを読み込んだ時点でVBがフリーズします(平気なファイルも一部ある)。原因と解決法を教えてください。
Private Sub Command1_Click()
CommonDialog1.Filter = "テキスト(*.txt)|*.txt|すべて(*.*)|*.*"
CommonDialog1.FilterIndex = 1
CommonDialog1.Flags = cdlONFileMustExist
CommonDialog1.CancelError = True
On Error Resume Next
CommonDialog1.ShowOpen
If (Err = 0) Then
FileRead CommonDialog1.FileName
End If
On Error GoTo 0
End Sub
Private Sub FileRead(FL As String)
Dim FileNo As Integer
Dim strDAT As String
Dim strELM As String
Dim pot1 As Integer, pot2 As Integer
Dim pDB1 As Integer, pDB2 As Integer
FileNo = FreeFile()
Open FL For Input As #FileNo
While Not EOF(FileNo)
Line Input #FileNo, strDAT
strDAT = strDAT & ":"
pot1 = InStr(strDAT, ":")
While pot1 > 0
strELM = Left(strDAT, pot1)
pot2 = InStr(strELM, "OPEN")
While pot2 > 0
pDB1 = InStr(strELM, Chr(&H22))
If pDB1 > 0 Then '前の『"』の位置
pDB2 = InStr(pDB1 + 1, strELM, Chr(&H22))
If pDB2 > 0 Then
RichTextBox1.Text = RichTextBox1.Text & _
Mid(strELM, pDB1 + 1, pDB2 - pDB1 - 1) & vbCrLf
End If
End If
pot2 = InStr(pDB2 + 1, strELM, "OPEN")
Wend
strDAT = Mid(strDAT, pot1 + 1)
pot1 = InStr(strDAT, ":")
Wend
Wend
Close #FileNo
End Sub

投稿日時 - 2002-08-23 15:23:56

QNo.341880

すぐに回答ほしいです

質問者が選んだベストアンサー

While pot2 > 0
pDB1 = InStr(strELM, Chr(&H22))
If pDB1 > 0 Then '前の『"』の位置
pDB2 = InStr(pDB1 + 1, strELM, Chr(&H22))
If pDB2 > 0 Then
RichTextBox1.Text = RichTextBox1.Text & _
Mid(strELM, pDB1 + 1, pDB2 - pDB1 - 1) & vbCrLf
End If
End If
pot2 = InStr(pDB2 + 1, strELM, "OPEN")
Wend

OPEN という文字が入っているとこのWhile文に入ります。
OPEN の後に ["]が2つあれば その間の文字をrichTextBox1に書き込みます。
その後、pot2 = InStr(pDB2 + 1, strELM, "OPEN") で次のOPENを探すのですが
pDB2という変数は、2つ目の["]が無いと0ですのでまた最初から検索してしまいます。
するとOPENという文字が見つかるのでWhileから抜けられません。

抜ける方法はもう1つの質問の補足に書きましたが、["]が無い場合にpDB2に
OPENがあった場所を入れてあげれば、解決します。
VBの勉強をこれからもされるのであれば、
[F9]ブレークポイントの設定
[F8]1行毎の実行
によりプログラムを1行づつ実行し、自分の考えている数値が、変数に入っているか、
調べるようにしてみてください。

投稿日時 - 2002-08-23 19:49:35

お礼

ありがとうございます。While(ループ)から抜け出せるようになりました。しかし、まだ問題が・・・

投稿日時 - 2002-08-26 14:35:17

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

こんにちは。maruru01です。

最内のWhile文(条件がpot2 > 0のところ)中で、
最後に、
pot2 = InStr(pDB2 + 1, strELM, "OPEN")
としていますが、例えばstrDATの内容が、
「abc"def"ghiOPENjkl:mno」
のような場合、pot1 = 19になり、strFLMは、
「abc"def"ghiOPENjkl:」
となるので、常に
pDB1 = 4
pDB1 = 8
pot2 = 12
となり、ずっとpot2 > 0を満たしつづけてしまいます。

もし、strDATから""で囲まれた部分を順に抜き出してリッチテキストに付け足していくのが目的なら、
Mid関数のあとで、

strFLM = Left(strFLM, pDB1 - 1) & Mid(strFLM, pDB2 + 1)

という風に、"def"の部分を除かないとダメじゃないでしょうか。

投稿日時 - 2002-08-23 17:13:22

補足

最終的には、あるテキストファイルをダイアログボックスより読み込んで、OPEN_"*.*"(_は空白、空白の長さは固定されていない/*はワイルドカード)という形の文字列から *.* だけをテキストボックスに表示させたいのです(質問に書いたコードで、フリーズせずに読み込めたファイルでは上のように出来ました)。ところが、私はVBはおろかプログラムそのものがろくに理解できていないのです。そのため、ループの所もわからずに困っています。ここまでたどりついたのも、他人様から教わったコードをコピペしてちょこっと修正したおかげでして・・・。他力本願ではまずいと思いながらも、期限が迫っているので、ここまできてしまいました。ループの所をこんな私でもわかるように説明してもらえないでしょうか。今のままではせっかく教えていただいても、どう修正すればいいのかわかりません。

投稿日時 - 2002-08-23 17:31:08

お礼

例題まで載せていただいた丁寧な回答、感謝します。ありがとうございます。

投稿日時 - 2002-08-23 17:47:40

ANo.1

>VBがフリーズします
While文を抜ききれてないからです。つまり無限ループに陥ってます。
ブレークポイントを置いて確かめてみてください。

投稿日時 - 2002-08-23 16:28:28

お礼

ありがとうございます。ループの仕組みがろくにわかっていないので困っています。

投稿日時 - 2002-08-23 17:46:02

あなたにオススメの質問