忍者ブログ

フォルダ内のCSVファイルをエクセルシートに転記

2020年02月05日
今回はCSVファイルの転記について。

携帯電話の通話料に応じて費用按分をしているのだが、
回線ごとの通話料は利用明細を見ないとわからない。

仕方なく、回線ごとにシートを分けて利用明細をコピペしていたが、
いい加減めんどくさくなったので、
回線ごちゃまぜで1つのシートにまとめて
表計算で集計することにした。


ダウンロードしたデータのファイル名に回線名の記載がない。
同じデータを2つダウンロードしていても気づかないので
Dic配列を使って重複は排除することにした。

また例によって、オフィス田中氏のHPにお世話になりました。
    'ファイルの一覧を取得
    'http://officetanaka.net/excel/vba/file/file07.htm
    '
    'テキストファイルを読み込む
    'http://officetanaka.net/excel/vba/file/file08b.htm


処理の流れは以下のとおり。

まず対象のフォルダを指定。今回は一発ものなので固定。

dir関数を使ってフォルダ内のファイルを取得。
対象ファイルがなくなるまでループ。

 dir関数で取得したファイルからフルパスを取得してファイルを開く。

  各行のデータをDic配列に格納
  (新出なら格納、既出なら値に目印を追加)

Dicの値をA列へ、キーをB列へ出力。

キー配列から区切り文字でsplitして、出力配列に格納。

C列以降に出力配列を格納。

そんな感じで、以下ソース。

Sub フォルダ内のCSVファイルを転記()
    
    Const Path As String = "D:\Dropbox\xlsエクセル関連\IIJ 通話ログ\ログ\"
    Const EXT = "*.csv"
    
    Dim fName As String:    fName = Dir(Path & EXT)
    Dim Dic, buf As String
    Set Dic = CreateObject("Scripting.Dictionary")
    Do While fName <> ""
        Open Path & fName For Input As #1
        'ファイルを開いて
            Do Until EOF(1)
                Line Input #1, buf
                If Not Dic.exists(buf) Then
                    Dic.Add buf, fName  '新規キーを登録 値は1
                Else
                    Dic(buf) = Dic(buf) & "†" '既出のキーは、ファイル名に印
                End If
            Loop
            Close #1
        fName = Dir()
    Loop
    
    Dim Keys, Items
    Keys = Dic.Keys
    Items = Dic.Items
    
    Dim iRowMax:        iRowMax = UBound(Keys) - LBound(Keys) + 1
    Cells(2, 1).Resize(iRowMax, 1).Value = WorksheetFunction.Transpose(Items)   'ファイル名
    Cells(2, 2).Resize(iRowMax, 1).Value = WorksheetFunction.Transpose(Keys)    'CSVデータ(生)
    Cells(1, 1) = "ファイル"
    Cells(1, 2) = "CSV生データ"
    
    Dim tmp: tmp = Split(Cells(2, 2), ",")
    Dim iColMax: iColMax = UBound(tmp, 1) - LBound(tmp, 1)
    Dim Arr():    ReDim Arr(iRowMax, iColMax)
    
    Dim i As Long, j As Long
    For i = 0 To UBound(Keys)
        tmp = Split(Keys(i), ",")
        For j = 0 To iColMax
            Arr(i, j) = Replace(tmp(j), """", "")
        Next j
    Next i
    
    Cells(2, 3).Resize(iRowMax, iColMax + 1).Value = Arr
    
End Sub

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字