| 
    
     |  | このコードでは、 
 '論理レコードをフィールドに分割
 vntField = SplitCsv(strRec, strDelim, , , blnMulti)
 
 の所で上記の「vntField」と言う配列変数に、Csvの第1フィールドがvntField(0)、
 第2フィールドがvntField(1)、第3フィールドがvntField(2)・・と言う形に入ります
 そして、その「vntField」(1レコード分)を其のまま出力しています
 そこで、質問の
 
 >というコード、CSVデータの項目毎に列を指定したい場合は
 >どのようになりますか?
 >
 >1項目->A列、2項目->D列、3項目->C列 とか。
 
 と言う場合は、幾つかの方法が有りますが2つほど
 1、新しい出力用配列を用意して、1レコード分づつその配列に変更指定順番に転記してそれを出力する
 2、読み込み時には、そのまま読み込ませ、全てシートに出力し終わった時点で、
 最終行の下に変更する順の番号を出力して、其れをKeyとして列方向の整列を行い、整列後に整列Keyを削除
 
 まず1を考えた場合、以下の様に成ります
 
 Private Sub CSVRead(ByVal strFileName As String, _
 ByRef rngWrite As Range, _
 Optional ByRef lngRow As Long = 1, _
 Optional ByVal lngStart As Long = 1, _
 Optional strDelim As String = ",")
 
 '  strFileName:Csvのファイル名
 '  rngWrite:出力基準位置、
 '  lngRow:出力行位置
 '  lngStart:Csv読み込み開始行
 
 Dim i As Long
 Dim j As Long '★追加
 Dim dfn As Integer
 Dim vntField As Variant
 Dim strBuff As String
 Dim blnMulti As Boolean
 Dim strRec As String
 '読み込み順を指定する配列
 Dim vntOrder As Variant '★追加
 '出力用配列
 Dim vntResult As Variant '★追加
 
 '出力順を指定(1項目->A列、2項目->D列、3項目->C列)
 '出力用配列の頭から順にCsvのどの位置のフィールドを
 '持ってくるか指定する(ただし、-1は空欄とする)
 vntOrder = Array(0, -1, 2, 1) '★追加
 '出力用配列を確保
 ReDim vntResult(UBound(vntOrder)) '★追加
 
 i = 0 '★追加
 j = 0 '★追加
 'ファイルをOpen
 dfn = FreeFile
 Open strFileName For Input As dfn
 
 Do Until EOF(dfn)
 '1行読み込み
 Line Input #dfn, strBuff
 '論理レコードに物理レコードを追加
 strRec = strRec & strBuff
 '論理レコードをフィールドに分割
 vntField = SplitCsv(strRec, strDelim, , , blnMulti)
 'フィールド内で改行が有る場合
 If Not blnMulti Then
 '読み込み行数のカウントをとる
 i = i + 1
 If i >= lngStart Then
 With rngWrite.Offset(lngRow)
 '出力範囲を文字列に設定
 '          .Offset(, 1).Resize(, 2).NumberFormat = "@"
 '5列目の半角スペースをLfに置き換える
 On Error Resume Next
 vntField(4) = Replace(vntField(4), " ", vbLf, , , vbBinaryCompare)
 '列変更順に出力用配列に元データを代入
 For j = 0 To UBound(vntOrder) '★追加
 '空欄は飛ばす
 If vntOrder(j) > -1 Then '★追加
 vntResult(j) = vntField(vntOrder(j)) '★追加
 End If '★追加
 Next j '★追加
 On Error GoTo 0
 'データを出力
 '          .Resize(, UBound(vntField) + 1).Value = vntField
 .Resize(, UBound(vntResult) + 1).Value = vntResult '★変更
 End With
 '出力行をインクリメント
 lngRow = lngRow + 1
 End If
 Application.StatusBar = "読み込み中です...." & i & " レコード目"
 strRec = ""
 Else
 'セル内改行として残す場合
 strRec = strRec & vbLf
 End If
 Loop
 
 Close #dfn
 
 End Sub
 
 |  |