|
もう見て居ないかな?
データが、この様なデータなのかな?
りんご¥果物¥12,123,◎◎◎◎,#####
キャベツ¥野菜¥6,456,▲▲▲▲,$$$$$
トマト¥野菜¥9,789,◇◇◇◇,&&&&
何処に、どんな風に出力すか不明なので、
Sheet1にCsvとしての出力
Sheet2に"¥"の区切りの出力をしています
Option Explicit
Public Sub TextRead()
Dim i As Long
Dim dfn As Integer
Dim vntFileName As Variant
Dim strBuff As String
Dim lngRow As Long
Dim rngResult As Range
Dim rngSubResult As Range
Dim vntField As Variant
Dim vntSubField As Variant
Dim strProm As String
'Openするファイルを選択
If Not GetReadFile(vntFileName, ThisWorkbook.Path, False) Then
strProm = "マクロがキャンセルされました"
GoTo Wayout
End If
'出力する、場所を指定
Set rngResult = Worksheets("Sheet1").Cells(1, "A")
Set rngSubResult = Worksheets("Sheet2").Cells(1, "A")
'ファイルをOpen
dfn = FreeFile
Open vntFileName For Input As dfn
'ファイルエンドまで繰り返し
Do Until EOF(dfn)
'ファイルより1行、変数に読み込み
Line Input #dfn, strBuff
'カンマ区切りデータとして、カンマで分割
vntField = SplitCsv(strBuff, ",")
'Sheet1に出力
With rngResult.Offset(lngRow)
.Resize(, UBound(vntField) + 1).Value = vntField
End With
'"¥"区切り賭して、第0フィールドを分割
'実際に分割するフィールドを指定して下さい
'この場合、フィールドは0から始まります
vntSubField = SplitCsv(vntField(0), "¥")
'Sheet2にサブフィールドを出力
With rngSubResult.Offset(lngRow)
.Resize(, UBound(vntSubField) + 1).Value = vntSubField
End With
'書き込み行を更新
lngRow = lngRow + 1
Loop
'ファイルをClose
Close #dfn
Set rngResult = Nothing
Set rngSubResult = Nothing
strProm = "処理が完了しました"
Wayout:
Beep
MsgBox strProm
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
' strLine :分割元と成る文字列
' strDelimiter :区切り文字
' SplitCsv :戻り値、切り出された文字配列
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
Private 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
|
|