Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 数组的排序过程不';t工作类型不匹配_Vba_Sorting_Excel - Fatal编程技术网

Vba 数组的排序过程不';t工作类型不匹配

Vba 数组的排序过程不';t工作类型不匹配,vba,sorting,excel,Vba,Sorting,Excel,我正在编写以下代码,它应该将电子表格中的值放入数组,对它们进行排序(这里是三重排序-三个数组同时排序),最后将结果放入另一张表中 问题是我收到了一条“下标超出范围”的错误消息,我真的不知道如何修复它 每次尝试对数组排序时,我似乎都会遇到这个问题。所以排序肯定有问题…(这里称为TriFonds) 任何帮助都将不胜感激 Option Explicit Option Base 1 Sub Class() Dim i As Integer, j As Integer, k As Integer Di

我正在编写以下代码,它应该将电子表格中的值放入数组,对它们进行排序(这里是三重排序-三个数组同时排序),最后将结果放入另一张表中

问题是我收到了一条“下标超出范围”的错误消息,我真的不知道如何修复它 每次尝试对数组排序时,我似乎都会遇到这个问题。所以排序肯定有问题…(这里称为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
子类()
尺寸i为整数,j为整数,k为整数
将nb_动作视为长动作
使用工作表(“操作”)
nb_Actions=.Cells(1,Columns.Count).End(xlToLeft).Column
以
将无动作(nb_动作)重定为双动作
重拨指示(nb_动作)为双
重拨比率(nb_动作)为双倍
使用工作表(“操作”)
'我用列中的数据填充数组
对于i=1至nb_动作
比值(i)=.单元(18+i,2).值
接下来我
对于j=1到nb_动作
指示(j)=.单元格(18+j,3).值
下一个j
对于k=1到nb_动作
NoAction(k)=.单元格(18+k,1).值
下一个k
以
调用TriFonds(比率(),无动作(),指示()
带工作表(“绩效”)
对于i=1至nb_动作
.单元(4+i,2)=指示(i)
.单元(4+i,3)=无动作(i)
.单元(4+i,4)=比率(i)
接下来我
以
端接头
子三角(Tab1()为双精度,Tab2()为双精度,Tab3()为双精度)
将Temp1设置为双精度
将Temp2设置为双精度
将Temp3设置为双精度
我和我一样长,我和我一样长
变暗的鱼鳍和鱼鳍一样长
'排序过程的最后一行
ligne_Fin=UBound(表1)
对于i=2,对齐散热片
Temp1=表1(i)
Temp2=表2(i)
Temp3=表3(i)
对于j=i-1至1,步骤-1'递增顺序

如果(Tab1(j)当您重新确定数组变量的尺寸时,
nb_Actions
的值为零。因此,您已经声明了以零为基数的数组变量,然后您将从i=1到…
开始为它们赋值,这将导致超出范围类型的错误

移动这些行:

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
在这些线下:

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声明为Double
,但正在尝试将字符串值从'Tab2()作为字符串)分配给此变量。这导致不匹配:

Temp2=Tab2(i)

因为不能在字符串变量中放入双精度值

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

此修订版在我的计算机上执行时不会出错,并包含对
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
选项显式
选项基数1
子类()
尺寸i为整数,j为整数,k为整数
将nb_动作视为长动作
使用工作表(“操作”)
nb_Actions=.Cells(1,Columns.Count).End(xlToLeft).Column
以
作为字符串的ReDim NOACTION(nb_操作)
ReDim指示(nb_动作)为整数
重拨比率(nb_动作)为双倍
使用工作表(“操作”)
'我用列中的数据填充数组
对于i=1至nb_动作
比率(i)=.个单元(18+i,2)
接下来我
对于j=1到nb_动作
指示(j)=.单元格(18+j,3)
下一个j
对于k=1到nb_动作
无作用(k)=.个细胞(18+k,1)
下一个k
以
调用TriFonds(比率(),无动作(),指示()
带工作表(“绩效”)
对于i=1至nb_动作
.单元(4+i,2)=指示(i)
.单元(4+i,3)=无动作(i)
.单元(4+i,4)=比率(i)
接下来我
以
端接头
子TriFonds(Tab1()为双精度,Tab2()为字符串,Tab3()为整数)
将Temp1设置为双精度
Dim Temp2作为字符串“##更改了数据类型##
Dim Temp3作为整数“##已更改数据类型##
我和我一样长,我和我一样长
变暗的鱼鳍和鱼鳍一样长
'排序过程的最后一行
ligne_Fin=UBound(表1)
对于i=2,对齐散热片
Temp1=表1(i)
Temp2=表2(i)
Temp3=表3(i)
对于j=i-1至1,步骤-1'递增顺序

If(Tab1(j)我该怎么做?顺便说一句,不再有任何错误。现在它只是到处返回零:(我不明白。你是否仍然得到错误,正如你在18分钟前指出的那样?如果没有错误消息被提出,那么就没有错误和不希望的结果(例如,到处都是零)将要求您调试和修改逻辑。您必须告诉我是哪一行引发了错误。当您收到错误消息时,请选择要调试的选项。哪一行高亮显示???这些行:带有工作表(“操作”)nb_操作=.Cells(1,Columns.Count)。End(xlToLeft)。Column End With ReDim noAction(nb_操作)作为双ReDim指示(nb_操作)作为双ReDim比率(nb_操作)作为带工作表的双(nb_操作)(“操作”)“我用I=1到nb_操作比率(I)=的列中的数据填充数组。单元格(18+I,2).Value Next i您将
Temp2
声明为Double,但将数组变量
Tab2()作为字符串传递
。这会导致不匹配。请将声明更改为
Dim Temp2 as String