jay*_*pes 2 excel vba adodb recordset excel-vba
我有一个程序应该从SQL数据库读取数据并向Excel报告。它可以在32位计算机上按预期工作,但是由于我移至64位工作环境,因此程序无法运行。这是我的代码示例(返回的第一个错误):
Private Sub SearchBox_Change()
ResultBox.Clear
Call CompileQuery
'If the query is empty
If SearchBox.Value = "" Then
NumShowingLabel = "Showing 0 of 0 Results"
ResultBox.Clear
GoTo noSearch
End If
'Open a new query with varQuery
With varRecordset
.ActiveConnection = varConnection
.Open varQuery
End With
'Set NumShowingLabel
If varRecordset.RecordCount > varMaxResults Then
NumShowingLabel = "Showing 60 of " & varRecordset.RecordCount & " Results"
Else
NumShowingLabel = "Showing " & varRecordset.RecordCount & " of " & varRecordset.RecordCount & " Results"
End If
'As long as there is a record, move to the first one
If Not varRecordset.RecordCount = 0 Then varRecordset.MoveFirst
'Add each record to ResultBox
If varRecordset.RecordCount > varMaxResults Then
For varTempInt = 1 To varMaxResults
ResultBox.AddItem varRecordset.Fields("FileName").Value
varRecordset.MoveNext
Next
Else
For varTempInt = 1 To varRecordset.RecordCount
ResultBox.AddItem varRecordset.Fields("FileName").Value
varRecordset.MoveNext
Next
End If
'Release varRecordSet
varRecordset.Close
noSearch:
End Sub
Run Code Online (Sandbox Code Playgroud)
当运行时,Excel返回错误“类型不匹配”和亮点.RecordCount的For varTempInt = 1 To varRecordset.RecordCount(最后一个for循环的样品中)。我已安装Windows支持文章983246建议的修补程序,至少据我所知。我将其安装到C:目录并重新启动了计算机,但仍然无法正常工作。
编辑1:只是想澄清一下,我以前使用的是ADO 2.5 NOT ADO 6.1
TL; DR:如何RecordSet.RecordCount在运行Excel 2010的64位计算机上修复“类型不匹配”错误?
此问题实际上是由早期Excel中的错误引起的。那里有一个修复程序。HotFix
我在office 16上开发了一些宏,但是当我在以前的版本上执行UAT时,它失败了,对此的快速简便解决方案只是强制转换RecordCount
rst = SomeRecordset
dim rstCount as Long
rstCount = CLng(rst.RecordCount)
Run Code Online (Sandbox Code Playgroud)
感谢你们的快速回复,但是,我不知何故设法得到了使用 ADO 6.1 而不是 ADO 2.5 的想法。看起来使用更新版本的 ActiveX 数据库对象就成功了,呵呵。
为了便于将来参考,如果您要升级到 ADO 6.0,则 ConnectionString 值将相同,User ID=<USR>; Password=<PSWD>除非您必须使用USR=<USR>;PWD=<PWD>
我没有遇到过这个确切的问题,但我发现recordcountADODB 记录集上的属性时好时坏。最好的选择是重写循环,如下所示:
recordset.movefirst
While Not recordset.eof
<your stuff with your record>
recordset.movenext
Loop
Run Code Online (Sandbox Code Playgroud)
另外,要测试记录集中是否有记录,您可以使用:
If recordset.BOF and recordset.EOF THEN
<Something is wrong there are no records>
End If
Run Code Online (Sandbox Code Playgroud)
我的猜测是,ADODB recordcount 属性对于您正在使用的任何 ODBC 驱动程序的 64 位版本来说可能都是垃圾,因为它几乎在每个 ODBC 驱动程序中都是如此。