プロが教える店舗&オフィスのセキュリティ対策術

1週間程ずっと調べているのですがどうしてもわからず質問させていただきます。

システムから売上日計を集計するとCSVファイルとして出力されます。
ファイル名は20230826160630(西暦年月時分秒)_general_purpose.csvとなります。
そのファイルをエクセルに取込み、毎月の集計を行いたいのです。


例えば  集計するエクセルのSheet1(”データ”と名前を設定しています)に月曜日の日計を取り込むところまではできましたが、火曜日のCSVファイルを取り込もうとしたら月曜日の日計が上書きされてしまいます。
私としては、月曜日のデータの下の行に火曜日のデータ、水曜日のデータが取り込めたらいいなと思っています。

ちなみに売上日計ですので月曜日が10行分のデータだったり、火曜日は15行分のデータだったりします。

例)A1~A10は月曜日のデータが反映
  A11~A25は火曜日のデータが反映
  A26~A37は水曜日のデータが反映
  ▽
  ▽
  ▽
  1か月分すべてSheet1(”データ”)に反映

わかりにくいかもしれませんが、ご教示お願いいたします。

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

  • うーん・・・

    このような場合の構文はどのようなものか教えていただきたいです。
    よろしくお願いします

      補足日時:2023/08/26 16:34
  • 2. CSVファイルのA1:AC14迄は関係ない項目なので消します。
        A       B   C   D     E     F ・・・・・
    14  伝票No    日付  商品  売上個数  売上金額  
    15  1234    8/28  イチゴ  10     2000
    16  2345    8/28  みかん  15     2500
    18  3456    8/28  りんご  10     2000
    19  4567    8/28  ぶどう  10     3000
    というような表です。項目はAからAC、行はその日の売上次第で変わります。
    3  実際のCSVファイルのA列は”伝票番号”です。
    4  フォルダは毎日CSVファイルを入れていくので増えていきます。
    5  仮に8月が終われば8月用のフォルダを作成して手作業で保存していこうと思っています。

    No.4の回答に寄せられた補足コメントです。 補足日時:2023/08/28 14:40
  • HAPPY

    これですこれです!!!!!!!!!!!!!!!!
    嬉しすぎて感動しました。
    本当にありがとうございました!
    前回も適格な回答いただき本当に感謝しております。
    ベストアンサーに選ばせていただきます。

    No.6の回答に寄せられた補足コメントです。 補足日時:2023/08/29 10:45

A 回答 (6件)

今まで出力した行の次の行から今回分を出力するようにしました。


尚、添付図のように1行目は、見出し行を作成しておいてください。
最初は、2行目から出力します。
CSVファイルの1~14行は、読み捨てるようにしました。
CSVファイルの15行以降からexcelのシートに取り込むようにしています。

Sub CSV入力1()
Dim varFileName As Variant
Dim intFree As Integer
Dim strRec As String
Dim strSplit() As String
Dim i As Long, j As Long
Dim maxrow As Long
Dim wrow As Long
varFileName = Application.GetOpenFilename(FileFilter:="CSV〇〇店売上日計(*.csv),*.csv", _
Title:="CSVファイルの選択")
If varFileName = False Then
Exit Sub
End If
maxrow = Cells(Rows.Count, "A").End(xlUp).Row '最終行取得
wrow = maxrow + 1 '書き込み開始行
intFree = FreeFile '空番号を取得
Open varFileName For Input As #intFree 'CSVファィルをオープン

i = 0

Do Until EOF(intFree)
Line Input #intFree, strRec '1行読み込み
i = i + 1
'最初の1~14行はスキップする。15行以降を処理する
If i > 14 Then
strSplit = Split(strRec, ",") 'カンマ区切りで配列へ
For j = 0 To UBound(strSplit)
Cells(wrow, j + 1) = strSplit(j)
Next
wrow = wrow + 1
End If
Loop

Close #intFree
End Sub
「VBA 毎日取得するデータを順番に反映し」の回答画像6
この回答への補足あり
    • good
    • 2
この回答へのお礼

ありがとうございます!!!!!!!
仕事のあとにやってみます!!!!

お礼日時:2023/08/28 17:35

わかりにくいかもしれませんが、わたしが書くなら、こんな感じです。


とりあえず、取り込むファイル名は固定で書いています。ループもしていません。なので、実行する度に、同じデータが下に追加されます。
ループ、および、ファイル名の変更は、ご自分で追加してください。

