さっきの続きです。

コードが長くなりすぎたので、いったん今までのコード、全部消します。

さて、今度はCSVファイルの取り扱いです。

どのCSVファイルを処理するのか?ですが、プログラムの中で処理をするCSVを1つ1つ指定するのも面倒なので、 特定のフォルダに入っているCSVファイルを全部処理する って感じにしてみたいと思います。

195-01.jpg

こんな感じで、c:¥csv¥の中に、入ってるとします。

特定のフォルダ内のCSVファイルを全部探して、一つ一つのファイルを処理していくにはどうしたらよいのかな?

Yahoo!で「vba フォルダ内 ファイル」で検索すると、、、こちらDir関数を用いた単一フォルダ内のファイル一覧がわかりやすかったです。

Sub test()

    Dim sagasuFilemei   As String
    Dim sagasuFoldermei As String
    
    sagasuFoldermei = "c:¥csv¥"
    
    ' 先頭のファイル名の取得
    sagasuFilemei = Dir(sagasuFoldermei & "*.csv", vbNormal)
    
    ' ファイルが見つからなくなるまで繰り返す
    Do While sagasuFilemei <> ""
        
        'ファイル名をイミディエイトウィンドウに表示します
        Debug.Print (sagasuFilemei)
        
        ' 次のファイル名を取得
        sagasuFilemei = Dir()
    
    Loop

End Sub

sagasuFoldermeiというフォルダがcsvを探すフォルダ名です。
とりあえず、見つけたファイルをイミディエイトウィンドウに表示してみます。
実行してみると、
195-02.jpg
ん、表示しきれてませんが、全部取り出せました(^^)
んでは、この1つ1つのCSVファイルを開いて、中を見ていきたいと思います。
VBAでCSVファイルを扱うにはどうしたらよいのか、
Yahoo!で、「VBA CSV」で検索してみると、 こちらのページが見つかりました。
こちらのページの下のほうのサンプルを参考にして作ってみます。
これもプログラムが長くなりそうなので、いったん消します。

Sub test()
    
    Dim sagasuFilemei        As String
    Dim fileno               As Long
    Dim line, barabaraline() As String
    
    sagasuFilemei = "c:¥csv¥20080101.csv"
    
    '空いているファイル番号を取得します
    fileno = FreeFile
    
    'sagasuFilemei のファイルをオープンします
    Open sagasuFilemei For Input As #fileno
    
    'ファイルの終端まで繰り返します
    Do While Not EOF(fileno)
        
        '1行読み込みます
        Line Input #fileno, line
        
        'カンマで各項目をばらばらにします
        barabaraline() = Split(line, ",")
        
        'とりあえず、イミディエイトウィンドウに表示します
        Debug.Print (barabaraline(0) & "-" & barabaraline(1) & "-" & barabaraline(2))
    
    Loop
    
    'ファイルを閉じます
    Close #fileno

End Sub

とりあえず、20080101.CSVの中に入っているデータを1行ずつ抜いていくプログラムです。

ファイルを開き、一行読み込み、その読み込んだ内容をカンマで区切って配列に入れ、その配列の値をイミディエイトウィンドウに表示する、というものです。

実行すると、

195-03.jpg

ん、3000行近くありますから、表示するのも時間がかかります(^^;)

おっけい。後は一行ずつ抜き出していくときに、今探しているシートのID,世代番号のデータが見つかったら、その情報を今探しているシートにどんどん追加していく、って感じですね。

一気にプログラムにしちゃいます。今のプログラムも削除して、全部組み込んだ形で作り直します。

