こんにちは。
一応、処理するファイルは、目視で確認できるようになっています。また、同じファイル名があった時は、枝番が作られてから保存されます。保存ファイル型は、xlExcel8 (97-2003 format in Excel 2007-2013, xls) にしています。
ファイルフォルダと出力フォルダは、同じでも構いません。
もし、ブック名がぶつかることがあれば、枝番が付けられます。
'//
Sub CSVImport2Sheet()
Dim orgHolder As String
Dim rw As Long, i As Long, j As Long, k As Integer, l As Long, m As Long
Dim Fn As Variant, Fnames As Variant
Dim FNo As Integer, TextLine As String
Dim LineBuf As Variant, U As Integer
Dim AcSht As Worksheet, WbkName As String, newBk As Workbook
Dim msg As String
Const PSWD As String = "abc" 'パスワード
Const EXT As String = ".xls" '文字列の先頭のピリオドは忘れないでください
'
''必ず、末尾には、 '¥'を入れてください。
Const myHolder As String = "C:\Test1\" 'ファイルフォルダ
Const ExHolder As String = "C:\Test2\" '出力フォルダ
rw = 1 '書き出しの最初の行数
orgHolder = ThisWorkbook.Path
ChDir myHolder
'複数ファイルでも選択できます。
Fnames = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv", MultiSelect:=True)
If VarType(Fnames) = vbBoolean Then
Exit Sub
End If
Application.ScreenUpdating = False
For Each Fn In Fnames
Set AcSht = Worksheets.Add(After:=Worksheets(Worksheets.Count))
FNo = FreeFile()
Open Fn For Input As #FNo 'ファイルインポート
Do Until EOF(FNo)
Line Input #FNo, TextLine
'「""」 の除去
'TextLine = Application.Substitute(TextLine, """", "")
LineBuf = Split(TextLine, ",")
U = UBound(LineBuf)
If U >= 0 Then
AcSht.Cells(rw + j, 1).Resize(, U + 1).Value = LineBuf
End If
j = j + 1
Loop
On Error Resume Next
Close #FNo
If WorksheetFunction.CountA(AcSht.UsedRange) > 0 Then '特に必要はないはず。空ファイルの除去
Fn = Dir(Fn)
'Debug.Print Fn 'ファイル名の確認
WbkName = Mid$(Fn, 1, InStrRev(Fn, ".") - 1)
AcSht.Name = WbkName
AcSht.Move
Set newBk = ActiveWorkbook
k = 1
'同名ファイルがある場合は、枝番が付けられます。
If Dir(ExHolder & WbkName & EXT) = "" Then
newBk.SaveAs ExHolder & WbkName & EXT, xlExcel8, PSWD
Else
Do Until Dir(ExHolder & WbkName & "_" & CStr(k) & EXT) = ""
k = k + 1
Loop
newBk.SaveAs ExHolder & WbkName & "_" & CStr(k) & EXT, xlExcel8, PSWD
End If
l = l + 1
newBk.Close False
Else
m = m + 1
End If
j = 0
On Error GoTo 0
Next
Application.ScreenUpdating = True
Set AcSht = Nothing
Set newBk = Nothing
ChDir orgHolder
msg = CStr(l) & " 個のファイルを処理し"
msg = msg & IIf(m > 0, vbCrLf & CStr(m) & " 個のファイルが処理できませんでした。", "ました。")
MsgBox msg, 64
End Sub
'//
お礼
お礼が遅くなってすみません。 効率化できそうなところはcsvの読み込みの部分ということですね。 たしかにworkbooks.openしない分高速になりました。 ありがとうございました。 また、枝番の処理も教えていただきありがとうございます。