2017-06-26 80 views
1

在Excel表格中,我有一组150,000行的31列数值数据。一列对应于模拟5000次的30个变量。更确切地说,前30行对应于第一次模拟,等等。 我想计算每个变量的中位数,这意味着要计算30 * 31个中位数。我写了这个代码:为什么这个VBA代码无限循环?

Function median_simulation() 
Dim feuille_statistiques As Worksheet, feuil1 As Worksheet 
Dim term As Integer 

Set feuil1 = Worksheets("Feuil1") 
Set feuille_statistiques = Worksheets("Statistiques") 


For i = 102 To 131 
    For j = 2 To 32 

     Dim rng2 As Range 
     term = feuille_statistiques.Cells(i, 1).Value 
     Set rng2 = feuil1.Range(feuil1.Cells(1 + term, (j + 5)), feuil1.Cells(1 + term, (j + 5))) 

     For k = 1 To 4999 
      Set rng2 = Union(rng2, feuil1.Cells(30 * k + 1 + term, (j + 5))) 
     Next k 

     feuille_statistiques.Cells(i, j).Value = WorksheetFunction.median(rng2) 

    Next j 
Next i 

End Function 

我不知道为什么,但试图运行该代码将导致一个永无止境的计算。不过,我相信代码正在工作,因为它冻结我和j时(我试着用j = 2和i = 102),这是否存在一些内存问题?我的代码是不是最优的,有没有办法改进它?

+1

这不会导致无限循环,但你不应该被一遍又一遍的调光RNG2内循环。在循环外部声明它并在循环内重复设置它。 – Jeeped

+0

@Jeeped谢谢我要试试这个。 – Gannicus

+2

'median'将工作于一个数组,所以使用一个数组而不是实际的范围对象。'Dim a()As Variant:a = Array(1,5,10,11,12,13,300,7000): Debug.Print Application.WorksheetFunction.Median(a)' –

回答

0

median将工作的数组,所以使用数组而不是实际的范围对象。

Dim a() As Variant 
a = Array(1, 5, 10, 11, 12, 13, 500, 7000) 
Debug.Print Application.WorksheetFunction.Median(a) 

例如