2013-05-06 57 views
0

我正在处理下面的代码,它应该从电子表格中获取值到数组中,对它们进行排序(这里是一个三重排序 - 三个数组排序在一次),并最后把结果放在另一个表...数组的排序过程不起作用 - 类型不匹配

问题是我得到一个下标超出范围“的错误消息,我真的不知道如何解决它 我似乎有这个问题每个我试着对一个数组进行排序..所以必须有排序错误...(这里叫做TriFonds)

任何帮助将不胜感激..

Option Explicit 
Option Base 1 

Sub Class() 
Dim i As Integer, j As Integer, k As Integer 

Dim nb_Actions As Long 


With Worksheets("Actions") 
    nb_Actions = .Cells(1, Columns.Count).End(xlToLeft).Column 
End With 

ReDim NomAction(nb_Actions) As Double 
ReDim IndiceAction(nb_Actions) As Double 
ReDim Ratio(nb_Actions) As Double 

With Worksheets("Actions") 
'I fill in arrays with data from the column 
     For i = 1 To nb_Actions 
      Ratio(i) = .Cells(18 + i, 2).Value 
     Next i 


     For j = 1 To nb_Actions 
      IndiceAction(j) = .Cells(18 + j, 3).Value 
     Next j 


     For k = 1 To nb_Actions 
      NomAction(k) = .Cells(18 + k, 1).Value 
     Next k 
End With 

     Call TriFonds(Ratio(), NomAction(), IndiceAction()) 



With Worksheets("Performance") 
    For i = 1 To nb_Actions 
     .Cells(4 + i, 2) = IndiceAction(i) 
     .Cells(4 + i, 3) = NomAction(i) 
     .Cells(4 + i, 4) = Ratio(i) 
    Next i 
End With 
End Sub 

Sub TriFonds(Tab1() As Double, Tab2() As Double, Tab3() As Double) 
Dim Temp1 As Double 
Dim Temp2 As Double 
Dim Temp3 As Double 
Dim i As Long, j As Long 
Dim ligne_Fin As Long 

'Last line from the sorting procedure 
ligne_Fin = UBound(Tab1) 

For i = 2 To ligne_Fin 
    Temp1 = Tab1(i) 
    Temp2 = Tab2(i) 
    Temp3 = Tab3(i) 

    For j = i - 1 To 1 Step -1 'Increasing order 
     If (Tab1(j) <= Temp1) Then GoTo 10 
      Tab1(j + 1) = Tab1(j) 
      Tab2(j + 1) = Tab2(j) 
      Tab3(j + 1) = Tab3(j) 

    j = 0 


10 Tab1(j + 1) = Temp1 
    Tab2(j + 1) = Temp2 
    Tab3(j + 1) = Temp3 
Next j 
Next i 

End Sub 

回答

1

当您重新设置数组变量时,nb_Actions的值为零。所以,你已经声明了基数为零的数组变量,然后你去为它们赋值,从For i = 1 to ...开始,这将导致超范围类型错误。

移动这些行:

ReDim NomAction(nb_Actions) As Double 
ReDim IndiceAction(nb_Actions) As Double 
ReDim Ratio(nb_Actions) As Double 

之下这些行:

With Worksheets("Actions") 
    nb_Actions = .Cells(1, Columns.Count).End(xlToLeft).Column 
End With 

更新

下载文件后,我确定在TriFonds子程序不匹配声明。

您已声明Temp2 as Double,但您试图将字符串值从“Tab2()As String”)分配给此变量。这是造成不匹配:

Temp2 = Tab2(i)

,因为你不能在一个字符串变量放一个双精度值。

更新2您已经提取Temp3 as Double但您传递的是Integer数据类型。在我的电脑上(Win 7 XP/Excel 2010),这不会导致错误,因为Integer可以传递给Double变量。我怀疑在Mac的Excel中存在一个不允许这种行为的怪癖。

该版本没有错误执行我的电脑上,并结合变化的Temp2数据类型和Temp3

Option Explicit 
Option Base 1 

Sub Class() 
    Dim i As Integer, j As Integer, k As Integer 

    Dim nb_Actions As Long 

    With Worksheets("Actions") 
     nb_Actions = .Cells(1, Columns.Count).End(xlToLeft).Column 
    End With 

    ReDim NomAction(nb_Actions) As String 
    ReDim IndiceAction(nb_Actions) As Integer 
    ReDim Ratio(nb_Actions) As Double 

    With Worksheets("Actions") 
    'I fill in arrays with data from the column 
      For i = 1 To nb_Actions 
       Ratio(i) = .Cells(18 + i, 2) 
      Next i 


      For j = 1 To nb_Actions 
       IndiceAction(j) = .Cells(18 + j, 3) 
      Next j 


      For k = 1 To nb_Actions 
       NomAction(k) = .Cells(18 + k, 1) 
      Next k 
    End With 

      Call TriFonds(Ratio(), NomAction(), IndiceAction()) 

    With Worksheets("Performance") 
     For i = 1 To nb_Actions 
      .Cells(4 + i, 2) = IndiceAction(i) 
      .Cells(4 + i, 3) = NomAction(i) 
      .Cells(4 + i, 4) = Ratio(i) 
     Next i 
    End With 


End Sub 

Sub TriFonds(Tab1() As Double, Tab2() As String, Tab3() As Integer) 
    Dim Temp1 As Double 
    Dim Temp2 As String '## changed data type ## 
    Dim Temp3 As Integer '## changed data type ## 
    Dim i As Long, j As Long 
    Dim ligne_Fin As Long 

    'Last line from the sorting procedure 
    ligne_Fin = UBound(Tab1) 

    For i = 2 To ligne_Fin 
     Temp1 = Tab1(i) 
     Temp2 = Tab2(i) 
     Temp3 = Tab3(i) 

     For j = i - 1 To 1 Step -1 'Increasing order 
      If (Tab1(j) <= Temp1) Then GoTo 10 
       Tab1(j + 1) = Tab1(j) 
       Tab2(j + 1) = Tab2(j) 
       Tab3(j + 1) = Tab3(j) 

     j = 0 


10  Tab1(j + 1) = Temp1 
     Tab2(j + 1) = Temp2 
     Tab3(j + 1) = Temp3 
    Next j 
Next i 

End Sub 
+0

我更新的代码,但我仍然得到同样的错误:( – seigna 2013-05-06 11:38:02

+0

请注明线给你错误 – 2013-05-06 11:38:43

+0

我该怎么做? 顺便说一句,不会有任何错误,现在它只是返回零到处:( – seigna 2013-05-06 11:47:32