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