質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

5348閲覧

特定の文字を見つけたらループを終了したい

pro-poke5

総合スコア46

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/08/16 03:01

こんにちわ。
Excelでマクロを書いています。

テキストファイルから、最初の5行を読み飛ばし
そのあと4行ごと取得し、必要な部分を出力し
1行目に特定の文字がでてきたらループを終了するというものを書きたいです。

VBA

1Sub Run() 2 Dim OpenFileName As String 3 'ファイルを開くダイアログ 4 ChDir ThisWorkbook.Path & "\" 5 OpenFileName = Application.GetOpenFilename("テキストファイル,*.txt") 6 7 If OpenFileName <> "False" Then 8 Open OpenFileName For Input As #1 9 End If 10 11 Dim buf As String 12 '5行読み飛ばし 13 Line Input #1, buf 14 Line Input #1, buf 15 Line Input #1, buf 16 Line Input #1, buf 17 Line Input #1, buf 18 19 Do While InStr(line1, "おわり") > 0 20 21 Dim line1 As String 22 Dim line2 As String 23 Dim line3 As String 24 Dim line4 As String 25 26 '4行読み込み 27 Line Input #1, line1 28 Line Input #1, line2 29 Line Input #1, line3 30 Line Input #1, line4 31 32 Close #1 33 34-処理(省略)- 35 36 Debug.Print , a + b + c + d ; 37 38 Loop 39 40 Close 41 42 End Sub 43

1行目に おわり という文字がきたらループを抜けたいです。
今これを実行すると、
コンパイルエラー
同じ適用範囲内で宣言が重複しています。
というエラーが Do While InStr(line1, "おわり") > 0
の部分ででてきます。
line1は1度しか宣言していません。
省略している処理の中ではline1に関しては何も記述はありません。
なぜこのようなエラーがでてきるのでしょうか?
解決方法があれば、アドバイスいただけますと嬉しいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Do...Loopの条件が変ではありませんか?

現在の条件は、「line1おわりが含まれている間ループする」となっています。

質問にある動作を行う場合、「読み取ってから判定する」となるため
Whileを使わず、Exit Doでループを抜けた方が書きやすいと思われます。

vba

1Sub Run() 2 Dim OpenFileName As String 3 'ファイルを開くダイアログ 4 ChDir ThisWorkbook.Path & "\" 5 OpenFileName = Application.GetOpenFilename("テキストファイル,*.txt") 6 7 If OpenFileName = CStr(False) Then 8 MsgBox "選択がキャンセルされました。", vbInformation 9 Exit Sub 10 End If 11 12 Open OpenFileName For Input As #1 13 14 Dim buf As String 15 '5行読み飛ばし 16 Dim i As Long 17 For i = 1 To 5 18 Line Input #1, buf 19 Next i 20 21 Do 22 Dim line1 As String 23 Dim line2 As String 24 Dim line3 As String 25 Dim line4 As String 26 27 '4行読み込み 28 Line Input #1, line1 29 'Whileの代わり 30 If InStr(1, line1, "おわり") > 0 Then 31 Exit Do 32 End If 33 34 Line Input #1, line2 35 Line Input #1, line3 36 Line Input #1, line4 37 38 'Dim a, b, c, d 39 '-処理(省略)- 40 41 Debug.Print , a + b + c + d; 42 43 Loop 44 45 Close 46End Sub

投稿2018/08/16 03:59

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pro-poke5

2018/08/16 05:07

Do...Loopの考え方をきちんと理解していませんでした…。 Do whileで条件をかくことばかり考えてExit Doの考え方が思いつきませんでした。 ありがとうございます。
guest

0

何のために「Dim 〇〇」と宣言していると思ってますか?

その意味が分かれば、宣言前に使っていたらエラーになるのは、当たり前のことだと理解できますよ。

あと、ステップ実行、ローカルウィンドウ、イミディエイトウィンドウ等を使って
自分でデバッグしてから出直してください。

投稿2018/08/16 03:55

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。
下記Afterのように、Dim文をWhile文よりも前に出してみるといかがでしょうか。

#Before

VBA

1Do While InStr(line1, "おわり") > 0 2 3 Dim line1 As String 4 Dim line2 As String 5 Dim line3 As String 6 Dim line4 As String

#After

VBA

1Dim line1 As String 2Dim line2 As String 3Dim line3 As String 4Dim line4 As String 5 6Do While InStr(line1, "おわり") > 0

Dim文をWhileループ内で実行しているために何度も実行されてしまうのではないでしょうか。

投稿2018/08/16 03:08

kinaly

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pro-poke5

2018/08/16 03:19

ありがとうございます。 エラーはでなくなりましたが、何も出力されなくなりました。。。 もちろんループ文なしの状態でじゃうまく出力できていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問