こんにちは。よろしくおねがいいたします。
ショップA、B、CのCSVはそれぞれ、カラムの配列が違うんですね?
それを一個の集計シートにまとめたい、というわけなんですね?
すると・・こういうカンジのことでしょうか?
だとすると、それぞれのCSVを個別に読み込んで、カラムの位置を意識しながら転記していくのがいいかな、と考え、GetOpenFilenameを使うことにしました。
以下が、僕が実験してみたコードです。
VBA
1Option Explicit
2
3Sub ShopSalesSummary()
4'各店舗のCSVを開いて、このブックの”集計シート"に転記(追記)します
5
6Dim OutputSheet As Worksheet
7Set OutputSheet = ThisWorkbook.Worksheets("集計シート")
8
9Dim ShopA_CSV As String
10Dim ShopB_CSV As String
11Dim ShopC_CSV As String
12Dim Header As String
13
14Dim i As Long, j As Long
15
16'CSVの1行ぶんの文字列です
17Dim strCSV As String
18
19'CSVの1行ぶんを、配列に格納するためのものです
20Dim ArrCSV As Variant
21
22Dim LastRow As Long
23
24'----ここからSHOP-Aの処理です
25'SHOP-AのCSVをダイアログボックスで選択します
26ShopA_CSV = Application.GetOpenFilename("CSVファイル,*.csv", Title:="SHOP-AのCSVを選択してください")
27
28'うっかりキャンセルボタンを押された場合の処理
29If ShopA_CSV = "False" Then
30 MsgBox "キャンセルされました"
31 Exit Sub
32End If
33
34'SHOP-AのCSVファイルを開きます
35Open ShopA_CSV For Input As #1
36
37'1行目のヘッダを読み込みます。しかし使いません。
38Line Input #1, Header
39
40'このときの集計シートの最終行の、その次の行を得ます
41LastRow = OutputSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
42i = LastRow
43
44'SHOP-AのCSVファイルの、このとき2行目から読み込みを始めます
45Do Until EOF(1)
46 Line Input #1, strCSV
47 ArrCSV = Split(strCSV, ",")
48 'ここでショップ名を直接セットしていきます
49 OutputSheet.Cells(i, 1).Value = "ショップA" 'ショップ名
50 'CSVファイルは文字列なので、日付は金額のフォーマットを指定しながらセットしていきます
51 OutputSheet.Cells(i, 2).Value = Format(ArrCSV(0), "yyyy/mm/dd") '売上日時
52 OutputSheet.Cells(i, 3).Value = Format(ArrCSV(1), "@") '商品名
53 OutputSheet.Cells(i, 4).Value = Format(ArrCSV(3), "#") '売上単価
54 '集計シートの行へシフトします
55 i = i + 1
56 'CSVファイルの次の行へシフトします
57Loop
58
59'SHOP-AのCSVファイルを閉じます
60Close #1
61
62'----ここからSHOP-Bの処理です
63'SHOP-BのCSVをダイアログボックスで選択します
64ShopB_CSV = Application.GetOpenFilename("CSVファイル,*.csv", Title:="SHOP-BのCSVを選択してください")
65
66'うっかりキャンセルボタンを押された場合の処理
67If ShopB_CSV = "False" Then
68 MsgBox "キャンセルされました"
69 Exit Sub
70End If
71
72'SHOP-BのCSVファイルを開きます
73Open ShopB_CSV For Input As #1
74
75'1行目のヘッダを読み込みます。しかし使いません。
76Line Input #1, Header
77
78'このときの集計シートの最終行の、その次の行を得ます
79LastRow = OutputSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
80i = LastRow
81
82'SHOP-BのCSVファイルの、このとき2行目から読み込みを始めます
83Do Until EOF(1)
84 Line Input #1, strCSV
85 ArrCSV = Split(strCSV, ",")
86 'ここでショップ名を直接セットしていきます
87 OutputSheet.Cells(i, 1).Value = "ショップB" 'ショップ名
88 'CSVファイルは文字列なので、日付は金額のフォーマットを指定しながらセットしていきます
89 OutputSheet.Cells(i, 2).Value = Format(ArrCSV(0), "yyyy/mm/dd") '売上日時
90 OutputSheet.Cells(i, 3).Value = Format(ArrCSV(1), "@") '商品名
91 OutputSheet.Cells(i, 4).Value = Format(ArrCSV(3), "#") '売上単価
92'集計シートの行へシフトします
93 i = i + 1
94'CSVファイルの次の行へシフトします
95Loop
96
97'SHOP-BのCSVファイルを閉じます
98Close #1
99
100'----ここからSHOP-Cの処理です
101'SHOP-CのCSVをダイアログボックスで選択します
102ShopC_CSV = Application.GetOpenFilename("CSVファイル,*.csv", Title:="SHOP-CのCSVを選択してください")
103
104'うっかりキャンセルボタンを押された場合の処理
105If ShopC_CSV = "False" Then
106MsgBox "キャンセルされました"
107Exit Sub
108End If
109
110'SHOP-CのCSVファイルを開きます
111Open ShopC_CSV For Input As #1
112
113'1行目のヘッダを読み込みます。しかし使いません。
114Line Input #1, Header
115
116'このときの集計シートの最終行の、その次の行を得ます
117LastRow = OutputSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
118i = LastRow
119
120'SHOP-CのCSVファイルの、このとき2行目から読み込みを始めます
121Do Until EOF(1)
122Line Input #1, strCSV
123ArrCSV = Split(strCSV, ",")
124'ここでショップ名を直接セットしていきます
125OutputSheet.Cells(i, 1).Value = "ショップC" 'ショップ名
126'CSVファイルは文字列なので、日付は金額のフォーマットを指定しながらセットしていきます
127OutputSheet.Cells(i, 2).Value = Format(ArrCSV(0), "yyyy/mm/dd") '売上日時
128OutputSheet.Cells(i, 3).Value = Format(ArrCSV(2), "@") '商品名
129OutputSheet.Cells(i, 4).Value = Format(ArrCSV(1), "#") '売上単価
130'集計シートの行へシフトします
131i = i + 1
132'CSVファイルの次の行へシフトします
133Loop
134
135'SHOP-CのCSVファイルを閉じます
136Close #1
137
138End Sub
139
毎日のCSVは、ヘッダがあると思うので、それをスキップするようにしました。
このArrCSV(#)の部分で、「カラムの何列めを、転記シートのどのカラムにセットするか」を制御しています。
CSVは文字列なので、このFormat(....)で、書式の設定もしています。
これで僕のほうで実験したところ、うまくいきました。
よかったらお試しください。
なにかわからないことがありましたら、またお問い合わせください。
ありがとうございます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。