【问题标题】:Looping through arrays in VBA在 VBA 中循环遍历数组
【发布时间】:2016-03-29 01:13:41
【问题描述】:

我正在尝试遍历我拥有的数组,首先我从电子表格数据创建数组,该数据从第 2 行第 2 列开始(大约 1000 行 x 100 列)。定义我的数组后,我想将每一列视为一个单独的数据集,找到最大值和最大值的行号,然后将每个列存储在单独的数组中。当我运行此代码时,它返回一列 0 值。它没有给出任何错误,但显然不起作用,有什么建议吗?

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

【问题讨论】:

  • 我正在写一个答案,但蒂姆打败了我。您将获得从零开始的最大值数组的第一个元素,因为您仅开始在索引 1 处提供值;数据集的边界。此外,ReDim dataset(2 To rows, 2 To columns) 什么也不做,因为在下一行中,您将值(默认情况下)分配给数据集。
  • 是的。也打败我 - 我也会考虑 ReDim Maxindex(1 To columns)ReDim MaxVal(1 To columns) 而不是固定值。
  • @Jeeped 所以我不需要在赋值之前指定数组大小?
  • 不,当您从单元格中分配值时,您正在将其重新调整为二维数组。关于一维数组:您可以使用redim Maxindex(LBound(dataset, 2) To UBound(dataset, 2)),然后您不必调整i 以将其用作maxindex 的索引。例如Maxindex(i) = j 而不是 Maxindex(i - 1) = j;你可以使用redim Maxindex(LBound(dataset, 2) To UBound(dataset, 2), 1 to 1),然后你就不必转置它了。
  • @jeeped Waht 在“redim Maxindex(LBound(dataset, 2) To UBound(dataset, 2), 1 to 1)”中的“1 to 1”做什么?

标签: arrays vba excel loops max


【解决方案1】:

默认情况下,Excel 希望将一维数组放在工作表的 中,而不是在列中,因此当您尝试将它在一个列中。

所有值都为零,因为您的一维数组是从零开始的,并且您没有在循环中填充该槽。

您可以使用转置将您的数组“翻转”成一列:

Sheet2.Range(Sheet2.Cells(1, 1), Sheet2.Cells(columns, 1)) = _
     Application.Transpose(Maxindex)

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多