【发布时间】:2014-08-26 15:26:06
【问题描述】:
尝试使用 ADODB 记录集在 VBA 中计算 RecordSet 计数,但似乎无法使计数正常工作。
我在具有唯一 ID 的工作表中有 50 条记录,其中一些已经在数据库中,而另一些则不在,代码本身是循环遍历每个单元格并获取单元格的值并通过SQL select 语句,如果有命中则说找到,如果没有则什么也不说。
不幸的是,它似乎对所有内容都返回相同的结果,即使是我知道的 id 也不存在。
代码如下
Sub NO6_ChequeCheck()
Dim con As ADODB.Connection
Dim rec As ADODB.Recordset
Set con = New ADODB.Connection
Set rec = New ADODB.Recordset
Dim sql As String
Dim client As String
Dim myRange As Range
Dim myCell As Range
Set myRange = Range("A2:A52")
Dim i As Integer
i = 2
With con
.Provider = "MSDASQL"
.ConnectionString = "DSN=localhostTest"
.Open
End With
For Each myCell In myRange
client = myCell.text
sql = "SELECT * FROM crm_client_cheques WHERE id = '" & client & "' "
rec.Open sql, con
If rec.RecordCount = 0 Then
Cells(i, "H").Value = "Nothing"
Else
Cells(i, "H").Value = "Found"
End If
rec.Close
i = i + 1
Next myCell
我遇到的主要问题是,如果我将 0 切换为 50 并弄乱 = 符号并将其更改为 那么结果将更改为 either ,这让我相信它不会重置记录计数返回,所以它每次只是堆叠,所以它总是在每个循环中上升,而不是回到 0。
我试过告诉它关闭和等于什么,并移动了各种代码,但没有什么帮助。
感谢所有帮助
【问题讨论】:
-
此链接可能对您有所帮助:stackoverflow.com/questions/2282661/…
-
去掉
client变量周围的单引号是否一样 -
除了 cyboashus 答案,请参阅allenbrowne.com/ser-29.html(陷阱 4)。
-
count 方法只有在您遍历所有数据后才有效。请参阅 user3793865 下面关于 .bof 和 .eof 的答案,这是正确的做法。
-
如果您在该循环中反复查询记录集,您的代码将会非常缓慢。为什么不在循环遍历单元格之前查询记录集,然后在记录集中搜索循环内的值。