我们有一个Exccel电子表格,用于管理非工作时间支持工程师的rota。前段时间,我添加了一些VBA代码,可以在几小时内自动将支持电话号码转移到工程师的手机上。
它通过连接到电话提供商运行的数据库并更新转移号码来完成此操作。
今天下午,它突然无法在中央服务器上运行:
Dim Db As ADODB.Connection
Sub ConnectDatabase()
Set Db = New ADODB.Connection
Db.Open "SupportMobileDb"
End Sub
代码在New ADODB.Connection
行停止,并报告:
Run-time error '430':
Class does not support Automation or does not support expected
interface
我仍然可以在笔记本电脑上运行宏,并且它可以正常工作。在中央服务器上,我仍然可以使用Excel,并正确连接到数据源。它只是无法在此服务器上通过VBA工作。
宏在上午9点正确运行并将所有电话转移到办公室,但下午5点转移到员工宏不起作用。我无法看到Windows今天更新,或者根本没有任何其他更改。
之前有没有人见过这个问题?
答案 0 :(得分:16)
确定发现了问题。看起来在某些时候,VBA内容的一个外部引用是未被攻击的(ADO 2.8 Recordset)。我已经添加了参考资料,现在似乎工作正常。
由于我已经以某种方式得到了3个赞成回答我自己的问题(!),我最好再提一些细节以防其他人看到这个问题:
在Visual Basic编辑器中,在工具 - >下;参考文献,我选择了Microsoft ActiveX Data Objects 2.8 Library
。但Microsoft ActiveX Data Objects Recordset 2.8 Library
未被选中。有趣的是,在Windows 7下查看它时,这个库甚至不会作为一个选项出现,但是如果没有它,宏就可以工作。
还有一点需要注意,因为显然很多人都有这个问题...我上面的答案确实解决了问题,但只有在某些人再次编辑文件之后,他们的Office版本才会自动重新创建问题,我不得不再次解决它。
有两个长期解决方案:
1)您可以使用后期绑定,并完全删除引用的库。有关详细信息,请参阅http://support.microsoft.com/kb/245115。
2)为了我的目的,我将宏完全移动到另一个工作簿 - 这些宏应该只从中央服务器运行(只是查看名册的人不会设置ODBC数据源,所以宏赢了无论如何都要跑。所以现在宏的工作簿中的VBA的第一步是打开实际的名册工作簿,然后它将保持其余的VBA代码不变。
答案 1 :(得分:3)
我做了很多VBA工作,并且最近遇到了很多这样的事情。我会写一个程序,它会运行很长时间(在某些情况下年),然后有一天一些计算机开始出现此错误。
开发人员最明显的事情之一是ADODB.Connection和/或ADODB.Recordset会自行停止自我操作。 ADODB是小写的,或者第二部分是。但有时候,这种毛利化很好,但仍然会发生。
将连接和/或记录集对象的创建与“设置新”部分代码更改分开,每次都为我修复。
具体来说,以下代码调整总是为我解决这个问题:
从以下位置更改任何连接对象的创建:
Dim con as New ADODB.Connection
要:
Dim con as ADODB.Connection
Set con = New ADODB.Connection
同样,从:
更改任何记录集对象的创建Dim rs as New ADODB.Recordset
要:
Dim rs as ADODB.Recordset
Set rs = New ADODB.Recordset
答案 2 :(得分:2)
我有一个类似的问题,我的VBA代码在我的本地计算机上运行良好(Windows 7),但是从Citrix服务器(Windows 2003 Server)运行它没有并且在尝试运行时错误430时失败了建立连接(Set Conn = New ADODB.Connection)。
在阅读这些回复之前,我没有想到Windows版本的差异,所以当我取消选中“Microsoft ActiveX Data Objects 2.8 Library”和选中时“Microsoft ActiveX Data Objects 2.7 Library“,一切正常。
只是想传递这个并说声谢谢你们这些帖子让我朝着正确的方向前进。