【问题标题】:Issue creating variant array from union of ranges从范围联合创建变体数组的问题
【发布时间】:2022-08-18 08:31:57
【问题描述】:

使用联合连接范围时,我在创建变体数组时遇到了一些麻烦。

如果我选择其中一个范围,则变量数组将正常工作,但是当我合并时,我只收到行尺寸而不是列尺寸。

例如,

Sub arrTest()
    
    \'Declare varbs
    Dim ws As Worksheet
    Dim myArr() As Variant
    Dim lRow As Integer
    Dim myRng As Range
    
    \'Assign varbs
    Set ws = ThisWorkbook.Worksheets(\"Sheet1\")
    
    With ws
        
        lRow = .Cells(Rows.count, \"C\").End(xlUp).row
       Set myRng = Application.Union(.Range(\"G3:G\" & lRow), .Range(\"J3:O\" & lRow), .Range(\"AD3:AE\" & lRow), .Range(\"AI3:AI\" & lRow))
        
        myArr = myRng.Value2
         
    End With

将返回一个变体 我的Arr(1, 1) 我的 (2, 1) 我的 (1, 3)

但是,如果我只是选择联合中的一个范围,例如:

Sub arrTest()
    
    \'Declare varbs
    Dim ws As Worksheet
    Dim myArr() As Variant
    Dim lRow As Integer
    Dim myRng As Range
    
    \'Assign varbs
    Set ws = ThisWorkbook.Worksheets(\"Sheet1\")
    
    With ws
        
        lRow = .Cells(Rows.count, \"C\").End(xlUp).row
       Set myRng = .Range(\"J3:O\" & lRow)
        myArr = myRng.Value2
         
    End With

我正确地得到以下 我的Arr(1, 1) 我的 (1, 2) 我的 (1, 3) ETC

对正确返回列尺寸有什么帮助而不必遍历工作表吗?

  • 您不能将不连续的范围读入数组 - 它只是行不通。
  • @TimWilliams 对解决方法的任何建议,或者更好地重新排序列以使它们连续?
  • 您可以遍历范围并填充数组
  • @TimWilliams 我目前遍历工作表中的范围以填充数组,但希望通过将数组作为一个整体填充来加快此过程

标签: excel vba multidimensional-array


【解决方案1】:

像这样:

Sub ArrayTest()
    
    Dim ws As Worksheet
    Dim arr, lrow As Long
    
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    lrow = ws.Cells(Rows.Count, "C").End(xlUp).Row
    
    arr = GetArray(ws.Range("G3:G" & lrow), ws.Range("J3:O" & lrow), _
                   ws.Range("AD3:AE" & lrow), ws.Range("AI3:AI" & lrow))
        
    With ThisWorkbook.Worksheets("Sheet2").Range("B2")
        .Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
    End With
         
End Sub

'Given a number of input ranges each consisting of one or more columns (assumed all input ranges have
'  the same # of rows), return a single 1-based 2D array with the data from each range
Function GetArray(ParamArray sourceCols() As Variant) As Variant
    Dim arr, rng, numCols As Long, numRows As Long, r As Long, c As Long, tmp, col As Long
    
    numRows = sourceCols(0).Rows.Count
    'loop over ranges and get the total number of columns
    For Each rng In sourceCols
        numCols = numCols + rng.Columns.Count
    Next rng
    
    ReDim arr(1 To numRows, 1 To numCols) 'size the output array
    c = 0
    For Each rng In sourceCols        'loop the input ranges
        tmp = As2DArray(rng)          'get range source data as array ####
        For col = 1 To UBound(tmp, 2) 'each column in `rng`
            c = c + 1                 'increment column position in `arr`
            For r = 1 To numRows      'fill the output column
                arr(r, c) = tmp(r, col)
            Next r
        Next col
    Next rng
    GetArray = arr
End Function

'Get a range's value, always as a 2D array, even if only a single cell
Function As2DArray(rng)
    If rng.Cells.Count > 1 Then
        As2DArray = rng.Value
    Else
        Dim arr(1 To 1, 1 To 1)
        arr(1, 1) = rng.Value
        As2DArray = arr
    End If
End Function

【讨论】:

  • 优秀的伴侣。谢谢你。会根据我的需要进行一些调整,但这正是我想要实现的目标
  • 当我有一排时,这就会分崩离析。有关如何解决此问题的任何建议。我做了几次尝试,但是我可以将 value2 视为一个数组,但不确定如何循环 value2 本身。如果我能做到,那么我可以分配给数组
  • 在只有一个单元格的范围内调用 .Value 不会给您一个 2D 数组:您可以使用辅助函数来确保您始终从任何范围获得一个 2D 数组。
  • 我在 sourcecols 中的第二个范围的 value2 看起来像 Value2(1) Value2(1, 1) Value2(1, 2) etc
猜你喜欢
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2022-07-26
  • 2013-02-25
  • 1970-01-01
相关资源
最近更新 更多