過去ログ

                                Page     169
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼テキストファイルにフィルターを掛ける  初心者M 02/10/6(日) 15:11
   ┗Re:テキストファイルにフィルターを掛ける  Hirofumi 02/10/6(日) 16:28

 ───────────────────────────────────────
 ■題名 : テキストファイルにフィルターを掛ける
 ■名前 : 初心者M
 ■日付 : 02/10/6(日) 15:11
 -------------------------------------------------------------------------
   こんにちは。

10万件以上あるテキストファイルから、必要なデータだけを取り出し、エクセルに読み込みたいのですが、ADOで接続し、フィルターを掛けたところ、 
「0045」= 「45」  と照合しているようなのです。

ところが、テキストファイルでは 0045 なのですが、 読み込んでみると 45 となっているのです。

読み込む際に、フィールドのデータ型などを設定する必要があるのでしょうか?

  ' レコードセットをオープン
  Set rst = New ADODB.Recordset
  
  rst.Source = strDBName
  rst.ActiveConnection = cn
  rst.CursorType = adOpenStatic  ’←この辺よく分からないので、本のまま。。
  rst.Open
  
  Do While Not rst.EOF
    
    Debug.Print rst.Fields(0) ’← この地点で 0045 が 45 に。。。
    Stop
    rst.MoveNext
  Loop


テキストファイルの区切り記号は カンマと決まっているのですが、将来は項目が増加しそうなので 、どう扱えばいいのか困っています。

無条件でテキストファイルと同様に読み込む方法とか、フィールドのデータ型を調べる方法とか、
ヒントがあれば、教えてください。
宜しくお願いします。
 ───────────────────────────────────────  ■題名 : Re:テキストファイルにフィルターを掛ける  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/10/6(日) 16:28  -------------------------------------------------------------------------
   >10万件以上あるテキストファイルから、必要なデータだけを取り出し、エクセルに読み込みたいのですが、ADOで接続し、フィルターを掛けたところ、 
>「0045」= 「45」  と照合しているようなのです。

TextファイルにADOで接続し、Excelに抽出した事が無いので、
ゴミレスに成るかも知れませんが
余り複雑じゃない抽出ならVBAのOpenステートメントだけでも出来るのでは?

以下のコードはThisWorkbook.Pathにある "TestFile.csv"から
第1フィールドが「0045」、第2フィールドが「0046」の物を
Excelのアクティブシートにに取り出す例です

標準モジュールに記入して下さい

Public Sub CSVTextRead()

  Dim intCalc As Integer
  
  With Application
    '画面更新を停止
    .ScreenUpdating = False
    '再計算の方法を保存
    intCalc = .Calculation
    '再計算を手動へ
    .Calculation = xlCalculationManual
  End With

  CSVReadTextLine ThisWorkbook.Path & "\" & "TestFile.csv", ","
  
  With Application
    '再計算の仕方を元に戻す
    .Calculation = intCalc
    '再計算を実行
    .Calculate
    '画面更新を再開
    .ScreenUpdating = True
  End With

End Sub

Public Sub CSVReadTextLine(strFileName As String, _
        Optional strDelimiter As String = ",")
  
  Dim i As Long
  Dim dfn As Integer
  Dim vntData As Variant
  Dim strLine As String
  Dim blnMultiLine As Boolean
  Dim strRec As String
  
  dfn = FreeFile
  Open strFileName For Input As dfn
  
  i = 1
  Do Until EOF(dfn)
    Line Input #dfn, strLine
    strRec = strRec & strLine
    vntData = SplitLine(strRec, strDelimiter, , , blnMultiLine)
    If blnMultiLine Then
      strRec = strRec & vbLf
    Else
      'もし第1フィールドが「0045」、
      '第2フィールドが「0046」の物をExcelに取り出したいのなら
      If vntData(1, 1) = "0045" And vntData(1, 2) = "0046" Then
        Range(Cells(i, 1), _
            Cells(i, UBound(vntData, 2))).Value = vntData
        i = i + 1
      End If
      strRec = ""
    End If
  Loop
  
  Close #dfn
  
End Sub


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

'      strLine     :分割元と成る文字列
'      strDelimiter  :区切り文字
'      SplitLine    :戻り値、切り出された文字配列

  Dim lngDPos As Long
  Dim vntData() As Variant
  Dim lngStart As Long
  Dim i As Long
  Dim strField As String
  Dim lngLength As Long
  
  i = 1
  lngStart = 1
  lngLength = Len(strLine)
  blnMultiLine = False
  
  Do
    ReDim Preserve vntData(1 To 1, 1 To 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
    vntData(1, i) = strField
    strField = ""
    i = i + 1
  Loop Until lngLength < lngStart
  
  SplitLine = vntData()
  
End Function
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 169