重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

既出かもしれませんがなかなか探し出せず、同じ質問でしたらすみません。
毎月フォルダ内にある80前後のcsvファイルを処理しなければなりません。
各業者から提出された請求データを元に1つのファイルに集計しております。
VBAにて計算も同時に行い算出された値を各該当店舗へ貼り付けたいと思っております。

①フォルダ内のブック名は各業者の名前がついています。
②赤枠にそれぞれ開いたブックの名前をそのまま反映させたいです。
③青枠には各ファイルで計算した後の「店舗No」且つカテゴリ「商品」に合致する値を反映させたいです。今まではフィルタとVLOOKUPで行なっておりました。
※緑枠で囲った〔請求額-返品額-値引額〕の計算をさせてから出た値xのうちカテゴリ名「商品」だけを③の通りに反映させたい
④ ①~③を繰り返してフォルダ内全てのデータを抽出したいです。

言葉足らずでしたら申し訳御座いません。

「VBAでファイル名の取得と計算したデータ」の質問画像

A 回答 (15件中1~10件)

最初はダミー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
    • good
    • 5
この回答へのお礼

めぐみん_さん
お返事遅くなりまして申し訳御座いません。
色々とありがとう御座います!

マクロを実行させたところ
.Cells(Dic(objRS(0).Value), F_col).Value = objRS(1).Value

アプリケーション定義またはオブジェクト定義のエラー
と出てしまいました。
最初の少しだけは動いていた模様ですが、請求・返品・値引が全て0のところで止まってしまったと思われます。

お礼日時:2018/05/07 11: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を指定して貰えれば)に書き出す事も可能とは思います。
    • good
    • 0
この回答へのお礼

いくつかのファイルデータが反映されていない原因がわかりました!

各集計ファイルの先頭に店舗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

ファイルを選んで指定するように致しました。

今までの経緯と上記のことを踏まえ、めぐみん_さんをベストアンサーとさせて頂きました。
とても助かり、心から感謝申し上げます。
ありがとうございます!

お礼日時:2018/05/08 16:47

でも、閉店している場合には、



>000000000000100 0
>こういった状態でした。

店舗Noの桁数が多くなるの???
確かに既存する店舗とは重複しないかもですが、出力結果とCSVファイルの中身には違いはなかったと思って宜しいのでしょうか?
    • good
    • 0
この回答へのお礼

めぐみん_さん

閉店している場合は店舗Noの桁数は変わりません。
>000000000000100 0
この状態も何故出たのか、判断がつかず・・・恐らく相違はないように見えます。

ひとまずIf文でエラーなく最後まで処理は抜けました。
ありがとうございます。

ただいくつかのファイルがデータ反映されていない為、Sheet構成・CSVファイルの列に違いがあるのか・・・
エラーファイルだけ個別に調べてみようと思います。

また行き詰りましたらご相談させて頂くとは存じますが、沢山のご対応を頂き深く感謝致しております。

お礼日時:2018/05/07 16:08

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を書き出す。
もし後者が不要であれば"●"の所は削除して下さい。
    • good
    • 0

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ファイルのデータを弄って試しましたがその箇所でそのエラーがってのは起きないんですよね。
    • good
    • 0
この回答へのお礼

エラーになっている箇所を再度調べたところ、現在は閉店している店舗が集計ファイルには記載しておらず、集計元データには記載されているというマッチングミスでした・・・申し訳御座いません。

・実行する際には集計したい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
こういった状態でした。

何度もお手間をとらせてしまい心苦しく思います。

お礼日時:2018/05/07 14:43

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

このように追加願います。
    • good
    • 0

No.9です。



>F_path = "G:\goo\test1" '◆ 実際のファイル保管フォルダを指定の事

これは

<毎月フォルダ内にある80前後のcsvファイル>

この保管場所の事ですが検証時にはそのフォルダを指定して下さい。
    • good
    • 0

②は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で実現出来てますよ。
    • good
    • 0
この回答へのお礼

programmermas999macさん
ありがとうございます。
お返事遅くなりまして申し訳御座いません。

マクロ実行してみたところ
objFolder as Folder
ここでユーザー定義型は定義されていませんとなりエラーとなってしまいました。
③④に関して、なるほど!参考にしてみます!

お礼日時:2018/05/07 10:53

No.3のお礼につきましてはわかりました。



No.4以降の検証をして頂きありがとうございます。
これならCSVを開かなくても作業できそうです。
あとは少々お時間を頂ければと思います。
    • good
    • 0

度々すいません。



No.4の

Set objRS = New ADODB.Recordset

これは削除願います。
    • good
    • 0
この回答へのお礼

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

こういった形になりました。

お礼日時:2018/05/02 19:11

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