我有一个程序应该从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
运行时,Excel会返回错误"类型不匹配"并突出显示.RecordCount
的{{1}}(示例中的最后一个for循环)。我已经安装了Windows支持文章983246推荐的修补程序,至少在我理解的情况下。我将它安装到C:目录并重新启动我的机器,但它仍然无效。
编辑1:只是想澄清我之前使用的是ADO 2.5 NOT ADO 6.1
TL; DR:如何修复For varTempInt = 1 To varRecordset.RecordCount
"类型不匹配"运行Excel 2010的64位计算机上出错?
答案 0 :(得分:4)
此问题实际上是由早期excel中的错误引起的。那里有一个修补程序。 HotFix
我在办公室16上开发了一些宏,但是在以前的版本上做UAT时,它失败了,一个快速简单的解决办法就是抛出RecordCount
rst = SomeRecordset
dim rstCount as Long
rstCount = CLng(rst.RecordCount)
答案 1 :(得分:3)
感谢大家的快速回复,但是,我不知何故设法使用ADO 6.1代替ADO 2.5。看来,使用更新版本的ActiveX数据库对象可以解决这个问题。
为了将来参考,如果您要升级到ADO 6.0,ConnectionString值将是相同的除了您必须使用User ID=<USR>; Password=<PSWD>
而不是USR=<USR>;PWD=<PWD>
答案 2 :(得分:1)
我没有遇到这个问题,但我发现ADODB记录集上的recordcount
属性被命中或未命中。你最好的选择是重写循环,如:
recordset.movefirst
While Not recordset.eof
<your stuff with your record>
recordset.movenext
Loop
另外,要测试记录集中是否有记录,您可以使用:
If recordset.BOF and recordset.EOF THEN
<Something is wrong there are no records>
End If
我的猜测是,ADODB recordcount属性可能与您正在使用的任何ODBC驱动程序的64位版本相同,因为它几乎在每个ODBC驱动程序中都有。
答案 3 :(得分:0)
只需检查Excel的版本。 ADO在64位时运行良好32位和出牙问题。
答案 4 :(得分:0)
我从 只要 至 作为龙龙 然后我的VBA开始工作。无需修补程序...
答案 5 :(得分:0)
由于相同的比较类型,我们出现了此错误,并且使用了与dfresh22和Jonson Tsai相同的答案。谢谢大家!
对我们而言,唯一的不同是该错误发生在64位Office上,而我们在32位Office上仍然有多个用户,因此将其转换为较小的32位变量而不是转换为较大的64位变量更容易变量。由于我们与RecordCount进行比较的变量将始终小于100(并且始终始终小于32K),因此我能够在64位版本中将Long转换为Integer,而将32位代码从Integer转换为Integer:
IF intNumRecs> CInt(DBreports.RecordCount)然后...