| 
    
     |  | 例えばこんなかな? 区切りが、Tabか、カンマか、わから無いのでTabにして有ります
 また、ファイルの先頭フィールドから抽出しています
 
 Option Explicit
 Option Compare Text
 
 Public Sub DataRead()
 
 Dim i As Long
 Dim vntFileName As Variant
 Dim lngRow As Long
 Dim lngCol As Long
 Dim wksResult As Worksheet
 
 '読み込むファイルを取得
 If Not GetReadFile(vntFileName, ThisWorkbook.Path) Then
 Exit Sub
 End If
 
 Application.ScreenUpdating = False
 
 '書き込み行初期値
 lngRow = 1
 '書き込み列初期値
 lngCol = 1
 '読み込むシートを設定
 Set wksResult = ActiveSheet
 
 'データの読み込み(Tab区切り)
 CSVRead vntFileName, wksResult, lngRow, lngCol, vbTab
 'データの読み込み(カンマ区切り)
 '  CSVRead vntFileName, wksResult, lngRow, lngCol, ","
 
 Set wksResult = 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, _
 Optional strDelim As String = ",")
 
 Dim dfn As Integer
 Dim vntField As Variant
 Dim strLine As String
 Dim blnMulti As Boolean
 Dim strRec As String
 
 'ファイルをOpen
 dfn = FreeFile
 Open strFileName For Input As dfn
 
 Do Until EOF(dfn)
 '1行読み込み
 Line Input #dfn, strLine
 strRec = strRec & strLine
 vntField = SplitCsv(strRec, strDelim, , , blnMulti)
 'フィールド内で改行が有る場合
 If blnMulti Then
 '改行が有った場合、セル内改行として残す
 strRec = strRec & vbLf
 Else
 '先頭フィールドの値が、"みかん"の時
 If vntField(0) = "みかん" Then
 With wksWrite.Cells(lngRow, lngCol)
 With .Resize(, UBound(vntField) + 1)
 '出力範囲を文字列に設定
 '            .NumberFormat = "@"
 'データを出力
 .Value = vntField
 End With
 End With
 '出力行をインクリメント
 lngRow = lngRow + 1
 End If
 strRec = ""
 End If
 Loop
 
 Close #dfn
 
 End Sub
 
 Public 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 Variant
 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)
 If lngDPos = lngLength Then
 ReDim Preserve vntData(i + 1)
 End If
 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 = Empty
 i = i + 1
 Loop Until lngLength < lngStart
 
 SplitCsv = vntData()
 
 End Function
 
 Public Function GetReadFile(vntFileNames As Variant, _
 Optional strFilePath As String, _
 Optional blnMultiSel 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 & "{TAB}", False
 End If
 '「ファイルを開く」ダイアログを表示
 vntFileNames _
 = Application.GetOpenFilename(strFilter, 2, , , blnMultiSel)
 If VarType(vntFileNames) = vbBoolean Then
 Exit Function
 End If
 
 GetReadFile = True
 
 End Function
 
 |  |