Excel VBA質問箱 IV

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

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


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

【5729】CSVのデータ(例3/8)取得方法 こーじ 03/5/28(水) 23:49 質問
【5746】Re:CSVのデータ(例3/8)取得方法 Jaka 03/5/29(木) 13:00 回答
【5796】Re:CSVのデータ(例3/8)取得方法 こーじ 03/5/31(土) 10:00 質問
【5798】Re:CSVのデータ(例3/8)取得方法 よろずや 03/5/31(土) 13:04 回答
【5800】どれほど遅いか試して見ますか Hirofumi 03/5/31(土) 16:58 回答
【5814】Re:CSVのデータ(例3/8)取得方法 こーじ 03/6/2(月) 17:28 お礼
【5815】Re:CSVのデータ(例3/8)取得方法 03/6/2(月) 17:41 回答
【5818】Re:CSVのデータ(例3/8)取得方法 こーじ 03/6/2(月) 18:05 お礼

【5729】CSVのデータ(例3/8)取得方法
質問  こーじ E-MAIL  - 03/5/28(水) 23:49 -

引用なし
パスワード
   はじめまして。どなたか、ご存知でしたら教えてください。
CSVファイルのデータを読み込んで、値をエクセルのシートに書き込もうとしています。
CSVのある列に3/8や1/4などの分数が含まれおり(ちなみその列はインチを表しており、分数だけでなく16等の整数のデータもある)、そのデータを文字列として3/8や1/4という形で読み取りたいのですが、3月8日というふうに日付で読み取ってしまいます。どうすればよいのでしょうか?

'CSVファイル名を設定する
strOutFileName = ActiveWorkbook.Path + "\" + "BodyPrice.csv" Workbooks.Open strOutFileName
With ActiveSheet

'操作対象最下行を取得
strEndRow = ActiveCell.SpecialCells(xlCellTypeLastCell).Row

strCSVサイズ = ""

For i = 1 To strEndRow

  'データ取得
  strCSVサイズ = Trim(.Cells(i, 4).Text)

strCSVサイズに3月8日という値が設定されます。
  strCSVサイズ = Trim(.Cells(i, 4).Value)
に変更すると、strCSVサイズに2003/3/8という値が設定されます。

以上、よろしくお願いします。

【5746】Re:CSVのデータ(例3/8)取得方法
回答  Jaka  - 03/5/29(木) 13:00 -

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

