【问题标题】:How to get range of cells into a specific array dimension如何将单元格范围放入特定的数组维度
【发布时间】:2017-09-20 20:04:21
【问题描述】:

我需要将一系列单元格放入一个数组中,这本身就很简单:

Dim matchArray As Variant
matchArray = Sheets(lookupSheet).Range("B2:B12000").Value2

这将创建一个二维数组,其中一列作为第二维,如果您扩展范围以包含第二列,它会创建一个二维数组,其中第二维包含两列:

matchArray = Sheets(lookupSheet).Range("B2:C12000").Value2

但是如果两列不相邻并且您不希望中间的那一列怎么办?

matchArray = Sheets(lookupSheet).Range("B2:B12000,D2:D12000").Value2

以上是我最好的猜测,但它不起作用,它只返回指定的第一个范围。

所以我需要一种将范围单元格值返回到数组的特定维度的方法。

我知道我可以通过循环遍历行来做到这一点,但是对于我要处理的行数来说,这将花费很长时间。

【问题讨论】:

  • “这会创建一个一维数组”——但它不会。它创建了一个只有 1 列的二维数组。
  • 为了扩展@JohnColeman 的评论,您将创建一个二维数组,其中 first rank 为 1 到 11999,second rank 为 1 到 1 b>.
  • 你试过Union吗?

标签: vba excel


【解决方案1】:

您确实需要一个循环——但循环遍历 VBA 数组而不是单个单元格:

Sub Test()
    Dim A As Variant, B As Variant, C As Variant
    Dim i As Long
    B = Sheets(lookupSheet).Range("B2:B12000").Value2
    C = Sheets(lookupSheet).Range("D2:D12000").Value2
    ReDim A(1 To 11999, 1 To 2)
    For i = 1 To 11999
        A(i, 1) = B(i, 1)
        A(i, 2) = C(i, 2)
    Next i
    'do stuff with A
End Sub

这应该只需要几分之一秒。

【讨论】:

  • 对不起,我昨天没有回复你,我必须快速工作以在一天结束之前实现这一点。通过一些重构,这对我的代码很有效。
【解决方案2】:

你可以用一个参差不齐的数组来做到这一点:

Dim var1(1 To 2) As Variant
Dim var As Variant
var = Range("A1:A10").Value2
var1(1) = var
var = Range("c1:c10").Value2
var1(2) = var
MsgBox var1(1)(3, 1)

【讨论】:

  • 不是叫“锯齿状”数组吗? ;-)
【解决方案3】:

这里有更多方法:

Sub Example1()
    Const lookupSheet As String = "Sheet1"
    Dim matchArray As Variant, arr1 As Variant, arr2 As Variant

    With Sheets(lookupSheet)
        arr1 = WorksheetFunction.Transpose(.Range("B2:B12000").Value2)
        arr2 = WorksheetFunction.Transpose(.Range("D2:D12000").Value2)
        matchArray = WorksheetFunction.Transpose(Array(arr1, arr2))
    End With
End Sub

Sub Example2()
    Const lookupSheet As String = "Sheet1"
    Dim matchArray As Variant
    Dim x As Long

    With Sheets(lookupSheet)
        matchArray = .Range("B2:B12000").Resize(, 2).Value2
        For Each v In .Range("D2:D12000").Value2
            x = x + 1
            matchArray(x, 2) = v
        Next
    End With
End Sub

【讨论】:

    【解决方案4】:

    可能不会比 John Coleman 的回答快,但我认为这可以满足您的要求。

    Sub x()
    
    Dim matchArray, r As Range
    
    Set r = Sheets(lookupSheet).Range("B2:D12000")
    
    matchArray = Application.Index(r, Evaluate("Row(1:" & r.Rows.Count & ")"), Array(1, 3))
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多