Arrays VBA中的数组循环
我试图循环使用我拥有的一个数组,首先我从第2行第2列(大约1000行x 100列)开始的电子表格数据创建数组。定义数组后,我希望将每一列视为一个单独的数据集,找到最大值和最大值的行号,然后将每一列存储在单独的数组中。当我运行此代码时,它返回一列0值。它没有给出任何错误,但显然不起作用,有什么建议吗Arrays VBA中的数组循环,arrays,vba,excel,loops,max,Arrays,Vba,Excel,Loops,Max,我试图循环使用我拥有的一个数组,首先我从第2行第2列(大约1000行x 100列)开始的电子表格数据创建数组。定义数组后,我希望将每一列视为一个单独的数据集,找到最大值和最大值的行号,然后将每一列存储在单独的数组中。当我运行此代码时,它返回一列0值。它没有给出任何错误,但显然不起作用,有什么建议吗 Public Maxindex() As Long Public MaxVal() As Double Sub ArrayOptimized() 'Uses arrays to call data
Public Maxindex() As Long
Public MaxVal() As Double
Sub ArrayOptimized()
'Uses arrays to call data from the sheet once then process it
Dim dataset() As Variant
Dim rows As Long
Dim columns As Integer
ReDim Maxindex(100)
ReDim MaxVal(100)
MaxVal(1) = 1
rows = ShData.Cells(ShData.rows.Count, 1).End(xlUp).Row
columns = ShData.Cells(1, ShData.columns.Count).End(xlToLeft).Column
ReDim dataset(2 To rows, 2 To columns)
dataset = ShData.Range(ShData.Cells(2, 2), ShData.Cells(rows, columns))
'Check to sheet
Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(rows, columns)) = dataset
For i = LBound(dataset, 2) To UBound(dataset, 2)
For j = LBound(dataset, 1) To UBound(dataset, 1)
If dataset(j, i) > MaxVal(i) Then
MaxVal(i) = dataset(j, i)
'Returns row index number in array for max val
Maxindex(i) = j
End If
Next j
Next i
Sheet2.Range(Sheet2.Cells(1, 1), Sheet2.Cells(columns, 1)) = Maxindex
End Sub
默认情况下,Excel希望将一维数组放置在工作表上的行中,而不是列中,因此当您尝试将数组的第一个元素放置在列中时,可以在每个单元格中获得该数组的第一个元素 所有值都是零,因为您的一维数组是基于零的,并且您没有在循环中填充该插槽 可以使用转置将数组“翻转”为列:
Sheet2.Range(Sheet2.Cells(1, 1), Sheet2.Cells(columns, 1)) = _
Application.Transpose(Maxindex)
默认情况下,Excel希望将一维数组放置在工作表上的行中,而不是列中,因此当您尝试将数组的第一个元素放置在列中时,可以在每个单元格中获得该数组的第一个元素 所有值都是零,因为您的一维数组是基于零的,并且您没有在循环中填充该插槽 可以使用转置将数组“翻转”为列:
Sheet2.Range(Sheet2.Cells(1, 1), Sheet2.Cells(columns, 1)) = _
Application.Transpose(Maxindex)
我正在写答案,但蒂姆抢先给了我。您将获得最大值的零基数组的第一个元素,因为您只开始在索引1处提供值;数据集的lbound。此外,
ReDim数据集(2对行,2对列)
没有任何作用,因为在下一行中,您将值(默认情况下)指定给dataset.Yep。把它也打给我——我会考虑<代码> ReDim Maxindex(1到列)和<代码> ReDim MaxVal(1到列)< /C>,而不是固定值。@ JeppEd,所以在分配值之前,我不需要对数组大小进行区分。不,当你从单元格中分配值时,你就把它重新排列成二维数组。关于一维数组:您可以使用redimmaxindex(LBound(dataset,2)到UBound(dataset,2))
,这样您就不必调整i
将其用作Maxindex的索引。e、 g.Maxindex(i)=j
而不是Maxindex(i-1)=j
;您可以使用redim-Maxindex(LBound(dataset,2)到UBound(dataset,2),1到1)
这样您就不必转置它了。@jeeped在“redim-Maxindex(LBound(dataset,2)到UBound(dataset,2),1到1”中“1到1”是怎么做的?我正在写答案,但蒂姆抢先给了我。您将获得最大值的零基数组的第一个元素,因为您只开始在索引1处提供值;数据集的lbound。此外,ReDim数据集(2对行,2对列)
没有任何作用,因为在下一行中,您将值(默认情况下)指定给dataset.Yep。把它也打给我——我会考虑<代码> ReDim Maxindex(1到列)和<代码> ReDim MaxVal(1到列)< /C>,而不是固定值。@ JeppEd,所以在分配值之前,我不需要对数组大小进行区分。不,当你从单元格中分配值时,你就把它重新排列成二维数组。关于一维数组:您可以使用redimmaxindex(LBound(dataset,2)到UBound(dataset,2))
,这样您就不必调整i
将其用作Maxindex的索引。e、 g.Maxindex(i)=j
而不是Maxindex(i-1)=j
;您可以使用redim-Maxindex(LBound(dataset,2)到UBound(dataset,2),1到1)
这样您就不必转置它了。@jeeped“redim-Maxindex(LBound(dataset,2)到UBound(dataset,2),1到1”中的“1到1”是什么意思?