Excel VBA質問箱 IV

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

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


1136 / 13645 ツリー ←次へ | 前へ→

【76108】CSVの読み込みについて 勉強中です。 14/9/26(金) 22:19 質問[未読]
【76109】Re:CSVの読み込みについて kanabun 14/9/26(金) 23:08 発言[未読]
【76111】Re:CSVの読み込みについて 勉強中です。 14/9/26(金) 23:44 お礼[未読]
【76110】Re:CSVの読み込みについて kanabun 14/9/26(金) 23:23 発言[未読]

【76108】CSVの読み込みについて
質問  勉強中です。  - 14/9/26(金) 22:19 -

引用なし
パスワード
   どなたかご教示ください。

現在下記の内容の記述をし,任意のCSVファイルをエクセルに取り込めるようになっています。記述については,ネット上で探したものをそのまま使用しており,恥ずかしながら細かく理解できていません。

あるCSVのセル(※エクセル形式で開けているので,セルごとになっています。)には,セル内で「,」で区切られたものがあり(例えば,一つのセル内で「りんご,みかん,すいか」のように),このセルがエクセルに出力された際には,「りんご」「みかん」「すいか」と別々のセルに出力されてしまいます。
私としては,エクセルのセルとして,一つのセルの中に「りんご,みかん,すいか」を格納したいのですが,以下の記述をどのように変えればそのようにできるのかがわかりません。

どなたかお分かりの方,ご教示いただけないでしょうか。
どうかよろしくお願いいたします。

Sub READ_TextFile()
  Const cnsTITLE = "テキストファイル読み込み処理"
  Const cnsFILTER = "CSV形式ファイル (*.csv),*.csv,全てのファイル(*.*),*.*"
  Dim xlAPP As Application    ' Applicationオブジェクト
  Dim intFF As Integer      ' FreeFile値
  Dim strFileName As String    ' OPENするファイル名(フルパス)
  Dim vntFileName As Variant   ' ファイル名受取り用
  Dim X() As Variant       ' 読み込んだレコード内容
  Dim IX1 As Long         ' CSV項目カラムINDEX
  Dim GYO As Long         ' 収容するセルの行
  Dim lngREC As Long       ' レコード件数カウンタ
  Dim strREC As String      ' レコード領域
  Dim POS1 As Long        ' レコード文字位置INDEX
  Dim POS2 As Long        ' レコード文字位置INDEX

  ' Applicationオブジェクト取得
  Set xlAPP = Application
  
  'カレントディレクトリ変更/今回はデスクトップに変更
