Excel VBA質問箱 IV

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

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


9115 / 13646 ツリー ←次へ | 前へ→

【29260】CSVファイルをマクロで読み込んだら・・・ あぶさん 05/9/29(木) 11:25 質問[未読]
【29263】Re:CSVファイルをマクロで読み込んだら・... m2m10 05/9/29(木) 11:52 発言[未読]
【29290】Re:CSVファイルをマクロで読み込んだら・・... Hirofumi 05/9/29(木) 20:11 回答[未読]

【29260】CSVファイルをマクロで読み込んだら・・・
質問  あぶさん  - 05/9/29(木) 11:25 -

引用なし
パスワード
   あるCSVファイルを自分で作成したVBAマクロでカンマ区切り単位で取得した情報をセルに貼り付けました。しかし、ファイルの中に本来の区切り位置でないところにカンマがあって、自分で作成したマクロだとこのイレギュラーなコンマを確認してしまいます。無理もないと思うのですが、ところがEXCELでこのファイルを読み込むとイレギュラーなカンマを無視してうまくEXCELのセル上に張り付きます。
なぜなんでしょうか? また自分の作成しているマクロでうまくいくための手段を教えてください。

【29263】Re:CSVファイルをマクロで読み込んだら・...
発言  m2m10  - 05/9/29(木) 11:52 -

引用なし
パスワード
   こんちは

マクロを提示してないので、推測でいれます。

 スプリットを「,」で別けたなら

  10,100.00 が 10  100.00 と成ります。

 こんな時は

   "10,00.00","aaaa"
 のようなCSVでしたら、

   「","」 で分割か又は、ADO、DAOですると楽。
   

   

【29290】Re:CSVファイルをマクロで読み込んだら・...
回答  Hirofumi  - 05/9/29(木) 20:11 -

引用なし
パスワード
   Csvの暗黙のご了解で?
ダブルクォーツで括られたフィールドには、
データとしてのカンマ、改行コード、ダブルクォーツ等を含める事が出来ます
(ただし、ダブルクォーツの場合は、連続して2つ入れる)
因って、質問の場合もフィールドが、ダブルクォーツで括られているのでは?

私の場合は以下の様なコードを使っています
「Function SplitCsv」は、ダブルクォーツの処理を行っていて、
データとしてのカンマ、改行コード、ダブルクォーツ等を見分けています

Option Explicit

Public Sub TextRead()

  Dim i As Long
  Dim vntFileName As Variant
  
  If Not GetReadFile(vntFileName, ThisWorkbook.Path) Then
    Exit Sub
  End If
  
  CSVRead vntFileName, ActiveSheet, 1, 1, ","
  
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, _
              Optional strDelim As String = ",")
  
  Dim dfn As Integer
  Dim vntField As Variant
  Dim strLine As String
  Dim blnMulti As Boolean
  Dim strRec As String
  
  dfn = FreeFile
  Open strFileName For Input As dfn
  
  Do Until EOF(dfn)
    Line Input #dfn, strLine
    strRec = strRec & strLine
    vntField = SplitCsv(strRec, strDelim, , , blnMulti)
    If Not blnMulti Then
      With wksWrite.Cells(lngRow, lngCol)
        .Resize(, UBound(vntField) + 1).Value = vntField
      End With
      lngRow = lngRow + 1
      strRec = ""
    Else
      strRec = strRec & vbLf
    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 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, 1, , , blnMultiSel)
  If VarType(vntFileNames) = vbBoolean Then
    Exit Function
  End If
  
  GetReadFile = True
  
End Function

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