Sub sample()

With Sheet1.QueryTables.Add(Connection:="TEXT;C:\temp\20230826160630(1暦年月時分秒)_general_purpose.csv", _
Destination:=Sheet1.Cells(Rows.Count, "A").End(xlUp).Offset(1))
.AdjustColumnWidth = False
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileCommaDelimiter = True
.Refresh 'BackgroundQuery:=False

.Delete
End With

End Sub
    • good
    • 3
この回答へのお礼

ありがとうございます。やってみます!

お礼日時:2023/08/28 14:41

>このような場合の構文はどのようなものか教えていただきたいです。



1.現在のマクロの内容を提示してください。
2.CSVファイルの具体的な内容
(社外秘の場合は、レイアウトが判れば良いので、具体的な値は改ざんしたもで良いです)
3.A列にはCSVファイルのどの項目を設定しているのでしょうか。
4.特定のフォルダ内にCSVファイルが出力されると思いますが、
そのフォルダ内には、対象となるCSVファイルは複数ある場合もあるのでしょうか。(1回のマクロで複数のCSVファイルを処理)
5.処理済みとなったCSVファイルは、手作業などで、他のフォルダに移動しているのでしょうか?

上記の点が不明です。不明点が解消すれば良い回答がつきやすくなるかと。
この回答への補足あり
    • good
    • 1
この回答へのお礼

ありがとうございます。遅くなりすみません。
Sub CSV入力1()
Dim varFileName As Variant
Dim intFree As Integer
Dim strRec As String
Dim strSplit() As String
Dim i As Long, j As Long
varFileName = Application.GetOpenFilename(FileFilter:="CSV〇〇店売上日計(*.csv),*.csv", _
Title:="CSVファイルの選択")
If varFileName = False Then
Exit Sub
End If

intFree = FreeFile '空番号を取得
Open varFileName For Input As #intFree 'CSVファィルをオープン

i = 1

Do Until EOF(intFree)
Line Input #intFree, strRec '1行読み込み
i = i + 1


strSplit = Split(strRec, ",") 'カンマ区切りで配列へ
For j = 0 To UBound(strSplit)
Cells(i, j + 1) = strSplit(j)
Next
'配列をそのまま入れる方法も、ただし全て文字列として入力される
'Range(Cells(i, 1), Cells(i, UBound(strSplit) + 1)) = strSplit
Loop

Close #intFree

Rows("1:14").Delete
End Sub

これをコピペしてファイル名を変えてしてみました。こうすると1日分だけは
反映しますが、次の日は昨日の分のデータを上書きされてしまいます。

お礼日時:2023/08/28 14:27

CSVファイルのレイアウト、及び内容が不明


売上日計の集計の仕方が不明
なので、一般論になりますが、
何行まで集計したかを把握し、その次の行から集計を行えば良いのではないでしょうか。

1.A1,A2,A3...の順にセルの内容をチェックする。
2.空白のセルが出現したら、その行から編集を開始する。
例えば、A2が空白なら、A2から編集を行う。
    • good
    • 1
この回答へのお礼

ありがとうございます。
VBAを勉強したのが2年前で構文がわからずですが
教えてくださったことをヒントに調べてみます。

お礼日時:2023/08/26 17:27

こんにちは



単純に行うなら、記入する際にシートの「最終行の次の行」から記入するようにしておけば、順次データが蓄積されるようになります。
(推測するところ、現状は常に1行目(または2行目?)から、記入するようになっているのではないでしょうか?)

ただし、これだと同じ日に(誤って)2回実行すると、同じ内容のデータが書き足されてしまうということが起こり得ます。
(出力CSVは、必ず一日に一つだけという仮定ですが・・)

データ構成を変更しても良いのなら、A列(他の列でも良いです)に日付を付しておくことでデータの識別が可能になりますので、最初に日付を照合してから記入するようにすれば上記のようなことを防ぐことも可能になるでしょう。
(何らかのおかしな点があって、元データと照合したいような場合にも有効と思います。)
    • good
    • 1
この回答へのお礼

ありがとうございます。
以前も教えてくださった方ですね。いつもありがとうございます。
教えてくださったことをヒントに調べてみます。

お礼日時:2023/08/26 17:27

ご自身が「こういうふうに日々のCSVファイルを読み込みたい」と思う仕様を整理して、エクセルVBAを使って、プログラムを作ってあげたらいいと思います。

    • good
    • 1

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