adodb 记录计数返回错误值
Posted
技术标签:
【中文标题】adodb 记录计数返回错误值【英文标题】:adodb recordcount returning wrong values 【发布时间】:2012-09-22 05:44:50 【问题描述】:我正在使用以下代码查询 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
我有类似这样的数据
-
01/01/2012 狗A
02/01/2012 猫 B
03/01/2012 猫 C
04/01/2012 大鼠 D
05/01/2012 猫 E
06/01/2012 鹦鹉 F
我的名单上有这样的日期
-
12/31/2010 - 在这里我必须找出有多少只猫和狗
从日期小于此日期的商店购买
12/31/2011 - 在这里我必须找出有多少只猫和狗
从日期小于此日期的商店购买
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 列进行了相同的过滤,它显示的计数不同
列中的数据类型没有变化,即每列从头到尾都有相同的数据结构
请帮帮我。
我希望问题很清楚。如果需要更多详细信息,请告诉我。
【问题讨论】:
我看到你的投票很接近,我并不感到惊讶,因为我也无法弄清楚你在做什么。什么是 For ... Next 循环? LastRow 来自哪里?你的数据是在不同的情况下吗?你所有的约会都好吗?你怎么知道计数应该是多少? 对不起。为问题添加了更多细节。 对所有这些戏剧感到抱歉..我刚刚意识到,当我在 Excel 中进行过滤时,我选择的条件小于或等于..但是在选择相等条件时缺少..谢谢大家..我不知道如何结束这个问题。 【参考方案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
【讨论】:
以上是关于adodb 记录计数返回错误值的主要内容,如果未能解决你的问题,请参考以下文章
SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数