- ベストアンサー
CSVファイルをエクセルの1シートにまとめて集計する方法
- 複数の定型フォームのCSVファイルを1つのエクセルファイルにまとめ、エクセル上で集計する方法を教えてください。
- 「教えて!goo」から検索し、VBAを使用してCSVファイルをエクセルの1シートにまとめることができました。ただし、シート名の特定と合計表示ができない問題があります。
- シート名が定まらないため、どのように設定すれば良いか教えていただけますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 これは、キーワードを見つけたら、その次のキーワードの直前までをインポートします。 .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)
#2のコードの修正をお願いします End If End With 'おそらく22行目 Set myShell = Nothing 'シートのチェック その22行目の後に、Set myShell = Nothing を入れて、解放させておいてください。ただし、特に、それを入れなくても支障はないはずですが、置き忘れは、あまりコード的に良くありません。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 あまり、他人のコードを細かく調べるつもりはありませんが、 >・シート名を特定の名前にしたい それは、単に、 With Sheets.Add としているだけですから、 その後に、 ActiveSheet.Name = "○○○" >・同ファイル内の、既存の「TTL」というシート上で合計を表示させたい そのコードですと、最終行が出るはすですから、 TTL のシートに、 n の変数を再利用して、 Worksheets("TTL").Range("A1").FormulaLocal = "=SUM(○○○!B1:B" & n & ")" とすればよいはずです。
お礼
できました。希望通りです。ありがとうございました。 即回答も助かりました。勉強になります・・・。 重ねて、ありがとうございました。
お礼
ご対応ありがとうございました。 これからどんどん改良していきたいと思います。accessの便利さに今ちょっと感動しています。 この問い合わせを完了させて頂きます。 ありがとうございました。