- ベストアンサー
ファイルを読み込んだら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
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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行づつ実行し、自分の考えている数値が、変数に入っているか、 調べるようにしてみてください。
その他の回答 (2)
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。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"の部分を除かないとダメじゃないでしょうか。
お礼
例題まで載せていただいた丁寧な回答、感謝します。ありがとうございます。
補足
最終的には、あるテキストファイルをダイアログボックスより読み込んで、OPEN_"*.*"(_は空白、空白の長さは固定されていない/*はワイルドカード)という形の文字列から *.* だけをテキストボックスに表示させたいのです(質問に書いたコードで、フリーズせずに読み込めたファイルでは上のように出来ました)。ところが、私はVBはおろかプログラムそのものがろくに理解できていないのです。そのため、ループの所もわからずに困っています。ここまでたどりついたのも、他人様から教わったコードをコピペしてちょこっと修正したおかげでして・・・。他力本願ではまずいと思いながらも、期限が迫っているので、ここまできてしまいました。ループの所をこんな私でもわかるように説明してもらえないでしょうか。今のままではせっかく教えていただいても、どう修正すればいいのかわかりません。
- sha-girl
- ベストアンサー率52% (430/816)
>VBがフリーズします While文を抜ききれてないからです。つまり無限ループに陥ってます。 ブレークポイントを置いて確かめてみてください。
お礼
ありがとうございます。ループの仕組みがろくにわかっていないので困っています。
お礼
ありがとうございます。While(ループ)から抜け出せるようになりました。しかし、まだ問題が・・・