プロが教えるわが家の防犯対策術!

父親が自営でパソコンに詳しくなく、コピペで行なっている作業を楽にさせたいのですが皆様、お力をお貸しください!

前提
あるフォルダにCSVが10〜50程が保管
データは6000行一定
項目は2行目にあり、A2〜N2は全て同じ
A:日付、B:時間、C:仕入れ値、、、N:売上げ
書込み先にも上記と同じ項目を準備

作りたい内容
①前回取得したデータの消し込み("A3:N"&cmax)
②取り込みたいフォルダー内のCSVを複数選択ができるようにしたいです。
③書込み先はマクロシート内の指定したワークシート("データ")A3から書込み
④1つ目のファイルは3行目から取り込み
⑤2つ目ファイルから1669行以降を③に連結

上記のような条件で作る事は可能なのでしょうか?

質問者からの補足コメント

  • 早速、ありがとうございます。
    読み込みの順番はファイル名順
    ファイル名は20210928〜20121210.csvの日付になってます。

    当方は多少のVBA経験はありますがこのようなファイル読み込みからの経験がありませんので皆様のお知恵をお借りできれば幸いです。

      補足日時:2021/12/10 16:36

A 回答 (7件)

Windowsのコマンドでファイルを結合する:


https://qiita.com/5zm/items/6688ded69d2ddc4bec10
    • good
    • 0

>20121210.csvの日付になってます。



過去?それとも2021年?
又は『今日?』

>ファイル名は20210928〜20121210.csvの日付になってます。

この中からチョイスしたファイルの内、古い方が④で新しい方が⑤?
3つ以上チョイスする可能性があるなら、一番古いのが④で残りは⑤?
    • good
    • 0

No.4です


filePathの "C:\temp\test\" の部分は
ファァイルを保存しているフォルダに変更してください
    • good
    • 0

詳細が不明ですが


①書き込み先にある「A3」から「Nのデータがある行」までのデータを削除する
②補足にある20210928〜20121210.csvのファイルすべてを選択する
④1つ目のファイルは、3行目から6000行目までを取り込む
⑤2つ目以降のファイルは、すべて1669行目から6000行目までを取り込む
ということであれば、以下でどうでしょうか。
取り込む行数が変わった場合や取り込むファイルが変わった場合に
修正する部分はコメントを付けてみました。

Sub ファイル取り込み()
Dim row As Long
Dim fileNo As Integer
Dim data As String
Dim i As Integer
Dim j As Integer
Dim Buf As Variant
Dim d As Date
Dim fileName As String
Dim filePath As String

Low = Cells(Rows.Count, 1).row
lastLow = Cells(Low, 1).End(xlUp).row
Range(Cells(3, 1), Cells(lastLow, 14)).Clear 'データを消しこむセル

i = 3 '書き込み先ファイルに書き込みはじめる行数
j = 1

d = "2021/09/28" '取り込みたいファイルのはじめの日付

fileName = Format(d, "yyyymmdd")
filePath = "C:\temp\test\" & fileName & ".csv"
fileNo = FreeFile
Open filePath For Input As #fileNo

Do While Not EOF(fileNo)
Line Input #fileNo, data
If j >= 3 Then '1つ目のファイルを取り込みはじめる行数
data = Replace(data, """", "")
Buf = Split(data, ",")
For k = 0 To UBound(Buf)
Cells(i, k + 1) = Buf(k)
Next k
i = i + 1
End If
j = j + 1
Loop

Close fileNo
d = DateAdd("d", 1, d)
fileName = Format(d, "yyyymmdd")
filePath = "C:\temp\test\" & fileName & ".csv"
j = 1

Do While d <= "2021/12/10" '取り込みたいファイルの最後の日付
fileNo = FreeFile
Open filePath For Input As #fileNo

Do While Not EOF(fileNo)
Line Input #fileNo, data
If j >= 1669 Then '2つ目以降のファイルを取り込みはじめる行数
data = Replace(data, """", "")
Buf = Split(data, ",")
For k = 0 To UBound(Buf)
Cells(i, k + 1) = Buf(k)
Next k
i = i + 1
End If
j = j + 1
Loop

Close fileNo
d = DateAdd("d", 1, d)
fileName = Format(d, "yyyymmdd")
filePath = "C:\temp\test\" & fileName & ".csv"
j = 1
Loop

End Sub
    • good
    • 0

No2です。



>ファイル読み込みからの経験がありません
CSVファイルを、まともにテキストファイルとして読み込むと、カンマ区切りを解釈したりクォーテーション(←含まれているのか不明ですが)を解釈したりとそれなりに面倒です。

読み込むのはCSVと限定してもよさそうなので、エクセルのブックとして開いてしまうのが簡単だと思います。(面倒な処理はエクセルがやってくれます)
開いてしまえば、後は、ほとんどがセルの値の転記処理だけのように思えますので・・

◇CSVファイルをブックで開く
https://docs.microsoft.com/ja-jp/office/vba/api/ …
(CSVはカンマ区切りなので、Formatに2を指定しておけばよいでしょう)

>当方は多少のVBA経験はありますが~~
とのことですので、手操作に近い部分であれば「マクロの記録」などを利用すれば、大まかな処理は理解できると思いますので、なさりたいことに合わせて修正なされば宜しいかと。
また、VBAの情報はネットにもたくさん溢れていますので、わからないことは検索すれば大抵出てきます。
コツとしては、複雑な処理を検索しようとせずに、処理を分割して単純なキーワードにして検索することでしょうか。


※ ブックとして開く方法を紹介しましたけれど、これをそのまま行うと、実際には、開いたり閉じたりする際に画面のチラつきが起こる原因となりやすいです。
デバッグが終わった段階で、Application.ScreenUpdatingを利用して、処理中は画面の更新を行わないようにしておことでチラつきの防止が図れます。
また、逐次の更新を省略することで、同時に処理速度の向上も実現できると思います。
https://docs.microsoft.com/ja-jp/office/vba/api/ …

孝行がうまくいきますように。
    • good
    • 1

こんにちは



ご質問文では不明な点が多いですが、基本的にはタイトルにあるように、エクセル上にCSVを必要な部分だけ取り込んだり、一部を削除することだと思いますので、可能性は十分にあると思います。

すでに指摘にあるように、取り込む順序や消去する基準など、ご質問文には記載のない部分もロジカルに判断できるようになっているなら可能です。
反対に、「データを見てみないとわからない」、「データを見て決める」というような判断方法でしたら、難しそうに思います。
    • good
    • 1

②取り込みたいフォルダー内のCSVを複数選択ができるようにしたいです。


④1つ目のファイルは3行目から取り込み
⑤2つ目ファイルから1669行以降を③に連結

複数のCSVファイルを選択して読み込むとして、どのファイルが④でどのファイルが⑤になるとかってどのように決めるのでしょう?
それに連結させたとしてデータ行数が多くなり、扱いやすいのでしょうか?
⇒既にそこは慣れている?

お父さんはともかくとして質問者さんはVBAの経験は多少なりともあると言う前提で宜しいのでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!