CreateObject("WScript.Shell").CurrentDirectory = CreateObject("WScript.Shell").SpecialFolders("Desktop")
  
  ' 「ファイルを開く」のダイアログでファイル名の指定を受ける
  xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
  vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
                    Title:=cnsTITLE)
  ' キャンセルされた場合はFalseが返るので以降の処理は行なわない
  If VarType(vntFileName) = vbBoolean Then Exit Sub
  strFileName = vntFileName

  ' FreeFile値の取得(以降この値で入出力する)
  intFF = FreeFile
  ' 指定ファイルをOPEN(入力モード)
  Open strFileName For Input As #intFF
  GYO = 1
  ' ファイルのEOF(End of File)まで繰り返す
  Do Until EOF(intFF)
    ' レコード件数カウンタの加算
    lngREC = lngREC + 1
    xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)"
    ' 行単位にレコードを読み込む
    Line Input #intFF, strREC                    ' 1.

    ' LineInputより自分で半角カンマを探しCSV→項目分割させる
    POS1 = 1
    IX1 = 0
    ReDim X(IX1)        ' 配列を初期化
    Do While POS1 <= Len(strREC)                  ' 2.
      POS2 = InStr(POS1, strREC, ",", vbTextCompare)       ' 3.
      If POS2 < POS1 Then
        POS2 = Len(strREC) + 1
      End If
      ReDim Preserve X(IX1)  ' 配列要素数を再設定
      X(IX1) = Trim$(Mid$(strREC, POS1, POS2 - POS1))       ' 4.
      ' シングルクォーテーション、ダブルクォーテーションで囲まれている場合は
      ' 両端文字を取り除く
      If (((Left$(X(IX1), 1) = """") And (Right$(X(IX1), 1) = """")) Or _
        ((Left$(X(IX1), 1) = "'") And (Right$(X(IX1), 1) = "'"))) Then ' 5.
        X(IX1) = Trim$(Mid$(X(IX1), 2, Len(X(IX1)) - 2))
      End If
      POS1 = POS2 + 1
      IX1 = IX1 + 1
    Loop

    ' 行を加算しレコード内容を表示(先頭は2行目)
    GYO = GYO + 1
    If IX1 >= 1 Then
      Range(Cells(GYO, 1), Cells(GYO, IX1)).Value = X  ' 配列渡し 6.
    End If
  Loop
  ' 指定ファイルをCLOSE
  Close #intFF
  xlAPP.StatusBar = False
  ' 終了の表示
  MsgBox "ファイル読み込みが完了しました。" & vbCr & _
    "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub

【76109】Re:CSVの読み込みについて
発言  kanabun  - 14/9/26(金) 23:08 -

引用なし
パスワード
   ▼勉強中です。 さん:

>私としては,エクセルのセルとして,一つのセルの中に「りんご,みかん,すいか」を格納したいのですが,以下の記述をどのように変えればそのようにできるのかがわかりません。

そのプログラムはExcel上で作動仕様としているのに、別のExcelを立ち上げて
いますが、どうしてその必要があるのでしょう?

コードを読めば判るように、
カンマで項目に分割しているだけです。

>    ' 行単位にレコードを読み込む
>    Line Input #intFF, strREC                    ' 1.
>
>    ' LineInputより自分で半角カンマを探しCSV→項目分割させる

"あ,い,う"
というデータがあっても、ダブルクォートに配慮していません。

[データ]-[外部データの取り込み]-[テキストファイルのインポート]メニュ−より
カンマ区切りを指定して取り込む QueryTables を利用しましょう。
そのマクロ記録を編集すれば、VBAコードができます。

【76110】Re:CSVの読み込みについて
発言  kanabun  - 14/9/26(金) 23:23 -

引用なし
パスワード
   たとえば、あるCSVファイルをQueryTablesで取り込むマクロ記録を
とりますと以下のようになりますが、

Option Explicit

Sub Macro1()
' Macro recorded 2014/9/26 by kanabun
'
  With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;H:\(Data)\FData\F_Data.Csv", Destination:=Range("A1"))
    .Name = "F_Data"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 932
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(2, 2, 2, 1, 1, 1, 1, 1, 5, 1, 5)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
  End With
End Sub

最初の
>  With ActiveSheet.QueryTables.Add(Connection:= _
>    "TEXT;H:\(Data)\FData\F_Data.Csv", Destination:=Range("A1"))

部分のCSVファイル名のところを
>  'カレントディレクトリ変更/今回はデスクトップに変更
>CreateObject("WScript.Shell").CurrentDirectory = >CreateObject("WScript.Shell").SpecialFolders("Desktop")
>  
>  ' 「ファイルを開く」のダイアログでファイル名の指定を受ける
>  xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
>  vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
>                    Title:=cnsTITLE)
>  ' キャンセルされた場合はFalseが返るので以降の処理は行なわない
>  If VarType(vntFileName) = vbBoolean Then Exit Sub
>  strFileName = vntFileName

を使って 変数 strFileName に取得すれば、

With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & strFileName, Destination:=Range("A1"))

と書き替えて一般化できます。

また
>   .TextFileColumnDataTypes = Array(2, 2, 2, 1, 1, 1, 1, 1, 5, 1, 5)
のところは 列ごとのデータ型を設定しているところで、
2 は 文字列データ、
5 は 日付(YMD型) データ
としている部分ですので、読み込むCSVデータの列に合わせて適宜設定してください。

また、最後の

>    .Refresh BackgroundQuery:=False
>  End With

のところは、インポートしたら元のデータとの接続をCUTするため、

>    .Refresh BackgroundQuery:=False
     .Delete
>  End With

の一行を加えるといいでしょう。

【76111】Re:CSVの読み込みについて
お礼  勉強中です。  - 14/9/26(金) 23:44 -

引用なし
パスワード
   早速のご回答ありがとうございました。
大変参考になりました。
もう少し勉強もしてみます。

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