Excel VBA質問箱 IV

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

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


9137 / 13644 ツリー ←次へ | 前へ→

【26610】テキストデータの読み込みについて ピンキー 05/7/12(火) 9:27 質問[未読]
【26613】Re:テキストデータの読み込みについて Jaka 05/7/12(火) 9:59 回答[未読]
【26617】Re:テキストデータの読み込みについて ピンキー 05/7/12(火) 10:26 質問[未読]
【26621】Re:テキストデータの読み込みについて Jaka 05/7/12(火) 10:53 発言[未読]
【26648】Re:テキストデータの読み込みについて りん 05/7/12(火) 19:33 発言[未読]
【26624】Re:テキストデータの読み込みについて Kein 05/7/12(火) 11:09 回答[未読]
【26715】Re:テキストデータの読み込みについて Hirofumi 05/7/14(木) 20:11 回答[未読]
【29144】Re:テキストデータの読み込みについて ピンキー 05/9/26(月) 17:24 お礼[未読]

【26610】テキストデータの読み込みについて
質問  ピンキー  - 05/7/12(火) 9:27 -

引用なし
パスワード
   みなさんおはようございます。
りんご¥果物¥12
キャベツ¥野菜¥6
トマト¥野菜¥9
というCSVのテキストデータがありまして、それをエクセルで
  A    B    C
 りんご  果物   12
 キャベツ 野菜    6
 トマト  野菜    9
というふうに¥マークごとにデータを分けて読み込みたいのですがどうすればいいでしょうか?
よろしくお願いします。

【26613】Re:テキストデータの読み込みについて
回答  Jaka  - 05/7/12(火) 9:59 -

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

拡張子をTxtにして、エクセルから「開く」で、
区切り文字をその他「\」にすれば良いです。

因みにCSVファイルはカンマ区切りのテキストって事です。

【26617】Re:テキストデータの読み込みについて
質問  ピンキー  - 05/7/12(火) 10:26 -

引用なし
パスワード
   Jakaさん。こんにちは。
すいません。りんご¥果物¥12の他にもデータがありまして他のデータはカンマ区切りなのですべてを¥区切りにしてしまうとうまく読み込めないので、まずカンマ区切りのデータを読み込んで、その後で¥マーク区切りのデータを取り込みたいのですが、無理なのでしょうか?

【26621】Re:テキストデータの読み込みについて
発言  Jaka  - 05/7/12(火) 10:53 -

引用なし
パスワード
   よく解りません。
カンマ区切りのCSVファイルを読み込んだファイルに、\区切りのファイルを開いた後、コピペするなりすればいいと思います。

【26624】Re:テキストデータの読み込みについて
回答  Kein  - 05/7/12(火) 11:09 -

引用なし
パスワード
   Openステートメントを使うなら

Sub Test_Txt()
  Dim Buf As String
  Dim Ary As Variant
  Dim i As Long
  Const MyF As String = _
  "C:\Documents and Settings\User\My Documents\Test.txt"
  '↑テキストファイルの正確なフルパスに変更しておくこと。

  Open MyF For Input Access Read As #1
  Do Until EOF(1)
   Line Input #1, Buf
   If InStr(1, Buf, "\") > 0 Then
     Ary = Split(Buf, "\")
   ElseIf InStr(1, Buf, ",") > 0 then
     Ary = Split(Buf, ",")
   End If
   i = i + 1
   Cells(i, 1).Resize(, UBound(Ary) + 1).Value = Ary
   Erase Ary
  Loop
  Close #1
End Sub

【26648】Re:テキストデータの読み込みについて
発言  りん E-MAIL  - 05/7/12(火) 19:33 -

引用なし
パスワード
   こんばんわ。

>カンマ区切りのCSVファイルを読み込んだファイルに、\区切りのファイルを開いた後、コピペするなりすればいいと思います。
Jakaさんの方法に追加ですが。
拡張子をcsv以外のテキストファイルにして、いったん開き、
 データ→区切り位置
  カンマやタブなどの区切文字〜
  
で、区切り文字をカンマとその他にチェックを入れて、その他に『\』を入れて、
区切ればいいのでは?

【26715】Re:テキストデータの読み込みについて
回答  Hirofumi  - 05/7/14(木) 20:11 -

引用なし
パスワード
   もう見て居ないかな?
データが、この様なデータなのかな?

りんご¥果物¥12,123,◎◎◎◎,#####
キャベツ¥野菜¥6,456,▲▲▲▲,$$$$$
トマト¥野菜¥9,789,◇◇◇◇,&&&&

何処に、どんな風に出力すか不明なので、
Sheet1にCsvとしての出力
Sheet2に"¥"の区切りの出力をしています

Option Explicit

Public Sub TextRead()

  Dim i As Long
  Dim dfn As Integer
  Dim vntFileName As Variant
  Dim strBuff As String
  Dim lngRow As Long
  Dim rngResult As Range
  Dim rngSubResult As Range
  Dim vntField As Variant
  Dim vntSubField As Variant
  Dim strProm As String
  
  'Openするファイルを選択
  If Not GetReadFile(vntFileName, ThisWorkbook.Path, False) Then
    strProm = "マクロがキャンセルされました"
    GoTo Wayout
  End If
  
  '出力する、場所を指定
  Set rngResult = Worksheets("Sheet1").Cells(1, "A")
  Set rngSubResult = Worksheets("Sheet2").Cells(1, "A")
  
  'ファイルをOpen
  dfn = FreeFile
  Open vntFileName For Input As dfn
  
  'ファイルエンドまで繰り返し
  Do Until EOF(dfn)
    'ファイルより1行、変数に読み込み
    Line Input #dfn, strBuff
    'カンマ区切りデータとして、カンマで分割
    vntField = SplitCsv(strBuff, ",")
    'Sheet1に出力
    With rngResult.Offset(lngRow)
      .Resize(, UBound(vntField) + 1).Value = vntField
    End With
    '"¥"区切り賭して、第0フィールドを分割
    '実際に分割するフィールドを指定して下さい
    'この場合、フィールドは0から始まります
    vntSubField = SplitCsv(vntField(0), "¥")
    'Sheet2にサブフィールドを出力
    With rngSubResult.Offset(lngRow)
      .Resize(, UBound(vntSubField) + 1).Value = vntSubField
    End With
    '書き込み行を更新
    lngRow = lngRow + 1
  Loop
  
  'ファイルをClose
  Close #dfn
  
  Set rngResult = Nothing
  Set rngSubResult = Nothing
  
  strProm = "処理が完了しました"
  
Wayout:
  
  Beep
  MsgBox strProm
    
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, 2, , , blnMultiSel)
  If VarType(vntFileNames) = vbBoolean Then
    Exit Function
  End If
  
  GetReadFile = True
  
End Function

【29144】Re:テキストデータの読み込みについて
お礼  ピンキー  - 05/9/26(月) 17:24 -

引用なし
パスワード
   Jakaさん、Keinさん、Hirofumiさん。ありがとうございました。
解決していたのに放置になってしまいすいませんでした。
今後は気をつけて参りますので今後ともよろしくお願いしますm(__)m

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