↓のコードだと、ファイルを読み込んだ時点で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
No.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行づつ実行し、自分の考えている数値が、変数に入っているか、
調べるようにしてみてください。
No.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"の部分を除かないとダメじゃないでしょうか。
この回答への補足
最終的には、あるテキストファイルをダイアログボックスより読み込んで、OPEN_"*.*"(_は空白、空白の長さは固定されていない/*はワイルドカード)という形の文字列から *.* だけをテキストボックスに表示させたいのです(質問に書いたコードで、フリーズせずに読み込めたファイルでは上のように出来ました)。ところが、私はVBはおろかプログラムそのものがろくに理解できていないのです。そのため、ループの所もわからずに困っています。ここまでたどりついたのも、他人様から教わったコードをコピペしてちょこっと修正したおかげでして・・・。他力本願ではまずいと思いながらも、期限が迫っているので、ここまできてしまいました。ループの所をこんな私でもわかるように説明してもらえないでしょうか。今のままではせっかく教えていただいても、どう修正すればいいのかわかりません。
補足日時:2002/08/23 17:31お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
バッチ処理でファイルの中身を...
-
COPYコマンドで結合すると余計...
-
【Excel】 VBAを使って毎回名前...
-
バッチにてフォルダ内ファイル...
-
ファイルを処理中に次の処理に...
-
多数のサブディレクトリ内のフ...
-
★★★PowerShellのpatternについ...
-
ファイルの最後に文字列挿入
-
テキスト(txt)→ワード(docx)へ...
-
拡張子を元に戻す
-
テキストファイルで提出とは?
-
コマンドプロンプトでファイル...
-
UWSCでファイルを開く方法
-
VBAでエクセルをtxtに変換する...
-
テキストファイルクリア .net2...
-
MATLABで行列を配列に格納する方法
-
psqlでエラーログをとりたい
-
CMakeでエラーが出ます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
拡張子を元に戻す
-
COPYコマンドで結合すると余計...
-
ファイルの最後に文字列挿入
-
Windowsのバッチファイルを利用...
-
txtとはWordでなんですか?
-
テキストファイルで提出とは?
-
バッチファイル 複数ファイル...
-
UWSCでテキストファイルを開い...
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
renameコマンドについて
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
エクセルの各セルの内容をそれ...
-
MS-DOSのバッチファイルの中で...
-
フルパスの中にワイルドカード...
おすすめ情報