【问题标题】:Setting Unknown Array Boundaries and Loop设置未知数组边界和循环
【发布时间】:2018-07-28 14:24:32
【问题描述】:

我遇到了数组边界问题。我有 3 个工作表。前 2 个将我转换为两个数组(array1 和 array2),然后在它们之间进行计算以创建第三个。问题是我不确定第三个数组的边界是什么,因为它总是会根据输入而变化。

我一直在使用 Dim array3 (5000, 5) 和 5000 行(第一维)的虚拟对象,因为我认为不会有更多。有没有办法创建没有边界的数组,然后向其中添加信息,然后调暗尺寸?

我创建的宏也使用了这段代码---

     Z = 1
     For x = 1 To UBound(array1, 1)

     For y = 1 To UBound(array2, 1)

      If array1(x, 4) = 0 Then
        GoTo Line1
        End If

        If array1(x, 1) = array2(y, 1) And array1(x, 2) = array2(y, 3)Then

            If array1(x, 4) > array2(y, 5) Then

                array3(z, 1) = array1(x, 3)

            ElseIf array1(x, 4) = array2(y, 5) Or array1(x, 4) < array2(y, 5) Then

                array3(z, 1) = array1(x, 3)

            End If

        z = z + 1

     End If

    Next y

Line1:
Next x

它需要一段array1并通过array2循环它并在array3中创建一个结果

基本上当 array1(x, 4) = 0 时,我需要它移动到下一个 X。如果没有 GoTO Line1,我无法弄清楚如何循环它。如果我将它向下移动,那么它将继续循环通过 arry2 (y),而不是继续移动到下一个 X。如果我将它移动到上面,那么 y 将重置并再次通过 For y 循环

【问题讨论】:

    标签: arrays vba loops


    【解决方案1】:

    你可以这样做:

    • 将 array3 调暗到理论上的最大行数
    • 来回调换 array3 并将其行号重新调整到实际填充的行数

    喜欢这个(注释)代码:

        Dim x As Long, y As Long, z As Long
        Dim array1 As Variant, array2 As Variant
    
        array1 = ... ' your way of filling array1
        array2 = ... ' your way of filling array2
    
        ReDim array3(LBound(array1, 1) To UBound(array1, 1) * UBound(array2, 1), LBound(array1, 1) To LBound(array1, 2) ' dim Array 3 to the theoretically maximum number of rows and to the wanted columns number (here, the same as array1 columns
    
        z = LBound(array3, 1) - 1 'start from array3 rows number lower bound minus one to update at every matching criteria
        For x = LBound(array1, 1) To UBound(array1, 1)
    
            For y = LBound(array2, 1) To UBound(array2, 1)
                If array1(x, 4) <> 0 Then
                    If array1(x, 1) = array2(y, 1) And array1(x, 2) = array2(y, 3) Then
                        z = z + 1
                        If array1(x, 4) > array2(y, 5) Then
                            array3(z, 1) = array1(x, 3)
                        Else
                            array3(z, 1) = array2(x, 3) ' see my guess here instead of your original code
                        End If
                    End If
                End If
            Next
        Next
    
        If z >= 0 Then
            array3 = Application.Transpose(array3) 'transpose array3
            ReDim Preserve array3(LBound(array1, 1) To LBound(array1, 1) + 1, LBound(array1, 1) To z) 'redim its columns to their actually filled number, while preserving values
            array3 = Application.Transpose(array3) 'trasnpose back your array3
        End If
    

    【讨论】:

      【解决方案2】:

      是的,你可以!有多种方法可以做到这一点!

      您可以轻松地只 Redim PReserve 阵列。试试看:

      What does ReDim Preserve do?

      https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/redim-statement

      请记住,您只能使用此方法重新调整数组的最后一个维度。如果你需要改变其他人,你需要学习如何改变你的阵列来做到这一点。这是另一个很棒的链接

      ReDim Preserve to a Multi-Dimensional Array in Visual Basic 6

      您还可以在处理前获取前两张纸的行数和列数。这样您以后就可以使用这些信息。

      试试这个:

       THisworkbook.sheets("sheet1").USedRange.rows.count
       THisworkbook.sheets("sheet1").USedRange.columns.count
      

      【讨论】:

        猜你喜欢
        • 2018-02-05
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多