Excel VBA:来自太多未被破坏的对象的溢出错误?

在大数据集上执行优化任务时,我会不时收到溢出运行时错误6(通常在1小时或2小时后)。 当我从macros停止的位置重新启动我的macros时,错误消失,即从发生错误的地方再次启动macros。 溢出错误是否与创build太多使用后不能正确销毁的对象有关?

下面是我的容器类的一个(简化版本),它被销毁(通过Set … = Nothing)和重build(通过Set … = New)成千上万次。

'CG_data_point custom collection class Public data_points As Collection Private Sub Class_Initialize() Set data_points = New Collection End Sub Public Sub AddDataPoint(mydate as date, price as double) Dim new_data_point As CG_data_point Set new_data_point = New CG_data_point new_data_point.EnterData mydate, price data_points.Add new_data_point Set new_data_point = Nothing 'I assume this one could also be skipped End Sub Public Sub RMSE(X as double) as double ... End Sub Private Sub Class_Terminate() Dim data_point As CG_data_point For Each data_point In data_points 'destruct each data point individually Set data_point = Nothing Next data_point Set data_points = Nothing End Sub 'Main module dim global_container as CG_data_container sub do_optimizations() Do set global_container= new CG_data_container .... do something with the data, have in call to global function RMSE_UDF as a cell formula for Solver set global_container= nothing While (...) end sub 'worksheet function function RMSE_UDF(X as double) global_container.RMSE(X) end function 

容器variablesglobal_container必须是全局的,因为它必须可以从工作表UDF(RMSE_UDF)中调用; 一个工作表公式不能有一个对象作为参数,据我所知,就像“= RMSE(MyContainer,…)”。 使用Excel Solver进行均方根误差(RMSE)的最小化。

我不认为这一定是你错误的原因,但无论如何这是值得修复的。

比较和对比你的代码的这两个部分:

AddDataPoint

 data_points.Add new_data_point Set new_data_point = Nothing 

这里我们将一个由临时variablesnew_data_point引用的对象添加到集合中。 然后,我们将new_data_point设置为Nothing来删除对它所引用的对象的引用。 显然这个集合仍然会有这个对象的引用

Class_Terminate

 For Each data_point In data_points 'destruct each data point individually Set data_point = Nothing Next data_point 

这里我们将每个项目从集合中依次读取到一个名为data_point的临时variables中。 然后,我们将data_point设置为Nothing来删除对它所引用的对象的引用。 (也许不太明显),集合仍然会有这个对象的引用。

要从集合中删除每个对象,请尝试重复删除集合中的第一个对象,直到集合为空:

 Do Until (data_points.Count < 1) data_points.Remove 1 Loop 

在这种情况下,当您尝试进行超出分配目标限制的分配时,会产生溢出 。 你的数据集是否有超过date的限制或可能是双重的? 这些是我看到的两种types,也许在某个地方有一个不匹配的地方,一个大的双重作为一个date传入。 你可以用一个子程序检查这种东西,例如,在试图写入集合之前检查date的边界。

另一种可能性是集合本身的大小,因为它被索引了很长时间。 这是一个相当大的数字,但你将不得不超过2,147,483,647条logging。