【问题标题】:Dynamic upper bound for two-dimensional array二维数组的动态上限
【发布时间】:2019-05-07 10:38:27
【问题描述】:

我正在确定具有 92 行和不同列范围(1-64 列)的矩阵的值。根据行号,我的代码应该定义该行列数的上限。我正在使用嵌套循环,但我的代码给了我一个 92x64 的矩阵(所以列数是恒定的)。

Dim m As Integer
Dim n As Integer
Dim o As Integer
Dim p As Integer
Dim q As Integer
Dim N_bay As Single
Dim N_b As Single
Dim D_r As Single
Dim s As Single
Dim Con_l As Single
Dim tau_s As Single
Dim N_r As Single

D_r = 394.9
s = 4.24
Con_l = 6.1
N_r = 92
N_b = 64

For n = LBound(N_rj, 1) To UBound(N_rj, 1)
    For m = LBound(N_rj, 2) To UBound(N_rj, 2)
        N_rj(n, 1) = n
        N_rj(n, 2) = (D_r - ((n - 1) * s))
        N_rj(n, 3) = WorksheetFunction.RoundDown(((D_r - ((n - 1) * s)) / Con_l), 0)
        N_rj(n, 4) = 1 / (N_rj(n, 3))
        size = N_rj(n, 3)
        ReDim N_bz(1 To 92, 1 To size)
            For o = 1 To UBound(N_bz, 1)
                For p = 1 To UBound(N_bz, 2)
                    N_bz(o, p) = p * Con_l
                    Cells(o + 1, p + 6).Value = N_bz(o, p)
                Next p
            Next o

        Cells(n + 1, m).Value = N_rj(n, m)
    Next m
Next n

我希望得到一个有 92 行的矩阵,其中每行有不同数量的列。因此,第 1 行有 64 列,第 2 行有 63 列,依此类推。

【问题讨论】:

  • 使用一维数组并将不同大小的数组分配给该数组的每个元素。
  • N_rj 是在哪里定义的?
  • 另外,您的 op 循环似乎一遍又一遍地覆盖相同的值而没有做任何事情。这是非常迭代的,并且回写到单元的次数必须永远花费。我建议您重新编写,以便每个n 循环只回写一次。 Next o 之后的一个为N_bzNext n 之后的一个为N_rj
  • Dim N_rj(1 To 92, 1 To 4) As Single Dim N_bz() As Single Dim size As Integer
  • 您能解释一下N_bz 是什么以及它的预期输出应该是什么?目前我怀疑您正在创建一个 2D 数组,然后尝试将其写回单行

标签: excel vba multidimensional-array dynamic


【解决方案1】:

我怀疑您正在尝试做的事情类似于以下内容

Sub MatrixArray()
    Dim m As Long, n As Long, o As Long, p As Long, q As Long
    Dim size As Long

    Dim N_bay As Single, N_b As Single, D_r As Single, s As Single, Con_l As Single
    Dim tau_s As Single, N_r As Single

    Dim N_rj(1 To 92, 1 To 4) As Single, N_bz() As Single

    Application.ScreenUpdating = False

    D_r = 394.9
    s = 4.24
    Con_l = 6.1
    N_r = 92
    N_b = 64

    For n = LBound(N_rj, 1) To UBound(N_rj, 1)
        For m = LBound(N_rj, 2) To UBound(N_rj, 2)
            N_rj(n, 1) = n
            N_rj(n, 2) = (D_r - ((n - 1) * s))
            N_rj(n, 3) = WorksheetFunction.RoundDown(((D_r - ((n - 1) * s)) / Con_l), 0)
            N_rj(n, 4) = 1 / (N_rj(n, 3))
            size = N_rj(n, 3)
            Debug.Print size

            ReDim N_bz(1 To 92, 1 To size)

            For o = 1 To UBound(N_bz, 1)
                For p = 1 To UBound(N_bz, 2)
                    N_bz(o, p) = p * Con_l
                Next p
            Next o

            Cells(n, 7).Resize(1, UBound(N_bz, 2)).Value2 = Application.Index(N_bz, n, 0)

        Next m
    Next n

    Cells(1, 1).Resize(UBound(N_rj, 1), UBound(N_rj, 2)) = N_rj

    Application.ScreenUpdating = True
End Sub

类似下面的方法可能更有效

Sub MatrixArray()
    Dim m As Long, n As Long, o As Long, p As Long, q As Long
    Dim size As Long

    Dim N_bay As Single, N_b As Single, D_r As Single, s As Single, Con_l As Single
    Dim tau_s As Single, N_r As Single

    Dim N_rj(1 To 92, 1 To 4) As Single, N_bz() As Single

    Application.ScreenUpdating = False

    D_r = 394.9
    s = 4.24
    Con_l = 6.1
    N_r = 92
    N_b = 64

    Dim MaxSize As Long
    MaxSize = WorksheetFunction.RoundDown(((D_r - ((LBound(N_rj, 1) - 1) * s)) / Con_l), 0)
    Debug.Print MaxSize
    ReDim N_bz(1 To MaxSize)

    For p = 1 To UBound(N_bz)
        N_bz(p) = p * Con_l
    Next p

    For n = LBound(N_rj, 1) To UBound(N_rj, 1)
        N_rj(n, 1) = n
        N_rj(n, 2) = (D_r - ((n - 1) * s))
        N_rj(n, 3) = WorksheetFunction.RoundDown(((D_r - ((n - 1) * s)) / Con_l), 0)
        N_rj(n, 4) = 1 / (N_rj(n, 3))
        size = N_rj(n, 3)

        Cells(n, 7).Resize(1, size).Value2 = N_bz
    Next n

    Cells(1, 1).Resize(UBound(N_rj, 1), UBound(N_rj, 2)) = N_rj

    Application.ScreenUpdating = True
End Sub

【讨论】:

  • 嗨,汤姆,它完全按照我的意愿工作。非常感谢您的帮助!
  • @user11464106 太好了 :) 请看看我对它的重写(刚刚再次更新),因为我已经做了一些改进。如果这解决了您的问题,请不要忘记通过单击答案旁边的复选框将其标记为已解决(并投票)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2017-07-06
  • 2014-06-03
  • 2016-08-07
  • 2018-09-03
  • 2011-01-11
相关资源
最近更新 更多