はじめまして。プログラミング初心者です。
この度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
あなたの回答
tips
プレビュー