Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


28366 / 76738 ←次へ | 前へ→

【53671】Re:CSVデータの取込み時に、出力先(列の指定)をするには?
回答  Hirofumi  - 08/1/30(水) 19:41 -

引用なし
パスワード
   このコードでは、

    '論理レコードをフィールドに分割
    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

0 hits

【53670】CSVデータの取込み時に、出力先(列の指定)をするには? GON 08/1/30(水) 16:29 質問
【53671】Re:CSVデータの取込み時に、出力先(列... Hirofumi 08/1/30(水) 19:41 回答
【53687】Re:CSVデータの取込み時に、出力先(列... GON 08/2/1(金) 14:04 お礼
【53673】Re:CSVデータの取込み時に、出力先(列... マルチーズ 08/1/30(水) 20:07 発言

28366 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free