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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

0回答

291閲覧

VBAを使用してテキストファイルを読み込みたい

s.s.s.s.

総合スコア3

VBA

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2022/05/23 11:31

編集2022/05/23 13:57

はじめまして。プログラミング初心者です。
この度VBAを使用して以下のようなプログラムを作りたいです。

【作成したいプログラム】
①Excel上でボタンを押下
②フォルダを選択
③「sh~」で始まるファイル以外のテキストファイルをすべて1行ずつ読み込む
④③で読み込んだ内容から以下の内容を抽出しエクセルに張り付ける
・日付(行頭~23文字)(Excel:A2~)
・ファイル名(Excel:B2~)
・件数(「~ 件数=○○)」の○○部分のみ抽出)(Excel:C2~)

現在、①②はできているのですが、③④で躓いています。

【現状】
・ファイルのフルパスを取得後、MsgBox FilePath(i)で中身が正しく出力されている
⇒取得したパスを使用し、フォルダの中を1行ずつ見る、という方法がわからない。
・(内容を編集した結果手前でエラーが出てしまって今はでないのですが)
エクセルに結果を出力した際、文字化けしてしまっている
⇒UTF-8にしたい
・日付、ファイル名、件数にそれぞれ変数を指定し結果を得たいが
型が間違っていますというエラーが出てしまって設定できない。

【発生しているエラー】
・実行時エラー55 ファイルは既に開かれています。

初めて書いたコードなのであきれてしまうような内容かもしれませんが、
これから習得したいと頑張っておりますのでどなたか模範解答、またはアドバイス
頂けますと幸いです。よろしくお願いします。

また、VBAを習得するにあたりおすすめの書籍等ありましたら
教えていただけると嬉しいです。

※途中MsgBoxがあるのは確認用です。
※変数の宣言が途中コメントになっているのはインターネットから引用したものを
自分で先頭に宣言するよう編集したため、残しておこうとコメントにしました。

Sub GetAllTextData() ' '【変数の宣言】 ' Dim Fname Dim FSO As Object Dim Folder As Variant Dim File As Variant Dim FilePath As Variant Dim Hozon As Variant Dim GetData As Variant 'フォルダ指定用のダイアログを表示します With Application.FileDialog(msoFileDialogFolderPicker) 'カレントディレクトリを指定します .InitialFileName = ThisWorkbook.path '設定しなかったら終了します If .Show = False Then Exit Sub '設定したフォルダを表示します 'Dim Fname Fname = .SelectedItems(1) End With '参照設定 'Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") 'Dim FilePath As Variant ReDim FilePath(1 To 100) As Variant '指定フォルダ内の.logファイルを探索します i = 0 For Each File In FSO.GetFolder(Fname).Files If InStr(File.Name, "sh") > 0 Then i = i + 1 Else If InStr(File.Name, ".log") > 0 Then i = i + 1 FilePath(i) = File.path 'ファイルのフルパスを取得 MsgBox FilePath(i) End If End If Next '配列の大きさは状況に応じ変更してください 'Dim Hozon, GetData As Variant ReDim GetData(1 To 100, 1 To 100) As Variant '全テキストファイルの任意行のデータを取得する m = 0 For k = 1 To UBound(FilePath, 1) 'テキストファイルが存在する場合に実行 If IsEmpty(FilePath(k)) = False Then '保存する配列を空にする ReDim Hozon(1 To 100, 1 To 100) As Variant 'テキストを開いて配列にデータを保存 Open FilePath(k) For Input As #1 Line Input #1, buf tmp = Split(buf, vbLf) '改行コードで分割 For i = 1 To UBound(tmp) - 1 'インデックス番号の最大値-1まで繰り返し LogDate = Left(tmp(i), 23) 'FileType = workbok(FilePath).Name '件数の取得 abc = Mid(tmp(i), InStr(tmp(i), "件数=") + 1) CaseNum = Left(abc, InStr(abc, ")") - 1) Cells(i + 1, 1).Resize(1, UBound(tmp) + 1).Value = LogDate 'Cells(i + 1, 2).Resize(2, UBound(tmp) + 1).Value = FileType Cells(i + 1, 3).Resize(3, UBound(tmp) + 1).Value = CaseNum ' Cells(i + 1, 1).Resize(1, UBound(tmp) + 1).Value = abc Next i End If Next End Sub

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

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

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

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

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

dodox86

2022/05/23 12:44

> ①Excel上でボタンを押下 > ②フォルダを選択 > ③「sh~」で始まるファイル以外のテキストファイルをすべて1行ずつ読み込む > ④③で読み込んだ内容から以下の内容を抽出しエクセルに張り付ける > ・日付(行頭~23文字)(Excel:A2~) > ・ファイル名(Excel:B2~) > ・件数(「~ 件数=○○)」の○○部分のみ抽出)(Excel:C2~) それぞれを個別にみて、結局どれが理解し、動いていてどれが理解できなく、動いていないでしょうか。あれもこれも分からない状況だと完成はおぼつかないので、ひとつひとつ確実に片づけましょう。そしてなるべくトピックを絞って質問するのが有用な回答をいただくコツです。 [質問するときのヒント] https://teratail.com/help/question-tips [推奨していない質問] https://teratail.com/help/avoid-asking > 思うように動かず修正を繰り返しているうちに今まで動いていた部分もエラーが返ってくるようになってしまいました… 「ここまではちゃんと動いた」と言う時点でそれぞれバックアップしましょう。経験者は普通にやっています。 また「エラーが返った」と言われてもその再現ができない閲覧者、回答者には実際に試さない限り分かりません。詳細を質問文中に示しましょう。そういった注意事項はteratailに限りません。
s.s.s.s.

2022/05/23 13:45

ありがとうございます。質問内容を再度修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問