【问题标题】:return an entire row of a multidimensional array in VBA to a one dimensional array将 VBA 中多维数组的整行返回到一维数组
【发布时间】:2012-12-19 20:44:40
【问题描述】:

有没有什么方法可以将多维数组的整行的值返回到VBA中的一维数组?

类似于arr_1dim = arr_2dim(3,:) 是一个 matlab 表达式,用于将arr_2dim 数组的第 3 行一次性分配给arr_1dim

Excel VBA中有没有类似的比较便宜的方法?

【问题讨论】:

标签: arrays excel vba multidimensional-array assign


【解决方案1】:

有一种简单的方法可以获取二维数组的一列或一行。为列分配零以获取行,或为行分配零以获取列,因此:

Application.WorksheetFunction.Index(array, 0, columnyouwant) /* or */
Application.WorksheetFunction.Index(array, rowyouwant, 0)

请看这里: How do I slice an array in Excel VBA?

【讨论】:

    【解决方案2】:

    不,没有用于获取行或列的 VBA 函数。只能自己写,或者看这里:
    http://www.cpearson.com/excel/vbaarrays.htm

    【讨论】:

    • 具体来说,GetRow(获取arr(0))/GetColumn(获取arr(1..n,0)
    • 我将这个 GetRow(最简单的循环方法)与投票最多的解决方案(Application.WorksheetFunction.Index(array, rowyouwant, 0))进行了基准测试,速度提高了 6 倍。
    【解决方案3】:

    这就是我为轻松打印出多维数组的一维所做的工作。

    基本上,我定义了一个新的一维数组,并用更大数组中的值填充它。

    示例(3D 到 1D 到打印输出):

    Sub PrintItOut()
         ReDim big_array(10,5,n) as Variant, small_array(n) as Variant
    
         'use multidimensional array
    
    
         'place multi-dimensional values into the 1D array
    
         For i = 0 to n
                small_array(i) = big_array(0, 0, i)
         Next
    
         Range(Cells(1, 1), Cells(1, n + 1)) = small_array
    End Sub
    

    我就是这样做的。我希望这对可能正在阅读它的人有意义。我认为这是一种非常简单的方法。

    【讨论】:

      【解决方案4】:

      Matlab 是一个非常棒的应用程序,可以在矩阵、数组、向量方面工作...... ;) 但是 Excel 并没有那么糟糕,它也是基于矩阵的。

      所以假设你不想循环。您可以使用Transpose 函数将您的multi-D array 简单地输出到工作表中。

      然后使用TransposeRow 拉到所需范围大小的数组中。

      Dim vArr as Variant
      
      '--output multi-D array into worksheet
      Sheets(2).Range("E2").Resize(UBound(multiDArray) + 1, _
      UBound(Application.Transpose(multiDArray))) = multiDArray
      
      '--pull back the row you need: we double transpose here to get 1D. Coz single transpose
      '-- results in 2D array..
      vArr = WorksheetFunctions.Transpose( _ 
             WorksheetFunctions.Transpose(Sheets(1).Range("A2:G2").Value)) 
      

      要绝对动态,您可以使用多 D array row upperbound 动态行计数 resize 您的 range A2:G2 :)

      【讨论】:

      • @Surya 请看一下编辑。初始版本只会为您提供single row-multi column transpose 的二维数组。在这种情况下,您需要进行双重转置;)我可以给您代码,但我希望您在编写代码时玩得开心。请尝试并发表评论。如果您有更多问题,很乐意为您提供帮助。
      【解决方案5】:

      由于我最近自己有这个问题,所以我想分享我的代码。我编写了一个即用型函数,您可以在其中选择是要提取列还是行:

      '*** Modul 1, define function ***
      
      Function getOneLine(array2D As Variant, lineIndex As Integer, choice As String) As Variant
      ' returning one column or row of a 2D array
      ' array2D: 2 dimensional Array
      ' lineIndex: the index of column or row, starting at 0
      ' choice: "c" for column or "r" for row
      
          Dim i, n As Integer
          Dim oneLine As Variant
      
      
          If choice = "c" Then
      
          n = UBound(array2D, 2)
          ReDim oneLine(n)
      
              For i = 0 To n
                  oneLine(i) = array2D(lineIndex, i)
              Next
      
          getOneLine = oneLine
      
          End If
      
      
          If choice = "r" Then
      
          n = UBound(array2D, 1)
          ReDim oneLine(n)
      
              For i = 0 To n
                  oneLine(i) = array2D(i, lineIndex)
              Next
      
          getOneLine = oneLine
      
          End If
      
      End Function
      
      
      '*** Modul 2, call function ***
      
      Sub SomeProcess()
          ' Creating a 3x2 Matrix
          ' (In VBA-arrays the column is indexed before the rows
          '  starting at 0. So 3x2 looks like 1x2)
          Dim SomeArray(1, 2) As Variant
              SomeArray(0, 0) = 1
              SomeArray(0, 1) = 2
              SomeArray(0, 2) = 3
              SomeArray(1, 0) = 4
              SomeArray(1, 1) = 5
              SomeArray(1, 2) = 6
      
          Dim oneLine As Variant
              oneLine = getOneLine(SomeArray, 1, "c")
      
          Debug.Print oneLine(2)
              ' prints 6
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 2023-03-06
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        相关资源
        最近更新 更多