| 
    
     |  | チョット違うけど、こんなのも有るよ CsvDataReadと言うマクロを実行すると「フォーマット.xls」がOpenされ
 「ファイルを開く」ダイアログが表示されます
 ここで、Csvファイルをを複数選択すると、選択されたファイルが
 「フォーマット.xls」にシートが追加され、1シート1ファイルとして、
 其処へ読み込まれます
 「実行ファイルという名のExcelのブック」のコマンドボタンで「Sub CsvDataRead」を
 実行する様にして下さい
 また、「フォーマット.xls」の有る場所は、現状のコードでは、
 「実行ファイルという名のExcelのブック」と同じフォルダとしていますので
 これは実状に合わせて下さい
 
 Option Explicit
 
 Public Sub CsvDataRead()
 
 Dim i As Long
 Dim vntFileNames As Variant
 Dim lngWriteRow As Long
 Dim wksWrite As Worksheet
 Dim strPath As String
 Dim strSheetName As String
 
 'Csvファイルを読み込むBookをOpen
 Workbooks.Open ThisWorkbook.Path _
 & "\" & "フォーマット.xls"
 
 'Csvファイルの有るフォルダを指定
 strPath = ActiveWorkbook.Path
 '  strPath = "D:\Data Folder"
 '「ファイルを開く」ダイアログを複数選択で表示
 If Not GetReadFile(vntFileNames, strPath, True) Then
 Exit Sub
 End If
 
 '  Application.ScreenUpdating = False
 
 '複数選択されたファイルをシートに出力
 For i = 1 To UBound(vntFileNames)
 'シート名を作成
 strSheetName _
 = GetFileName(vntFileNames(i))
 strSheetName _
 = GetSheetName(strSheetName)
 'アクティブBookにシートを追加
 With ActiveWorkbook.Worksheets
 '出力シートを設定
 Set wksWrite _
 = .Add(After:=Worksheets(.Count))
 End With
 'シート名を変更
 wksWrite.Name = strSheetName
 '出力する先頭行を設定
 lngWriteRow = 1
 'CSVを書き込み
 CSVRead vntFileNames(i), _
 wksWrite, lngWriteRow, 1
 '    wksWrite.Columns.AutoFit
 Next i
 
 Set wksWrite = Nothing
 
 '  Application.ScreenUpdating = True
 
 Beep
 MsgBox "処理が完了しました"
 
 End Sub
 
 Private Sub CSVRead(ByVal strFileName As String, _
 ByVal wksWrite As Worksheet, _
 Optional ByRef lngRow As Long = 1, _
 Optional ByRef lngCol As Long = 1)
 
 Dim dfn As Integer
 Dim vntField As Variant
 Dim strBuff As String
 Dim blnMulti As Boolean
 Dim strRec As String
 
 '空きファイルバファ番号を取得
 dfn = FreeFile
 'ファイルをInputモードで開く
 Open strFileName For Input As dfn
 
 'ファイルエンドまで繰り返し
 Do Until EOF(dfn)
 'ファイルから1行読み込み
 Line Input #dfn, strBuff
 '論理レコードに物理レコードを追加
 strRec = strRec & strBuff
 'レコードをフィールドに分割
 vntField = SplitCsv(strBuff, ",", , , blnMulti)
 '物理レコードに改行が有った場合
 If blnMulti Then
 strRec = strRec & vbLf
 Else
 '指定シートの指定列、行について
 With wksWrite.Cells(lngRow, lngCol)
 '結果配列を代入
 .Offset.Resize(, UBound(vntField) + 1) = vntField
 End With
 '書き込み行を更新
 lngRow = lngRow + 1
 '論理レコードをクリア
 strRec = ""
 End If
 Loop
 
 'ファイルをClose
 Close #dfn
 
 End Sub
 
 Private Function SplitCsv(ByVal strLine As String, _
 Optional strDelimiter As String = ",", _
 Optional strQuote As String = """", _
 Optional strRet As String = vbCrLf, _
 Optional blnMulti As Boolean) As Variant
 
 Dim lngDPos As Long
 Dim vntData() As Variant
 Dim lngStart As Long
 Dim i As Long
 Dim vntField As String
 Dim lngLength As Long
 
 i = 0
 lngStart = 1
 lngLength = Len(strLine)
 blnMulti = False
 Do
 ReDim Preserve vntData(i)
 If Mid$(strLine, lngStart, 1) <> strQuote Then
 lngDPos = InStr(lngStart, strLine, _
 strDelimiter, vbBinaryCompare)
 If lngDPos > 0 Then
 vntField = Mid$(strLine, lngStart, _
 lngDPos - lngStart)
 lngStart = lngDPos + 1
 Else
 vntField = Mid$(strLine, lngStart)
 lngStart = lngLength + 1
 End If
 Else
 lngStart = lngStart + 1
 Do
 lngDPos = InStr(lngStart, strLine, _
 strQuote, vbBinaryCompare)
 If lngDPos > 0 Then
 vntField = vntField & Mid$(strLine, _
 lngStart, lngDPos - lngStart)
 lngStart = lngDPos + 1
 Select Case Mid$(strLine, lngStart, 1)
 Case ""
 Exit Do
 Case strDelimiter
 lngStart = lngStart + 1
 Exit Do
 Case strQuote
 lngStart = lngStart + 1
 vntField = vntField & strQuote
 End Select
 Else
 blnMulti = True
 vntField = Mid$(strLine, lngStart) & strRet
 lngStart = lngLength + 1
 Exit Do
 End If
 Loop
 End If
 vntData(i) = vntField
 vntField = ""
 i = i + 1
 Loop Until lngLength < lngStart
 
 SplitCsv = vntData()
 
 End Function
 
 Private Function GetReadFile(vntFileNames As Variant, _
 Optional strFilePath As String, _
 Optional blnMulti As Boolean = False) As Boolean
 
 Dim strFilter As String
 
 'フィルタ文字列を作成
 strFilter = "CSV File (*.csv),*.csv," _
 & "Text File (*.txt),*.txt," _
 & "CSV and Text (*.csv; *.txt),*.csv;*.txt," _
 & "全て (*.*),*.*"
 
 '読み込むファイルの有るフォルダを指定
 If strFilePath <> "" Then
 'ファイルを開くダイアログ表示ホルダに移動
 ChDrive Left(strFilePath, 1)
 ChDir strFilePath
 End If
 
 'もし、ディフォルトのファイル名が有る場合
 If vntFileNames <> "" Then
 SendKeys vntFileNames, False
 End If
 
 vntFileNames _
 = Application.GetOpenFilename(strFilter, 1, , , blnMulti)
 If Not VarType(vntFileNames) = vbBoolean Then
 GetReadFile = True
 End If
 
 End Function
 
 Private Function GetWriteFile(vntFileName As Variant, _
 Optional strFilePath As String) As Boolean
 
 Dim strFilter As String
 Dim strInitialFile As String
 
 'フィルタ文字列を作成
 strFilter = "CSV File (*.csv),*.csv," _
 & "Text File (*.txt),*.txt"
 '既定値のファイル名を設定
 strInitialFile = vntFileName
 '読み込むファイルの有るフォルダを指定
 If strFilePath <> "" Then
 'ファイルを開くダイアログ表示ホルダに移動
 ChDrive Left(strFilePath, 1)
 ChDir strFilePath
 End If
 '「ファイルを保存」ダイアログを表示
 vntFileName _
 = Application.GetSaveAsFilename(vntFileName, strFilter, 1)
 If vntFileName = False Then
 Exit Function
 End If
 
 GetWriteFile = True
 
 End Function
 
 Private Function GetSheetName(ByVal strName As String, _
 Optional ByVal wkbBook As Workbook) As String
 
 '  同一シート名の存在確認と枝番付加
 
 Dim i As Long
 Dim lngPos As Long
 Dim lngNumb As Long
 Dim lngTmpNumb As Long
 Dim strSName As String
 
 If wkbBook Is Nothing Then
 Set wkbBook = ThisWorkbook
 End If
 
 lngPos = Len(strName) + 1
 lngNumb = -1
 With wkbBook
 For i = 1 To .Worksheets.Count
 strSName = .Worksheets(i).Name
 If strSName Like strName & "*" Then
 Select Case Mid(strSName, lngPos, 1)
 Case ""
 lngTmpNumb = 0
 Case "("
 lngTmpNumb _
 = InStr(1, strSName, ")", _
 vbBinaryCompare)
 If lngTmpNumb > 0 Then
 lngTmpNumb _
 = Val(Mid(strSName, lngPos + 1, _
 lngTmpNumb - lngPos - 1))
 Else
 lngTmpNumb _
 = Val(Mid(strSName, lngPos + 1))
 End If
 Case Else
 lngTmpNumb = -1
 End Select
 If lngNumb < lngTmpNumb Then
 lngNumb = lngTmpNumb
 End If
 End If
 Next i
 End With
 
 Set wkbBook = Nothing
 
 If lngNumb = -1 Then
 GetSheetName = strName
 Else
 GetSheetName = strName & "(" & (lngNumb + 1) & ")"
 End If
 
 End Function
 
 Private Function GetFileName(ByVal strName As String) As String
 
 '  ファイル名をPathから分離
 
 Dim i As Long
 Dim lngPos As Long
 
 i = 0
 lngPos = InStr(i + 1, strName, "\", vbBinaryCompare)
 Do Until lngPos = 0
 i = lngPos
 lngPos = InStr(i + 1, strName, "\", vbBinaryCompare)
 Loop
 strName = Mid(strName, i + 1)
 
 i = 1
 lngPos = InStr(i, strName, ".", vbBinaryCompare)
 Do Until lngPos = 0
 i = lngPos
 lngPos = InStr(i + 1, strName, ".", vbBinaryCompare)
 Loop
 
 GetFileName = Left(strName, i - 1)
 
 End Function
 
 |  |