|
長すぎるとの事で、読み込み側のコードです
ファイルの読み込みは、以下のコードの値の変更で読み込み位置が変わります
'書き込み先頭行の初期値設定
lngReadRow = 1
'書き込み先頭列の初期値設定
lngReadCol = 1
'書き込むシートの参照を設定
Set wksWrite = ActiveSheet
以下を標準モジュールに記述して下さい
'ファイルの読み込みのコード
Option Explicit
Public Sub ReadCsvSequ()
Dim i As Long
Dim vntFileName As Variant
Dim wksWrite As Worksheet
Dim lngReadRow As Long
Dim lngReadCol As Long
'読み込むファイル名を取得
If Not GetReadFile(vntFileName, ThisWorkbook.Path) Then
Exit Sub
End If
'書き込み先頭行の初期値設定
lngReadRow = 1
'書き込み先頭列の初期値設定
lngReadCol = 1
'書き込むシートの参照を設定
Set wksWrite = ActiveSheet
'ファイルを読み込みシートに書き込む
CSVRead vntFileName, wksWrite, lngReadRow, lngReadCol
'書き込むシートの参照を破棄
Set wksWrite = Nothing
Beep
MsgBox "処理が終了しました", vbOKOnly, "終了"
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 strLine As String
Dim blnMulti As Boolean
Dim strRec As String
'空きファイル番号を取得します
dfn = FreeFile
'ファイルをInputモードでOpen
Open strFileName For Input As dfn
Do Until EOF(dfn)
'1レコード読み込み
Line Input #dfn, strLine
'物理レコードを論理レコードに追加
strRec = strRec & strLine
'レコードをフィールドに分割
vntField = SplitCsv(strRec, ",", , , 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 #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
' strLine :分割元と成る文字列
' strDelimiter :区切り文字
' SplitCsv :戻り値、切り出された文字配列
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 blnMultiSel As Boolean = False) As Boolean
Dim i As Long
Dim strFilter As String
'フィルタ文字列を作成
For i = 1 To 4
strFilter = strFilter & Choose(i, "CSV File (*.csv),*.csv,", _
"Text File (*.txt),*.txt,", _
"CSV and Text (*.csv; *.txt),*.csv;*.txt,", _
"全て (*.*),*.*")
Next i
'読み込むファイルの有るフォルダを指定
If strFilePath <> "" Then
'ファイルを開くダイアログ表示ホルダに移動
ChDrive Left(strFilePath, 1)
ChDir strFilePath
End If
'もし、ディフォルトのファイル名が有る場合
If vntFileNames <> "" Then
SendKeys vntFileNames, False
End If
'ファイルを開くダイアログ表示ホルダを表示
vntFileNames _
= Application.GetOpenFilename(strFilter, 1, , , blnMultiSel)
If VarType(vntFileNames) = vbBoolean Then
Exit Function
End If
GetReadFile = True
End Function
|
|