【问题标题】:Transpose a multi dimensional array转置多维数组
【发布时间】:2018-12-17 11:54:32
【问题描述】:

我写了一些代码,应该用值填充一个多维数组。初始数组的大小为 1000x1000,但最后应将其调整为所需的(实际使用的)大小。为此,我使用代码:

ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To n)
Application.WorksheetFunction.Transpose (MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To m)
Application.WorksheetFunction.Transpose (MultiArrPaerchen)

发生的情况是数组的大小从 1000x1000 变为 1000x120(正确值)和 1000x18。因此,如果我正确地看到这一点,那么第一个转置不会做任何事情,因为数组的维度没有切换。 但是代码看起来对吧?

【问题讨论】:

    标签: excel vba multidimensional-array transpose


    【解决方案1】:

    我认为我可能在对上一个问题的评论中提供了错误信息。 Application.Transpose 像任何函数一样返回转置后的数组。它不像 ByRef 参数那样“就地”处理它。

    'NOT this was
    Application.WorksheetFunction.Transpose (MultiArrPaerchen)
    'Do it THIS WAY
    MultiArrPaerchen = Application.WorksheetFunction.Transpose(MultiArrPaerchen)
    

    FWIW,自动添加的空格应该被视为语法有问题的迹象。

    第一个ReDim调整第二个rank;当使用 ReDim 唱 Preserve 参数时,第二个等级是唯一可以调整的。

    第一个 Transpose 翻转第一和第二等级。现在您可以重新调整不是最后一个等级的原始第一等级。

    第二个 ReDim 调整最后一个排名(原来是第一个)。

    第二个 Transpose 采用翻转后的数组并将其返回到其原始方向,并在两个等级中使用新维度。

    Sub test()
    
        Dim MultiArrPaerchen As Variant, m As Long, n As Long
    
        m = 1000
        n = 1000
    
        ReDim MultiArrPaerchen(1 To m, 1 To n)
        Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                    LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
        'results: 1 to 1000, 1 to 1000
    
        'UBounbds for 1 to 18, 1 to 120
        m = 18
        n = 120
    
        ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), _
                                        LBound(MultiArrPaerchen, 2) To n)
        Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                    LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
        'results: 1 to 1000, 1 to 120
    
        MultiArrPaerchen = Application.Transpose(MultiArrPaerchen)
        Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                    LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
        'results: 120, 1 to 1000
    
        ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To m)
        Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                    LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
        'results: 1 to 120, 1 to 18
    
        MultiArrPaerchen = Application.Transpose(MultiArrPaerchen)
        Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                    LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
        'results: 1 to 18, 1 to 120
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2011-02-10
      • 1970-01-01
      • 2010-11-29
      • 2016-11-16
      相关资源
      最近更新 更多