↓のコードだと、ファイルを読み込んだ時点で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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
VBAでワークシートを引数として...
-
FTPのコマンド「mput」について
-
テキストファイルで提出とは?
-
C言語、ファイルの存在チェック...
-
テキストの保存
-
VBAでエクセルをtxtに変換する...
-
javaでemlファイルからtxtファ...
-
COPYコマンドで結合すると余計...
-
ファイルの最後に文字列挿入
-
【csh】ファイルの中の値を配列...
-
多数のサブディレクトリ内のフ...
-
テキストファイルのファイル名...
-
コマンドプロンプトでのファイ...
-
バッチファイルで文字列削除に...
-
エクセルの各セルの内容をそれ...
-
ハードディスク上書き用大容量...
-
VB6.0 でのテキストファイルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
バッチファイルで文字列削除に...
-
Windowsのバッチファイルを利用...
-
テキストファイルのファイル名...
-
ファイルの最後に文字列挿入
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
テキストファイルのタブをカン...
-
MATLABで行列を配列に格納する方法
-
renameコマンドについて
-
【Excel】 VBAを使って毎回名前...
おすすめ情報