• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CSV)

CSVファイルをエクセルの1シートにまとめて集計する方法

このQ&Aのポイント
  • 複数の定型フォームのCSVファイルを1つのエクセルファイルにまとめ、エクセル上で集計する方法を教えてください。
  • 「教えて!goo」から検索し、VBAを使用してCSVファイルをエクセルの1シートにまとめることができました。ただし、シート名の特定と合計表示ができない問題があります。
  • シート名が定まらないため、どのように設定すれば良いか教えていただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 これは、キーワードを見つけたら、その次のキーワードの直前までをインポートします。 .BrowseForFolder(0, "フォルダを選んだください。", 0, 5) と、5を入れることによって、My Documents フォルダになります。 If InStr(1, LineBuf, KEYWORD, vbBinaryCompare) > キーワードの文字比較は、BynaryCompare ですから、全角、半角、大文字、小文字を区別しますが、もし、その部分を、一緒にするには、vbTextCompare モードというものがあります。 なお、.csv ファイルは、現在は、あくまでも、「,(コンマ切り)」のみの対応です。 Sub ImportCSV()   Dim myShell As Object   Dim myFol As String   Dim Fn As String   Dim Fno As Integer   Dim LineBuf As String   Dim ArBuf As Variant   Dim EndCol As Integer   Dim n As Long   Dim k As Long   Dim flgKey As Integer   'キーワード   Const KEYWORD As String = "A1"      Set myShell = CreateObject("Shell.Application") _     .BrowseForFolder(0, "フォルダを選んだください。", 0, 0) '最後の0を 5にすると、My Documents     If myShell Is Nothing Then Exit Sub   With myShell     If .Self.Path = "" Then Exit Sub     myFol = .Self.Path & "\"     If MsgBox(myFol & vbCrLf & "上記フォルダを処理します。よろしいですか?", vbInformation + vbOKCancel) = vbCancel Then       Exit Sub     End If   End With   'シートのチェック   On Error Resume Next   Application.Goto Worksheets("TTL").Range("A1")   If Err.Number = 0 Then       If MsgBox("既に、'TTL' シートは存在しています。" & vbCrLf _       & "シートのデータを削除しますか?", vbInformation + vbOKCancel) = vbCancel Then       Exit Sub       Else        ActiveSheet.Cells.Clear       End If      Err.Clear   Else    Worksheets.Add    ActiveSheet.Name = "TTL"   End If      On Error GoTo 0   'インポート   Application.ScreenUpdating = False   With ActiveSheet     Fn = Dir(myFol & "*.csv") 'ワイルドカード     n = 1     Do Until Len(Fn) = 0       Fno = FreeFile       Open Fn For Input As #Fno         flgKey = 0       Do While Not EOF(Fno)         Line Input #Fno, LineBuf         If InStr(1, LineBuf, KEYWORD, vbBinaryCompare) > 0 And flgKey = 0 Then           flgKey = 1         ElseIf InStr(1, LineBuf, KEYWORD, vbBinaryCompare) > 0 And flgKey = 1 Then           flgKey = 2         End If         If flgKey = 1 Then           ArBuf = Split(LineBuf, ",")           EndCol = UBound(ArBuf)           k = k + 1           '2列目に出力           ActiveSheet.Cells(k, 2).Resize(, EndCol) = ArBuf         ElseIf flgKey = 2 Then           Exit Do         End If       Loop       If k > n Then        'ファイル名の書き出し        .Range("A" & n).Resize(k - n + 1).Value = Fn         n = k + 1       End If       Fn = Dir()     Loop   End With     Application.ScreenUpdating = True End Sub

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#2のコードの修正をお願いします    End If   End With   'おそらく22行目 Set myShell = Nothing   'シートのチェック その22行目の後に、Set myShell = Nothing を入れて、解放させておいてください。ただし、特に、それを入れなくても支障はないはずですが、置き忘れは、あまりコード的に良くありません。

IWA_OKOSHI
質問者

お礼

ご対応ありがとうございました。 これからどんどん改良していきたいと思います。accessの便利さに今ちょっと感動しています。 この問い合わせを完了させて頂きます。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 あまり、他人のコードを細かく調べるつもりはありませんが、 >・シート名を特定の名前にしたい それは、単に、 With Sheets.Add としているだけですから、 その後に、 ActiveSheet.Name = "○○○" >・同ファイル内の、既存の「TTL」というシート上で合計を表示させたい そのコードですと、最終行が出るはすですから、 TTL のシートに、 n の変数を再利用して、 Worksheets("TTL").Range("A1").FormulaLocal = "=SUM(○○○!B1:B" & n & ")" とすればよいはずです。

IWA_OKOSHI
質問者

お礼

できました。希望通りです。ありがとうございました。 即回答も助かりました。勉強になります・・・。 重ねて、ありがとうございました。

関連するQ&A