Vba 排序数组或集合

Vba 排序数组或集合,vba,excel,Vba,Excel,我在Excel 2010中有以下代码作为子代码: i = 2 For j = 1 To num_scenarios Dim probdiff As Double Dim OCS_Spend As Double n = 0 For k = 1 To num_yrs ' These are the calculations and potentially not relevant to my question but here for context For Each cell I

我在Excel 2010中有以下代码作为子代码:

i = 2

For j = 1 To num_scenarios

Dim probdiff As Double
Dim OCS_Spend As Double
n = 0

For k = 1 To num_yrs


' These are the calculations and potentially not relevant to my question but here for context    
For Each cell In rng

x = Rnd()
'Debug.Print Format(x, "0.00000%")
If cell.Value >= x Then

'Populate the result sheet

Sheets("Event Occurs").Cells(i, 1) = mywksht.Cells(cell.Row, 1)
Sheets("Event Occurs").Cells(i, 2) = mywksht.Cells(cell.Row, 2)
Sheets("Event Occurs").Cells(i, 3) = mywksht.Cells(cell.Row, 3)
Sheets("Event Occurs").Cells(i, 4) = mywksht.Cells(cell.Row, 4)
Sheets("Event Occurs").Cells(i, 5) = mywksht.Cells(cell.Row, 5)
Sheets("Event Occurs").Cells(i, 6) = mywksht.Cells(cell.Row, 6)
Sheets("Event Occurs").Cells(i, 10) = "Event Occurs"
Sheets("Event Occurs").Cells(i, 11) = mywksht.Cells(cell.Row, 11)
Sheets("Event Occurs").Cells(i, 9) = x
Sheets("Event Occurs").Cells(i, 7) = k
Sheets("Event Occurs").Cells(i, 8) = j
Sheets("Event Occurs").Cells(i, 14) = (cell.Value - x) ^ (2)
event_max = Sheets("Event Occurs").Cells(i, 11)
probdiff = probdiff + (cell.Value - x) ^ (2)

If Round(cell / x, 0) >= event_max Then
    Sheets("Event Occurs").Cells(i, 12) = event_max
    Else
        Sheets("Event Occurs").Cells(i, 12) = Round(cell / x, 0)
End If
Duration = Sheets("Event Occurs").Cells(i, 4)
Num_Event = Sheets("Event Occurs").Cells(i, 12)
Spend = Sheets("Event Occurs").Cells(i, 5)
Sheets("Event Occurs").Cells(i, 13) = Num_Event * Spend / Duration
OCS_Spend = OCS_Spend + Num_Event * Spend / Duration

n = n + 1
i = i + 1

End If

Next cell

' End calculations

Next k

Debug.Print j, probdiff / n


probdiff = 0
OCS_Spend = 0
Next j
立即窗口的输出如下所示:

 J:               MSE:
 1             0.194236476623154 
 2             0.157939130921924 
 3             0.19825548826238 
 4             0.384990330451172 
 5             0.267128221022187 
第一列是j(外部for循环),表示一个场景。第二列是外j循环每次迭代生成的数据的均方误差。因此,1是循环第一次运行,2是第二次运行,以此类推。。MSE列中的数字越小,发生这种情况的可能性就越大

我希望人们能够限制他们看到的场景(j)的数量,仅在他们希望运行100个场景的情况下最有可能出现的场景。所以我需要一种方法来将上面的表格排序为这样的东西

j:                MSE        
2             0.157939130921924 
1             0.194236476623154 
3             0.19825548826238 
5             0.267128221022187
4             0.384990330451172 
如果有人只想看到排名前三的结果,那就是:

j:                MSE        
2             0.157939130921924 
1             0.194236476623154 
3             0.19825548826238 

因此,基本上,五种可能的情况中有三种最有可能。我尝试过集合和数组,但没有尝试过dicitonaries(我仍在学习如何使用它们,不确定它们是否存在于Excel VBA中)。

Chip Pearson提供了许多非常有用的函数,可以对数组、集合和字典进行排序,这些函数可在此处找到:

这里有太多的代码无法复制。当需要时,我通常会在VBProject中创建一个单独的模块,其中包含这些数组帮助器函数。我已经在PowerPoint中广泛使用了这些工具,它们在那种环境中工作,只需很少的修改。对于Excel,它们应该是开箱即用的

一旦您将数据放入数组(我在代码中没有看到任何数组,因此假设您有类似于
Dim MyArray As Variant
)的内容,并使用这些函数对其进行排序,您就可以这样做,将数组缩减为只包含第一个
x
结果:

'where "x" is a long/integer represents some user-input or _
  limit to the number of results:
ReDim Preserve MyArray(x - 1)
我会使用数组,而不是集合或字典

为什么不收集呢?收集很有用,可以在这里进行论证。但是,虽然我们可以在一个
ReDim Preserve
语句中“调整”数组大小,但您不能使用集合对象进行调整;相反,您必须使用迭代。虽然这并不是太复杂,但看起来确实有点笨重。(当然,您可以对性能进行一些测试,但除非您处理的是非常大的数据集,否则我不希望通过任何一种方式获得明显的收益)

为什么不使用字典?当字典的
.Keys
返回一个一维值数组时,为了避免迭代(如在集合对象中),您仍然需要将这些值传输到数组:

MyArray = dict.Keys()
ReDim Preserve MyArray(x-1)

此外,dictionary对象持有唯一的键值,因此如果您预期可能需要存储重复的值,则这些键值不适合使用

Chip Pearson提供了许多非常有用的函数,可以对数组、集合和字典进行排序,这些函数在此处提供:

这里有太多的代码无法复制。当需要时,我通常会在VBProject中创建一个单独的模块,其中包含这些数组帮助器函数。我已经在PowerPoint中广泛使用了这些工具,它们在那种环境中工作,只需很少的修改。对于Excel,它们应该是开箱即用的

一旦您将数据放入数组(我在代码中没有看到任何数组,因此假设您有类似于
Dim MyArray As Variant
)的内容,并使用这些函数对其进行排序,您就可以这样做,将数组缩减为只包含第一个
x
结果:

'where "x" is a long/integer represents some user-input or _
  limit to the number of results:
ReDim Preserve MyArray(x - 1)
我会使用数组,而不是集合或字典

为什么不收集呢?收集很有用,可以在这里进行论证。但是,虽然我们可以在一个
ReDim Preserve
语句中“调整”数组大小,但您不能使用集合对象进行调整;相反,您必须使用迭代。虽然这并不是太复杂,但看起来确实有点笨重。(当然,您可以对性能进行一些测试,但除非您处理的是非常大的数据集,否则我不希望通过任何一种方式获得明显的收益)

为什么不使用字典?当字典的
.Keys
返回一个一维值数组时,为了避免迭代(如在集合对象中),您仍然需要将这些值传输到数组:

MyArray = dict.Keys()
ReDim Preserve MyArray(x-1)

此外,dictionary对象持有唯一的键值,因此如果您预期可能需要存储重复的值,则这些键值不适合使用

Chip Pearson提供了许多非常有用的函数,可以对数组、集合和字典进行排序,这些函数在此处提供:

这里有太多的代码无法复制。当需要时,我通常会在VBProject中创建一个单独的模块,其中包含这些数组帮助器函数。我已经在PowerPoint中广泛使用了这些工具,它们在那种环境中工作,只需很少的修改。对于Excel,它们应该是开箱即用的

一旦您将数据放入数组(我在代码中没有看到任何数组,因此假设您有类似于
Dim MyArray As Variant
)的内容,并使用这些函数对其进行排序,您就可以这样做,将数组缩减为只包含第一个
x
结果:

'where "x" is a long/integer represents some user-input or _
  limit to the number of results:
ReDim Preserve MyArray(x - 1)
我会使用数组,而不是集合或字典

为什么不收集呢?收集很有用,可以在这里进行论证。但是,虽然我们可以在一个
ReDim Preserve
语句中“调整”数组大小,但您不能使用集合对象进行调整;相反,您必须使用迭代。虽然这并不是太复杂,但看起来确实有点笨重。(当然,您可以对性能进行一些测试,但除非您处理的是非常大的数据集,否则我不希望通过任何一种方式获得明显的收益)

为什么不使用字典?而字典的
.Keys