Sub test()
    Dim tuikaWorksheet       As Worksheet
    Dim lastgyou             As Integer
    Dim i                    As Integer
    Dim mituketaGyousuu      As Integer
    Dim tuikaSheetmei        As String
    Dim saigoSheetmei        As String
    Dim sagasuID             As String
    Dim sagasuSedaibangou    As Integer
    Dim objSheet             As Object
    Dim sagasuFilemei        As String
    Dim sagasuFoldermei      As String
    Dim sagasuFile           As String
    Dim fileno               As Long
    Dim line, barabaraline() As String
    
    sagasuFoldermei = "c:¥csv¥"
    
    'Sheet1以外のシートを全部消します。
    Application.DisplayAlerts = False
    For Each objSheet In ActiveWorkbook.Sheets
        If objSheet.Name <> "Sheet1" Then
            ActiveWorkbook.Worksheets(objSheet.Name).Delete
        End If
    Next
    Application.DisplayAlerts = True
    
    '最後の行を求めます
    lastgyou = Sheets("Sheet1").Range("A1").End(xlDown).Row
    
    '1行目から最後の行まで、Sheet2にコピーします。
    For i = 1 To lastgyou
        
        ' Sheet1 の i 行目の値で追加するシート名をtuikaSheetmeiに代入します。
        tuikaSheetmei = Sheets("Sheet1").Cells(i, 1).Value + "-" + Trim(Str(Sheets("Sheet1").Cells(i, 2).Value))
        
        '最後のシート名を取得します。
        saigoSheetmei = ActiveWorkbook.Sheets(ActiveWorkbook.Worksheets.Count).Name
        
        '最後のシートの後ろにワークシートの追加をします。
        Set tuikaWorksheet = Sheets.Add(After:=Worksheets(saigoSheetmei))
        
        '追加したワークシートの名前を変更します。
        tuikaWorksheet.Name = tuikaSheetmei
        
        'これから探すIDと世代番号を変数に入れておきます。
        sagasuID = Sheets("Sheet1").Cells(i, 1).Value
        sagasuSedaibangou = Sheets("Sheet1").Cells(i, 2).Value
        
        '見つけた行数を0にしておきます。
        mituketaGyousuu = 0
        
        '指定されたフォルダの全てのCSVファイルについてテキストを探します。
        
        ' 先頭のファイル名の取得
        sagasuFilemei = Dir(sagasuFoldermei & "*.csv", vbNormal)
        
        ' ファイルが見つからなくなるまで繰り返す
        Do While sagasuFilemei <> ""
            
            '空いているファイル番号を取得します
            fileno = FreeFile
            
            'sagafuFolderMei のフォルダの中の、sagasuFilemei のファイルをオープンします
            sagasuFile = sagasuFoldermei & sagasuFilemei
            Open sagasuFile For Input As #fileno
            
            'ファイルの終端まで繰り返します
            Do While Not EOF(fileno)
                
                '1行読み込みます
                Line Input #fileno, line
                
                'カンマで各項目をばらばらにします
                barabaraline() = Split(line, ",")
                
                '今ばらばらにした行が、探しているID、世代番号だったら、
                If barabaraline(0) = sagasuID And Val(barabaraline(1)) = sagasuSedaibangou Then
                    
                    '見つけた行数を1行増やして、
                    mituketaGyousuu = mituketaGyousuu + 1
                    
                    '今のシートに、データを代入します。
                    
                    'A列には、今探しているCSVのファイル名を入れます。
                    Sheets(tuikaSheetmei).Cells(mituketaGyousuu, 1) = sagasuFilemei
                    
                    'B列には、今見つけた行の、送信完了日時(barabaralineの3つめ)を入れます。
                    Sheets(tuikaSheetmei).Cells(mituketaGyousuu, 2) = barabaraline(2)
                End If
            Loop
            
            'ファイルを閉じます
            Close #fileno
            
            ' 次のファイル名を取得
            sagasuFilemei = Dir()
        Loop
    Next
End Sub

(^^;)長っ・・・しかも複雑・・・

mituketaGyousuu という変数を使って、1行見つけたら、この変数を1つ増やし、シート内に、見つけた内容を書き出していく、という感じになってます。

実行してみると。。。

。。。 プログラムが停止するまでにかなーり時間がかかります(^^;)

が、結果こんな感じ。

195-04.jpg

ん、抜き出せました(^^)

ファイルが一杯あるので、ここに圧縮しておいておきます。 vbastudy_18.zip

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 simple blog いろいろ勉強中 Suffusion theme by Sayontan Sinha