[#1910]見てみてね。全部文字列としていますけど..。

基本TBL行数 = 1000
 ↓
基本TBL行数 = 500
の方が良い様です。もう少し厳密に分けると200、100にした方が良い時もあるけど。

他は、拡張子をTxtに変えて文字列として読むか、2000以上だったらクエリで読み込むとか..。

【5796】Re:CSVのデータ(例3/8)取得方法
質問  こーじ  - 03/5/31(土) 10:00 -

引用なし
パスワード
   ありがとうございます。お礼が遅くなって済みません。CSVファイルをOpenで開いて、Input #で配列変数に取り込んで、それをEXCELに貼り付けることで解決しました。
ただ、できれば解決したい問題が残りました。
SCVの1つの文字列の中に全角のカンマ(,)と全角のダブルクォーテーション(”)が使用されています。

J5 ,国語テスト       ,M10 ,
J5 ,テスト1,テスト2   ,M10 ,
J5 ,時間”9:30”遅刻厳禁 ,M10 ,

これをInput #で配列変数に取り込む時、
「テスト1,テスト2」が「テスト1」「テスト2」
となります。
これを回避するため、下記のように文字列を半角のダブルクォーテーションで囲むようにすると

J5 ,"テスト1,テスト2",M10 ,
J5 ,"時間”9:30”遅刻厳禁",M10 ,

今度は
「"時間”9:30”遅刻厳禁"」が「時間」「9:30”遅刻厳禁"」
となってしまいます。

Input #が全角の(,)(”)を半角の(,)(")と同様に扱ってしまっていることが原因のようですが、ヘルプをみても、区別して認識させる方法が載ってないようです。
どなたか、何か解決方法をご存知の方がいらしたら教えてください。
以上よろしくお願いします。

  〜略〜
  'CSVファイルのデータを文字列形式でEXCELファイルに丸ごとコピーする
  Open strOutFileName For Input As #1
  
  'Excelファイル名を設定する
  strTempFileName = ActiveWorkbook.Path + "\" + str本体価格CSVtoEXCELファイル名称
  
  '一時的にEXCELファイルを作成して、ワークブックで開いて処理をした後、削除する。
  Open strTempFileName For Output Access Write As #2
  Close #2
  
  Workbooks.Open strTempFileName  'CSVファイルを貼り付けるEXCELファイルが現在アクティブ

  Do Until EOF(1)
    lngCSV処理CNT = lngCSV処理CNT + 1
    lngCSVTBL行CNT = lngCSVTBL行CNT + 1
    Application.StatusBar = strCSV拡張子 & "全データ " & lngCSV全データ行数 & "行中、" & Format(lngCSV処理CNT, "000000") & "行目読込み中"
    'CSVファイルの内容を1行ずつ配列に設定する
    For i = 1 To intCSVカンマ数 + 1
      Input #1, strCSVTBL(lngCSVTBL行CNT, i)
    Next
    '配列の内容をEXCELに貼り付ける
    If lngCSVTBL行CNT = lngCSVTBL行数 Or EOF(1) Then
      ActiveWorkbook.Worksheets(1).Range(Cells(intCSV行, intCSV書始め列), Cells(intCSV行 + lngCSVTBL行数 - 1, intCSV書始め列 + intCSVカンマ数)).Value = strCSVTBL
    End If
  Loop
  Close #1
  Erase strCSVTBL
  〜略〜

【5798】Re:CSVのデータ(例3/8)取得方法
回答  よろずや  - 03/5/31(土) 13:04 -

引用なし
パスワード
   Line Input # で行単位で読んで、1文字ずつ検査して分割するしかないような。
でも、これやるとすごく遅いです。

【5800】どれほど遅いか試して見ますか
回答  Hirofumi E-MAIL  - 03/5/31(土) 16:58 -

引用なし
パスワード
   どれほど遅いか、試して見ますか?
一度、Excelに読み込んで再度Saveしなおしているのが、1/2、3/8
の処理の為なら、このまま読み込んだだけで言い様な気がしますが?
尚、ダブルクォーツ、カンマの処理はCSVの出力ルールに準拠した積もりです
また、このコードは、アクティブシートのA1から書き出す様にして有りますので
その辺は、変更して下さい

Public Sub CSVRead()

  Dim i As Long
  Dim strData() As String
  Dim dfn As Integer
  Dim strFileName As String
  Dim strBuff As String
  
  'CSVファイル名を設定する
  strFileName = ActiveWorkbook.Path + "\" + "BodyPrice.csv"
  
  dfn = FreeFile
  Open strFileName For Input As dfn
  
  i = 1
  Do Until EOF(dfn)
    Line Input #dfn, strBuff
    SplitLine strBuff, strData()
    With Cells(i, 1)
      Range(.Offset(, 0), .Offset(, UBound(strData))).Value _
                              = strData
    End With
    i = i + 1
  Loop
  
  Close #dfn
  
End Sub

Public Sub SplitLine(ByVal strLine As String, strData() As String, _
          Optional strDelimiter As String = ",", _
          Optional strQuote As String = """", _
          Optional strRet As String = vbCrLf, _
          Optional blnMultiLine As Boolean = False)

'      strLine     :分割元と成る文字列
'      strDelimiter  :区切り文字

  Dim lngDPos As Long
  Dim lngStart As Long
  Dim i As Long
  Dim strField As String
  Dim lngLength As Long
  
  i = 0
  lngStart = 1
  lngLength = Len(strLine)
  blnMultiLine = False
  
  Do
    ReDim Preserve strData(i)
    If Mid(strLine, lngStart, 1) <> strQuote Then
      lngDPos = InStr(lngStart, strLine, strDelimiter, _
                          vbBinaryCompare)
      If lngDPos > 0 Then
        strField = Mid(strLine, lngStart, lngDPos - lngStart)
        lngStart = lngDPos + 1
      Else
        strField = Mid(strLine, lngStart)
        lngStart = lngLength + 1
      End If
    Else
      lngStart = lngStart + 1
      Do
        lngDPos = InStr(lngStart, strLine, strQuote, _
                          vbBinaryCompare)
        If lngDPos > 0 Then
          strField = strField & 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
              strField = strField & strQuote
          End Select
        Else
          blnMultiLine = True
          strField = Mid(strLine, lngStart) & strRet
          lngStart = lngLength + 1
          Exit Do
        End If
      Loop
    End If
    strData(i) = Trim(strField)
    strField = ""
    i = i + 1
  Loop Until lngLength <= lngStart
    
End Sub

【5814】Re:CSVのデータ(例3/8)取得方法
お礼  こーじ  - 03/6/2(月) 17:28 -

引用なし
パスワード
   ありがとうございます。
1.CSVファイルを1行づつInput #で2次元配列変数取り込み、それを全行繰り返した後、EXCELに貼り付けるという処理と、
2.CSVファイルを1行づつLine Input #で変数に取り込み、それを区切り文字を判定して1次元配列に取り込み、EXCELに貼り付ける、という処理を全行繰り返す、
という処理の時間を比較してみましたが、私のパソコンで13000行処理するのに、体感ですがどちらも3秒程度でした。そのため、問題が解決する2.の処理方法を採用するこにしました。
みなさん、ありがとうございました。

【5815】Re:CSVのデータ(例3/8)取得方法
回答    - 03/6/2(月) 17:41 -

引用なし
パスワード
   CSV形式のファイルの場合、区切り記号などの設定は、規定のものになってしまうので、CSVファイルを、仮にtext形式にコピーしてから、開くうのはどうでしょうか?
そうしたら、Workbooks.OpenTextで、指定ができます。

【5818】Re:CSVのデータ(例3/8)取得方法
お礼  こーじ  - 03/6/2(月) 18:05 -

引用なし
パスワード
   ありがとうございます。
きっとよりよい方法なのだと思いますが、初心者のため、基本的なことでも試すのに時間がかかってしまいます。そのため、今の方法に破綻をきたしたり、別の機会があった時、試みようと思います。せっかく教えていただいたのに済みません。

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