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
4

1 回答 1

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)

因为您不能将 Double 值放入字符串变量中。

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

此修订版在我的计算机上执行时没有错误,并包含对Temp2andTemp3的数据类型的更改:

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
于 2013-05-06T11:33:11.907 回答