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

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

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

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

Q&A

解決済

3回答

3116閲覧

テキストファイル読み込みエラーの処理

pro-poke5

総合スコア46

VBA

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

0グッド

0クリップ

投稿2018/08/29 03:17

編集2018/09/03 06:01

こんにちわ
VBAをかいています

テキストファイルから1行ずつデータを読み込み、特定の文字を見つけたらそこから2行データを抽出し、また次の行へと進んでいくマクロをかいています
このとき、特定の文字をみつけた次の次の行が空(ない)の時にエラー画面をだしたいのですが、どうかけばいいのかわかりません
以下がループ部分のコードです

VBA

1Do Until EOF(txtnum) 2 '2行目よみこみ 3 Line Input #txtnum, line1 4 If InStr(line1, "東京") > 0 Then 5 tokyoFlg = "1" 6 Else 7 8 If tokyoFlg = "1" Then 9 10 '2行目が空 11 If line1 = "" Then 12    MsgBox "不正なデータが含まれているため処理を終了します" 13 End 14 End If 15  3行目読み込み 16 Line Input #txtnum, line2 17 18 '2行目日付を取得 19 data = getdata(line1, data) 20 21  '3行目が空 22  If line2 = "" Then 23   MsgBox "不正なデータが含まれているため処理を終了します" 24 End 25  End If 26 27 '3行目場所を取得 28 citydata = getcitidata(line2, citydata) 29 30 Print #filenum, data,citydata 31 '初期化 32 data = "" 33 citydata = "" 34 tokyoFlg = "" 35End If 36g = g + 1 37End If 38Loop

テキストファイルのイメージとしては、
東京
2018/08/29 はれ
大田区
東京
2018/08/30
世田谷区 くもり

こんな形で東京という行から2行分から必要な部分を抽出し出力させたいです
現在きちんと東京から2行分のデータがあればエラーもなく正常処理として終わるのですが、
たとえば、

東京
2018/08/29 くもり
大田区
東京
2018/08/29 はれ

こんな形で2行分きちんとデータがないときにエラーをだして処理を終了させたいです
データがないと
3行目読み込み
Line Input #txtnum, line2
の部分でエラーが出ます
もちろん次の行が読み込めないのでエラーになるのはわかるのですが、東京から次の一行目(日付、天気の行)は存在し、その次がない場合のエラー処理方法がよくわかりません

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

追記
皆様回答ありがとうございました
一番シンプルに解決したものをBAにさせていただきました

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

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

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

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

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

guest

回答3

0

次の関数を呼出して、全部読込んでから処理した方がエラーもなく、効率が良いと思います。

※pathSRC: ファイルのFull Path

使用例: 

txtTEST = ReadTxt("C:\Temp\Test.txt")
For Each L In Split(txtTEST, vbCrLf)
...
Next

Function ReadTxt(pathSRC) As String Set objFS = CreateObject("Scripting.FileSystemObject") ReadTxt = objFS.OpenTextFile(pathSRC, 1).ReadAll Set objFS = Nothing End Function

投稿2018/08/29 07:23

paolo.ahn

総合スコア73

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

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

0

まず、「End」を使うのは禁止してください。
これはプログラムを強制終了させるもので、
Exit Do, Exit For, Exit Function, Exit Sub 等とする方が無難です。

インデントは下記のように揃えた方が見やすいです。

そして処理は、東京を1番目とするデータセットなので、
その通りにデータが何番目なのかカウントするようにすれば、
処理が明確かつ簡単になります。

読込処理を複数書くのは、メンテしにくいと思うので
1か所だけにした方が分かりやすい気がします。

そして処理の最後にちゃんとテキストファイルを閉じてください。

VBA

1 Do Until EOF(txtnum) 2 3 G = G + 1 4 5 '1行よみこみ 6 Dim LineVal As String 7 Line Input #txtnum, LineVal 8 9 If InStr(LineVal, "東京") > 0 Then 10 Dim LineNo As Long 11 LineNo = 1 12 Else 13 LineNo = LineNo + 1 14 End If 15 16 Select Case LineNo 17 Case 1 '東京 18 'データのセット数をカウント 19 Dim DataNo As Long 20 DataNo = DataNo + 1 21 22 Case 2 '日付 23 '2行目が空 24 If LineVal = "" Then 25 MsgBox "不正なデータが含まれているため処理を終了します" 26 Exit Do 27 End If 28 29 '2行目日付を取得 30 Dim DateVal As String 31 DateVal = GetData(LineVal, Data) 32 33 Case 3 '区 34 '3行目が空 35 If LineVal = "" Then 36 MsgBox "不正なデータが含まれているため処理を終了します" 37 Exit Do 38 End If 39 40 '3行目場所を取得 41 citydata = getcitidata(LineVal, citydata) 42 43 '書込み 44 Print #FileNum, Data, citydata 45 46 '初期化 47 Data = "" 48 citydata = "" 49 End Select 50 51 Loop 52 53 'Close処理(txtnum、FileNumともに必須)

投稿2018/08/29 06:23

ExcelVBAer

総合スコア1175

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

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

0

ベストアンサー

EOFでも構わず読む進めてしまっているのが原因ではないでしょうか。
現状読み込み結果が空文字かどうかで判定しているので、EOFかEOFではないときに読み込んだデータが空文字ならエラーにするべきです。
というわけでLine Input を関数化してしまうのが手っ取り早い対応かと思います。

VBA

1' 読み込み処理 2Function GetLine(txtnum As Integer) As String 3 If EOF(txtnum) Then 4 GetLine = "" 5 Else 6 Line Input #txtnum, GetLine 7 End If 8End Function

Line Input のところはこんな感じにする。

VBA

1 Line Input #txtnum, line1 23 line1 = GetLine(txtnum)

投稿2018/08/29 04:26

ttyp03

総合スコア16998

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問