🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

2回答

1410閲覧

ipファイルのデータからexcelに出力するVBAを作成したい

Ryzen9

総合スコア2

VBA

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

0グッド

0クリップ

投稿2021/03/25 00:38

編集2021/03/26 11:21

前提・実現したいこと

テキストファイルのデータをexcelのセルに条件付きで書き込むVBAを作成したいのですが、テキストファイルがtxtファイルであれば作成できましたが、テキストファイルの拡張子が「ip」で書き込めるようにしたいです。作成したvbaだとtxtファイルなら上手く書き込めましたが、ipファイルだとうまく書き込むことができませんでした。

出力形式は、
ipファイルの中身が以下になっており、

data
{1997
8400
7777
}
{9111
5555
4444
}

ipファイルからexcelのセルに以下のように出力したいです。

19979111
84005555
77774444

Open "C:\data.txt" For Input As #1 に直接ipファイルを指定したところ、
各セルにデータが割り振られず、一つのセルにすべてのデータが書き出されました。
どなたか詳しい方ご教授ください。

該当のソースコード

Sub fileinput() Dim buf As String Dim r As Long, c As Long Open "C:\data.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf If InStr(buf, "{") Then r = 1 c = c + 1 Cells(r, c) = Mid(buf, 2) ElseIf IsNumeric(buf) Then r = r + 1 Cells(r, c) = buf End If Loop Close #1 End Sub

試したこと

ipファイルをtxtファイルに変更しても、同様に一つのセルにデータが書き出される結果となってしまいます。
また、試しに新たに作成したtxtファイルにipファイルのデータをコピー&ペーストしたところ、以下のエラーが発生しました。
「実行時エラー:1004 アプリケーション定義またはオブジェクト定義のエラーです。」
該当するソースコードは、Cells(r,c) = bufとなりました。

バイナリダンプ

↓txtファイル ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ------------------------------------------------------------------------------ 00000000 64 61 74 61 0D 0A 7B 31 39 39 37 0D 0A 38 34 30 data..{1997..840 00000010 30 0D 0A 37 37 37 37 0D 0A 7D 0D 0A 7B 39 31 31 0..7777..}..{911 00000020 31 0D 0A 35 35 35 35 0D 0A 34 34 34 34 0D 0A 7D 1..5555..4444..} ↓ipファイル ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ------------------------------------------------------------------------------ 00000000 64 61 74 61 0A 7B 31 39 39 37 0A 38 34 30 30 0A data.{1997.8400. 00000010 37 37 37 37 0A 7D 0A 7B 39 31 31 31 0A 35 35 35 7777.}.{9111.555 00000020 35 0A 34 34 34 34 0A 7D 5.4444.}

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

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

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

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

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

Ryzen9

2021/03/25 01:57

拡張子がipに変わっただけなので、その認識で合っています。 混在してしまい申し訳ありません。文章を修正致しました。 ipファイル自体は私自身よく分かりませんが、書き出したいテキストファイルの拡張子がipだったということです。
YT0014

2021/03/25 02:53

対象のIPファイルを、バイナリダンプでご提示ください。 改行などのコードが異なる可能性があります。
Ryzen9

2021/03/25 03:55

知識不足で申し話ありませんが、バイナリダンプはこのような提示方法でよろしいでしょうか? 提示箇所は、質問内容に追記致しました。
guest

回答2

0

ダンプファイルを見ると、改行コードが異なることが分かります。

txtファイルは、0D 0A、aiファイルは、0Aのみになっています。
なお、0DはCR、0AはLFを示す値です。
「CR」と「LF」の違い

Line Input での行は、CRLFの連続のみを区切りとする仕様なようで、LFのみaiファイルでは、全体が1行として読込まれることになります。

解決方法としては、Line Inputで読込んだデータを、コードを追加して、LFで複数行に区切るなどの方法があります。

LFコードで改行したファイルを読み込む

投稿2021/03/25 04:14

YT0014

総合スコア1748

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

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

Ryzen9

2021/03/26 11:16

同じデータでも拡張子が違うとダンプファイルが異なるのですね! わざわざCRやLFの解説まで教えて下さり、ありがとうございます。 とても勉強になりました!「LFコードで改行したファイルを読みこむ」を参考にトライしてみます!
YT0014

2021/03/26 11:25

いえ、拡張子ではなく、ファイル個々の問題です。 Unix系の場合、txtファイルやCSVファイルでも、LFが標準です。 その為、対象ファイルがどういうフォーマットなのかの仕様を、常に確認してから、コーディングしてください。
Ryzen9

2021/03/29 06:48

ご指摘ありがとうございます!トライした結果上手く出力できました。
guest

0

ベストアンサー

こういうことですかね。

VBA

1Sub fileinput() 2 Dim buf As String 3 Dim r As Long, c As Long 4 Open "C:\data.ip" For Input As #1 5 Line Input #1, buf 6 Close #1 7 8 Dim v As Variant 9 For Each v In Split(buf, vbLf) 10 If InStr(v, "{") Then 11 r = 1 12 c = c + 1 13 Cells(r, c) = Mid(v, 2) 14 ElseIf IsNumeric(v) Then 15 r = r + 1 16 Cells(r, c) = v 17 End If 18 Next 19End Sub 20

投稿2021/03/25 22:53

jinoji

総合スコア4592

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

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

Ryzen9

2021/03/29 06:49

すみません。わざわざソースコードまで記入してもらったのに見落としていました。私の方でもこちらのソースコードで試したところ、上手く出力できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問