0

次のコードを使用してExcelにクエリを実行し、特定の条件に一致する行を取得しています。

For i = 90 To Worksheets("My Sheet").Range("E65536").End(xlUp).Row
' This for loop is to iterate through the list of dates in the excel sheet
Value = Worksheets("My Sheet").Range("E" & i).Value - #1/1/1900# + 2
'Using the above line i am converting the date i want to filter the date 
 'into numeric
strQuery = "SELECT * FROM [My another sheet$A3:I" & LastRow & "] WHERE [Date1]< " &
Value & " AND ([somefield] = 'dog' or [somefield] = 'cat')"
    ' Here in the SQL query i am trying to see how many cats and dogs are satisfying with my date criteria
    Set rs = New ADODB.Recordset
        With rs
            .ActiveConnection = cn
            .Source = strQuery
            .CursorType = adOpenDynamic
            .CursorLocation = adUseClient
            .LockType = adLockOptimistic
            .Open
        End With


' Executing the select query on excel as database using ADODB api
    If rs.RecordCount = 0 Then        
        Else
            rs.MoveLast        
    End If
 Worksheets("My Sheet").Range("F" & i).Value = rs.RecordCount
 rs.Close
 ' Moving to the next date in the list
Next

私はこのようなデータを持っています

  1. 2012年1月1日犬A
  2. 2012年2月1日猫B
  3. 2012年3月1日猫C
  4. 2012年4月1日ラットD
  5. 2012年5月1日猫E
  6. 2012年6月1日オウムF

私のリストにはこのような日付があります

  1. 2010年12月31日-ここで、この日付より前の日付でショップから購入された猫と犬の数を確認する必要があります
  2. 2011年12月31日-ここで、この日付より前の日付でショップから購入された猫と犬の数を確認する必要があります

forループの目的は、これらの日付を反復処理し、選択クエリを変更することです。これは、上記のコードから受け取った値です。

32 35 37 44 57 64 71 78 84 86 89 91 91 32 36 37 47 57 66 73 81 84 89 90 91 91 しかし、レコードカウントプロパティを使用する前にコマンドを発行する必要があるように、どこかで読んだ これらの値を取得する必要が rs.movelastありますが、それでも一部の反復で間違った結果が表示されます。

ループが原因で、同じレコードセットを使用しています。

カウントが必要であることがわかっている理由は、Excel列で同じフィルタリングを実行しただけで、異なるカウントが表示されているためです。

列でデータ型が変更されることはありません。つまり、各列のデータ構造は最初から最後まで同じです。

これについて私を助けてください。

質問が明確であることを願っています。詳細が必要な場合はお知らせください。

4

1 に答える 1

1

これを試して。それはループを排除します。Sheet7には日付のリストがあり、Sheet8にはデータがあります。

Sub groupbydate()
    sSQL = "TRANSFORM Count(b.Dates) AS CountOfDates " _
    & "SELECT 'Total' AS Total " _
    & "FROM [Sheet7$] a, [Sheet8$] b " _
    & "WHERE b.Animal In ('cat','dog') " _
    & "AND b.[dates]<=a.[dates] " _
    & "GROUP BY 'Total' " _
    & "PIVOT a.Dates"

    strFile = ActiveWorkbook.FullName

    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

    ''Late binding, so no reference is needed

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    cn.Open strCon

    rs.Open sSQL, cn, 3, 3

    For i = 1 To rs.Fields.Count
        Worksheets("Sheet8").Cells(1, 5 + i) = rs.Fields(i - 1).Name
    Next
    Worksheets("Sheet8").Cells(2, 6).CopyFromRecordset rs

    ''Tidy up
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Sub
于 2012-09-22T13:45:48.217 に答える