
既出かもしれませんがなかなか探し出せず、同じ質問でしたらすみません。
毎月フォルダ内にある80前後のcsvファイルを処理しなければなりません。
各業者から提出された請求データを元に1つのファイルに集計しております。
VBAにて計算も同時に行い算出された値を各該当店舗へ貼り付けたいと思っております。
①フォルダ内のブック名は各業者の名前がついています。
②赤枠にそれぞれ開いたブックの名前をそのまま反映させたいです。
③青枠には各ファイルで計算した後の「店舗No」且つカテゴリ「商品」に合致する値を反映させたいです。今まではフィルタとVLOOKUPで行なっておりました。
※緑枠で囲った〔請求額-返品額-値引額〕の計算をさせてから出た値xのうちカテゴリ名「商品」だけを③の通りに反映させたい
④ ①~③を繰り返してフォルダ内全てのデータを抽出したいです。
言葉足らずでしたら申し訳御座いません。

No.9ベストアンサー
- 回答日時:
最初はダミーBookと2~3個のCSVファイルで検証してみて下さい。
尚、罫線や中央寄せ等は付けてません。
取り敢えずはご確認を。
Sub abc()
Dim objCn As Object
Dim objRS As Object
Dim FSO As Object
Dim Dic As Object
Dim strSQL As String
Dim F_path As String, F_col As Integer
Dim f, r As Range
Set Dic = CreateObject("Scripting.Dictionary")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objCn = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.Recordset")
F_path = "G:\goo\test1" '◆ 実際のファイル保管フォルダを指定の事
F_col = 3
With objCn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Text;HDR=NO"
.Open F_path & "\"
End With
With ActiveSheet
For Each r In .Range("A3", .Cells(Rows.Count, 1).End(xlUp))
Dic.Add r.Value, r.Row
Next
For Each f In FSO.GetFolder(F_path).Files
If StrConv(FSO.GetExtensionName(f.Path), vbNarrow) = "csv" Then
.Cells(2, F_col).Value = FSO.GetBaseName(f.Path)
strSQL = ""
strSQL = strSQL & " SELECT F5,(F9-F10-F11)"
strSQL = strSQL & " FROM"
strSQL = strSQL & " [" & f.Name & "]"
strSQL = strSQL & " where ISNUMERIC(F5) AND F2 = '商品';"
Set objRS = objCn.Execute(strSQL)
Do Until objRS.EOF
.Cells(Dic(objRS(0).Value), F_col).Value = objRS(1).Value
objRS.MoveNext
Loop
F_col = F_col + 1
Set objRS = Nothing
End If
Next
End With
Set objCn = Nothing
Set FSO = Nothing
Set Dic = Nothing
End Sub
めぐみん_さん
お返事遅くなりまして申し訳御座いません。
色々とありがとう御座います!
マクロを実行させたところ
.Cells(Dic(objRS(0).Value), F_col).Value = objRS(1).Value
アプリケーション定義またはオブジェクト定義のエラー
と出てしまいました。
最初の少しだけは動いていた模様ですが、請求・返品・値引が全て0のところで止まってしまったと思われます。
No.15
- 回答日時:
No.14です。
>ただいくつかのファイルがデータ反映されていない為、Sheet構成・CSVファイルの列に違いがあるのか・・・
ここにつきましては、
strSQL = ""
strSQL = strSQL & " SELECT F5,(F9-F10-F11)"
strSQL = strSQL & " FROM"
strSQL = strSQL & " [" & f.Name & "]"
strSQL = strSQL & " where ISNUMERIC(F5) AND F2 = '商品';"
これはCSVファイルの左から5列目が数値になれる事且つ2列目が'商品'であるデータ群のうち、
5列目の値と計算結果を抽出するSQL文になってます。
なので仮に元がExcelBookでCSVファイルにして区切り文字をテキストエディタとかで消してしまったとか、
数値を全角数字で打ってるとかになるかな?
全角数字については集計Sheet側でも言えますね。全角数字で調べる(IF文)事になりかねないですし。
あとは"0"だからと空白にしてた場合なども。
その他については集計Sheetと一致しなかったファイルと店舗Noをイミディエイトウィンドウに書き出しておけば調べやすいかもですけど、
手間になりそうなら別Sheet(Sheetを指定して貰えれば)に書き出す事も可能とは思います。
いくつかのファイルデータが反映されていない原因がわかりました!
各集計ファイルの先頭に店舗Noが100きているのですが、EXCELで開いた際は”100”と見えるのですが
実際の値は、000000000100となっていたため数値の扱いになっていなかったので値が入っていませんでした。
strSQL = ""
strSQL = strSQL & " SELECT CINT(F5),(F9-F10-F11)"
strSQL = strSQL & " FROM"
strSQL = strSQL & " [" & f.Name & "]"
strSQL = strSQL & " where ISNUMERIC(F5) AND F2 = '商品';"
'strSQL = strSQL & " where F2 = '商品';"
に変更したことで強制的に数値にし無事処理が出来るようになりました。
また、ファイルの直指定をやめて
F_path = "G:\goo\test1" '◆ 実際のファイル保管フォルダを指定の事
F_col = 3
⇒
'メイン処理-データ抽出
'フォルダ指定
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
F_path = .SelectedItems(1)
Else
End
End If
End With
'F_path = "G:\goo\test1" '◆ 実際のファイル保管フォルダを指定の事
F_col = 3
ファイルを選んで指定するように致しました。
今までの経緯と上記のことを踏まえ、めぐみん_さんをベストアンサーとさせて頂きました。
とても助かり、心から感謝申し上げます。
ありがとうございます!
No.14
- 回答日時:
でも、閉店している場合には、
>000000000000100 0
>こういった状態でした。
店舗Noの桁数が多くなるの???
確かに既存する店舗とは重複しないかもですが、出力結果とCSVファイルの中身には違いはなかったと思って宜しいのでしょうか?
めぐみん_さん
閉店している場合は店舗Noの桁数は変わりません。
>000000000000100 0
この状態も何故出たのか、判断がつかず・・・恐らく相違はないように見えます。
ひとまずIf文でエラーなく最後まで処理は抜けました。
ありがとうございます。
ただいくつかのファイルがデータ反映されていない為、Sheet構成・CSVファイルの列に違いがあるのか・・・
エラーファイルだけ個別に調べてみようと思います。
また行き詰りましたらご相談させて頂くとは存じますが、沢山のご対応を頂き深く感謝致しております。
No.13
- 回答日時:
No.12です。
お礼読みました。
その場合のケースは考えつかず申し訳ないです。
該当する付近のコードを
Do Until objRS.EOF
If Dic.Exists(objRS(0).Value) Then
.Cells(Dic(objRS(0).Value), F_col).Value = objRS(1).Value
Else '●
Debug.Print f.Nmae, objRS(0).Value '●
End If
objRS.MoveNext
Loop
このように変更して頂き、
・If文で集計Sheetの店舗Noに存在しているかどうかを判定し、存在していれば通常の処理をする。
・存在していない場合はイミディエイトウィンドウにファイル名と該当店舗Noを書き出す。
もし後者が不要であれば"●"の所は削除して下さい。
No.12
- 回答日時:
No.9のお礼について。
まず、
>請求・返品・値引が全て0のところで止まってしまったと思われます。
についてはこちらでもデータを画像道理に準備してますので、全て0であるならSQL文での計算で0となり、結果0が表示されるのは確認してました。
なので
・実行する際には集計したいSheetがActiveな状態であること
・コードに『保存先のフォルダ』以外に修正した箇所があれば記載して欲しい
・集計及びCSVファイルの数値部分は半角数値であり、全角数字を使っていないか確認を
・少しは書き込めた(?)と言うのは、ファイル単位なのか行数単位なのか
⇒完全に読み込めたファイルがあったのか、或いは最初のファイルの途中で止まったのか。
Debug.Print objRS(0).Value, objRS(1).Value '◆追加
.Cells(Dic(objRS(0).Value), F_col).Value = objRS(1).Value
追加した行でイミディエイトウィンドウでは表示されるか、そこでエラー表示がでるか。
基本店舗Noの値にイレギュラーがあるか、若しくはCSVファイルのエンコードによるものかも知れません・・・・ってのも、最初からダメならわかるのですがね。
あとは画像と実際のSheet構成・CSVファイルの列などに違いがあるか。。。例えば書き込みを禁止しているとかセルの結合当たりかなど。
それでもエラー内容が違ってくるはずですが。。。
何回かCSVファイルのデータを弄って試しましたがその箇所でそのエラーがってのは起きないんですよね。
エラーになっている箇所を再度調べたところ、現在は閉店している店舗が集計ファイルには記載しておらず、集計元データには記載されているというマッチングミスでした・・・申し訳御座いません。
・実行する際には集計したいSheetはActiveな状態です
・コードの修正は保存先フォルダのパス指定以外して修正はございません
・集計及びCSVファイルの数値部分は全て半角数値でした
・完全に読み込めたファイルが複数あります。特定のファイルが数値の反映がされず
.Cells(Dic(objRS(0).Value), F_col).Value = objRS(1).Valueの所で
『アプリケーション定義またはオブジェクト定義のエラー』
とまたなってしまいます。
イミディエイトウィンドウを表示すると
264 0
265 0
266 0
268 0
269 0
・
・
・
1104 0
1106 0
1108 0
1110 0
1152 0
000000000000100 0
こういった状態でした。
何度もお手間をとらせてしまい心苦しく思います。
No.11
- 回答日時:
No.9です。
最後の方の
End With
Set objCn = Nothing
Set FSO = Nothing
Set Dic = Nothing
ここの所を
End With
objCn.Close '◆追加
Set objCn = Nothing
Set FSO = Nothing
Set Dic = Nothing
このように追加願います。
No.10
- 回答日時:
No.9です。
>F_path = "G:\goo\test1" '◆ 実際のファイル保管フォルダを指定の事
これは
<毎月フォルダ内にある80前後のcsvファイル>
この保管場所の事ですが検証時にはそのフォルダを指定して下さい。
No.8
- 回答日時:
②はfsoをつかって、次のようなコードでどうでしょうか
Dim objFSO As Object
Dim objFolder as Folder
Dim objFile as File
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(目的のフォルダ")
For each objFile in objFolder.Files
if right(objfile.name,3) = "CSV" then
(処理)
endif
Next
③は、上のコードの処理の部分で、CSVとして開いたものをエクセルブックとして保存したうえで、ピボットテーブルを作成して、そこから値をコピーすればよいと思います。
④は上のコードのFor~Eachで実現出来てますよ。
programmermas999macさん
ありがとうございます。
お返事遅くなりまして申し訳御座いません。
マクロ実行してみたところ
objFolder as Folder
ここでユーザー定義型は定義されていませんとなりエラーとなってしまいました。
③④に関して、なるほど!参考にしてみます!
No.7
- 回答日時:
No.3のお礼につきましてはわかりました。
No.4以降の検証をして頂きありがとうございます。
これならCSVを開かなくても作業できそうです。
あとは少々お時間を頂ければと思います。
No.6
- 回答日時:
度々すいません。
No.4の
Set objRS = New ADODB.Recordset
これは削除願います。
test.csvの内容がbookに反映されました!
【test.csv】
(A列) (B列) (C列) (D列)
1行目 3月請求額 3月返品額 3月値引額
2行目 1 500 0 0
3行目 2 14000 1000 500
4行目 3 2000 0 100
5行目 4 200000 15000 0
↓
【book】
(A列) (B列) (C列) (D列)
1行目 1 500 0 0
2行目 2 14000 1000 500
3行目 3 2000 0 100
4行目 4 200000 15000 0
こういった形になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】同じフォルダ内にある複数ブックから1つのブック内の1シートにデータを集めたい 6 2022/09/28 18:16
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- Visual Basic(VBA) VBAの参照先のファイル名をセルに書いて代入したい 2 2022/04/04 13:42
- Excel(エクセル) エクセルのマクロ作成について教えてください 5 2023/02/20 00:39
- Excel(エクセル) 複数セルデータを別シートの単一セルにコピーしたい。(詳細をご参照ください) 1 2022/12/14 15:08
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- 数学 賃料と専有面積のデータが60部屋分ほどがあり、 賃料÷専有面積(=1㎡あたりの賃料)の数式で計算する 2 2023/02/18 20:33
- Excel(エクセル) VBAで同フォルダ内の別ブックを開かず参照して条件の一致する行の指定セルを抽出するには? 1 2022/07/21 19:29
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
社内Excel共有ブックでの保存ト...
-
共有フォルダに誰が何にアクセ...
-
Batch: フォルダ内の特定のファ...
-
AccessVBAで作成したExcelファ...
-
VBAでCSVファイルが使用中かど...
-
相手のPCにVBAからメッセ...
-
月が変わったら自動でシートが...
-
Excel VBA 処理後データが重た...
-
(Excelマクロ)datファイルをエ...
-
Dream weaverで、誤ってファイ...
-
Access2003 デザインモードで...
-
JSONファイルの置き場所について
-
Access VBA を利用して、フォル...
-
【アクセス】「ほかのユーザー...
-
excelを共有ファイルにすると行...
-
ホームページ作成中に溜まる不...
-
仕事のファイルを共有フォルダ...
-
特定のエクセルファイルを起動...
-
拡張子が「cda」のファイルを聞...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
特定のエクセルファイルを起動...
-
Batch: フォルダ内の特定のファ...
-
共有フォルダに誰が何にアクセ...
-
Access VBA を利用して、フォル...
-
VBAでCSVファイルが使用中かど...
-
AccessVBAで作成したExcelファ...
-
(Excelマクロ)datファイルをエ...
-
excelを共有ファイルにすると行...
-
【アクセス】「ほかのユーザー...
-
社内Excel共有ブックでの保存ト...
-
tmpファイル なぜできる?削除...
-
拡張子が「cda」のファイルを聞...
-
WEBクエリが使えない場合のHPデ...
-
月が変わったら自動でシートが...
-
Excel VBA 処理後データが重た...
-
ファイルの途中に文字列を挿入
-
相手のPCにVBAからメッセ...
-
mdbファイル フォームを開くと...
-
大量のCSVデータを行列の変換を...
おすすめ情報