在VBA中使用Scripting.Dictionary迭代器会返回不正确的答案

我正在编写一些需要比较不同日子的测量结果的代码,测量的位置往往会在运行之间发生漂移。 我通过查看被测量的特定variables之一来调整它,将其在-100米到+100米的范围之间偏移,并查看后续读数之间的变化率(它们相距半米) ,平方差和看什么价值偏移最小化的平方和。

所以我有三种方法。 我可以在Excel中转​​储值,并使用偏移公式。 对于下面代码的例子,最小误差是当偏移量为259个读数时(29.5米为正值,假设200是使-100米达到无偏移量的量,并且每个读数是0.5米,所以59 * 0.5是29.5米)。 错误总和的值是2618.24690000001 – 这并不意味着太多,这只是现阶段的一个参考。

选项2是通过.GetRows方法将logging集结果传递给数组,并计算差异,而不使用Excel工作表和范围对象。 我得到了相同的答案 – 相当于259个读数,完全相同的错误总和,直到第15个数字。

选项3是将两个logging集的结果放在一个scripting.dictionary实例中,并使用这些实例计算错误。 在那里,我获得了59个读数的偏移,但是完全相同的误差数字的总和,再次是15个数字。 我已经testing了几个不同的地方,似乎总是有200个读数。

我已经通过代码,我已经search了这个网站,我甚至去看看从非StackOverflow网站(yuck!)的任何谷歌结果,我完全损失。 我敢肯定,这是我做过的非常简单(而且很可能非常愚蠢)的事情,而当我指出这一点时,我会很尴尬,但是我不能为了我的生活而努力。

arrays码:

Private Sub array_manipulation(track_section As c_track_section) Dim ss_variance As Double, offset_variance As Double Dim ss_offset As Integer, i As Integer Dim record_count As Long Dim ref_array As Variant, run_array As Variant record_count = Application.WorksheetFunction.Min(track_section.rs.RecordCount, track_section.align_rs.RecordCount - 400) - 1 ref_array = track_section.rs.GetRows(-1, 0) run_array = track_section.align_rs.GetRows(-1, 0) ss_variance = return_squared_errors(ref_array, run_array, 0, record_count) ss_offset = 0 For i = 1 To 400 offset_variance = return_squared_errors(ref_array, run_array, i, record_count) If offset_variance < ss_variance Then ss_variance = offset_variance ss_offset = i End If Next i MsgBox "ss_error is " & ss_variance & " at an offset of " & ss_offset & " intervals", vbOKOnly, "Did it work?" End Sub 

和return_squared_errors函数:

 Private Function return_squared_errors(ref_array As Variant, run_array As Variant, offset As Integer, record_count As Long) Dim i As Long Dim ss_variance As Double ss_variance = 0 For i = 1 To record_count ss_variance = ss_variance + ((ref_array(1, i) - ref_array(1, i - 1)) - _ (run_array(1, i + offset) - run_array(1, i + offset - 1))) ^ 2 Next i return_squared_errors = ss_variance End Function 

字典代码:

 Private Sub dict_manipulation(track_section As c_track_section) Dim ss_variance As Double, offset_variance As Double Dim ref_dict As Object, run_dict As Object Dim ss_offset As Integer, i As Integer Set ref_dict = CreateObject("Scripting.Dictionary") Set run_dict = CreateObject("Scripting.Dictionary") Call populate_dictionary(track_section.rs, ref_dict) Call populate_dictionary(track_section.align_rs, run_dict) ss_variance = return_dict_ss(ref_dict, run_dict, 0) ss_offset = 0 For i = 1 To 400 offset_variance = return_dict_ss(ref_dict, run_dict, i) If offset_variance < ss_variance Then ss_variance = offset_variance ss_offset = i End If Next i MsgBox "ss_error is " & ss_variance & " at an offset of " & ss_offset & " intervals", vbOKOnly, "Did it work?" End Sub 

和return_dict_ss函数:

 Private Function return_dict_ss(ref_dict As Object, run_dict As Object, offset As Integer) As Double Dim key As Variant Dim ss_variance As Double, reading_interval As Double, offset_distance As Double Dim current_key As String reading_interval = 0.0005 offset_distance = offset * reading_interval ss_variance = 0 For Each key In ref_dict.keys If ref_dict.exists(CStr(CDbl(key) - reading_interval)) And _ run_dict.exists(CStr(CDbl(key) + offset_distance)) And _ run_dict.exists(CStr(CDbl(key) - reading_interval + offset_distance)) Then ss_variance = ss_variance + ((ref_dict(key) - ref_dict(CStr(CDbl(key) - reading_interval))) - _ (run_dict(CStr(CDbl(key) + offset_distance)) - run_dict(CStr(CDbl(key) - reading_interval + offset_distance)))) ^ 2 End If Next key return_dict_ss = ss_variance End Function 

编辑:我可能应该注意到,c_track_section对象的track_section是一个用户定义的类。 它没有函数或方法,它只是包含许多setter / getter对,以避免在调用subs或函数时必须传递大量参数。