[[20201016104238]] 『別のシートの3行目のデータを抽出してメインシー』(syoko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『別のシートの3行目のデータを抽出してメインシートでリストを作成したい』(syoko)

お世話になっております。

みだしのことについてですが、デスクトップの画面に顧客情報を抽出したファイルが50個あります。

ファイル名は1.csv〜50.csvと名前を付けています。

ファイルの中身
[A1]データを抽出した日付(1〜50のファイルすべて同じ日付です)
[A2]整理番号[B2]登録番号[C2]名前[D2]住所[E2]電話番号~~省略~~[AE2]その他情報
2行目に、項目名がありAE2のセルまで項目が入力されています。

[A3]11320001[B3]8024[C3]田中雄一[D3]東京都千代田区○ビル201[E3]08021451245~~省略~~[AE2]特になし

3行目に項目の顧客情報が入力されています。

【実現したいこと】
1.csvファイルの4行目以降に、2.csv〜50.csvファイルの3行目のデータのみ
抽出したデータを貼り付けて、リストを作りたいです。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 とりあえずのマクロのサンプルです。
 出力は 1.csv ではなく all.csv というファイルにしています。

 Sub LoadCSV50()
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim deskTopPath
    deskTopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")

    Dim msg
    msg = ""

    Dim dstPath    '// 出力ファイルパス
    dstPath = deskTopPath & "\all.csv"

    Dim dstCSV
    Set dstCSV = fso.CreateTextFile(dstPath, True)

    Dim csvPath

    Dim csvNum
    For csvNum = 1 To 50
        csvPath = deskTopPath & "\" & csvNum & ".csv"
        If fso.FileExists(csvPath) = True Then
            With fso.OpenTextFile(csvPath)
                If csvNum = 1 Then
                    dstCSV.WriteLine .ReadLine()
                    dstCSV.WriteLine .ReadLine()
                    dstCSV.WriteLine .ReadLine()
                Else
                    .ReadLine '// 空読み
                    .ReadLine '// 空読み
                    dstCSV.WriteLine .ReadLine()
                End If
            End With
        Else
            msg = msg & vbNewLine & csvNum & ".csv"
            If csvNum = 1 Then Exit For
        End If
    Next

    If msg = "" Then
        msg = "処理が完了しました。"
    Else
        msg = "下記のファイルがありません" & msg
    End If
    MsgBox msg
 End Sub

(QS) 2020/10/16(金) 11:35


QS 様

すごいですね!完璧に動作しました。
C&Pも覚悟していましたが、処理も一瞬で終わり感動しました。

VBAに関してほとんど無知なので、勉強のためにもしよろしければ
教えてほしいのですが、、

If csvNum = 1 Then

                    dstCSV.WriteLine .ReadLine()
                    dstCSV.WriteLine .ReadLine()
                    dstCSV.WriteLine .ReadLine()

上記は、1〜3行目をall.csvファイルに書き込む
読み込んだファイルが1.csv以外の数字であれば

Else

                    .ReadLine '// 空読み
                    .ReadLine '// 空読み
                    dstCSV.WriteLine .ReadLine()

1行目、2行目は空読み
3行目のみ読み込んで、all.csvファイルに書き込み。
という認識であっていますか?

.readlineというのは、行数を指定できないので
あえて空読みをしているのでしょうか?

(syoko) 2020/10/16(金) 13:35


 うまく動いたようで何よりです。
 ご質問の点は推測されているとおりです。

 一度に読み込んで行を処理する方法もありましたが、3行だったので今回は行単位で読み込みました。
 行を指定するのであれば、

 AllLines = Split(.ReadAll(),vbNewLine)
 のように、全体を読み込んで改行コードで分割して配列にしておけば
 AllLines(0) のように行を指定できます。

 ただインデックスが 0 からなので、行の指定は(行-1) を指定する必要がありますが、指定する行が
 多い場合はこの方が良いかもしれません。
(QS) 2020/10/16(金) 14:22

なるほどなるほど。

これからも他の業務で使えそうなので、試行錯誤しながら応用してみます!
本当にありがとうございました!
(syoko) 2020/10/16(金) 16:54


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.