【问题标题】:Excel VBA - Unable to select multiple non contiguos column rangesExcel VBA - 无法选择多个不连续的列范围
【发布时间】:2016-10-30 09:37:23
【问题描述】:

我正在尝试将一些不连续的列(例如 A 列、C 列、E 列)复制到一个动态数组中。但是,当使用 VBA Application.Union 方法时,似乎只复制了连续的范围,留下了不连续的范围。

我已尝试复制连续列(A、B、C、D、E),结果按预期工作,但非连续列(A、C、E)没有。

有人可以帮助我吗?谢谢。

Sub TestFunction()

    Dim TempArray() As Variant
    Dim rngUnion As Range
    With ThisWorkbook.Worksheets(2)
        Set rngUnion = Application.Union(.Range("A1:A10"), .Range("C1:C10"), .Range("E1:E10"))
    End With

    TempArray = rngUnion
End Sub

【问题讨论】:

  • 你试过Hide-ing你想跳过的列吗??
  • @Gary'sStudent 我也尝试过隐藏这些列。但是,它没有用。
  • 在获取二维数组的值时,只能使用连续的矩形范围。如果你想这样做,你需要从各个区域构建阵列。
  • 我不知道为什么 - 这将是开发人员的问题
  • 如果我不得不猜测,当从非连续范围创建二维数组时,无法推断用户的 intent :如果我选择两个矩形范围无法确定我的意思是让它们在结果数组中“并排”与“从上到下”(例如,两个 4x4 范围>>一个 4x8 数组,还是一个 8x4 数组?)跨度>

标签: vba excel


【解决方案1】:

蒂姆·威廉姆斯已经回答了您的问题。我只是想演示一种从多个非连续范围创建数组的酷方法。这项工作的关键是所有范围都有 1 列和相同的行数。

getArrayFromRanges 从传递给它的每个范围中获取值数组,并使用 Transpose 将其从二维数组转换为一维数组。这些 1D Temp 数组中的每一个都被添加到 1D Data 数组中。然后使用转置将数据从一维数组或一维数组转换为二维数组。

Sub TestFunction()
    Dim Data
    With Worksheets(2)
        Data = getArrayFromRanges(.Range("A1:A10"), .Range("C1:C10"), .Range("E1:E10"))
        .Range("A12").Resize(UBound(Data, 1), UBound(Data, 2)) = Data
    End With
End Sub

Function getArrayFromRanges(ParamArray Sources())
    Dim Data, Temp, v
    Dim x As Long
    ReDim Data(UBound(Sources))

    For Each v In Sources
        Temp = Application.Transpose(v)
        Data(x) = Temp
        x = x + 1
    Next

    getArrayFromRanges = Application.Transpose(Data)

End Function

来自Contextures Excel Sample Data的样本数据

【讨论】:

  • 你好,托马斯。你的解决方案很有魅力。非常感谢。
【解决方案2】:

你没有提到你对数组做了什么,所以我不确定这是否适合你。但是,为什么不直接使用rngUnion 而不是数组,并根据需要循环遍历其Areas 集合呢?

例如这个函数:

Sub TestFunction2()
    Dim rngUnion As Range
    Dim area As Range
    With ThisWorkbook.Worksheets(2)
        Set rngUnion = Application.Union(.Range("A1:A10"), .Range("C1:C10"), .Range("E1:E10"))
    End With

    For Each area In rngUnion.Areas
        Debug.Print area.Address
    Next area

    Set area = Nothing
    Set rngUnion = Nothing
End Sub

返回这个输出:

$A$1:$A$10
$C$1:$C$10
$E$1:$E$10


如果您确实需要该数组,您可以使用相同的循环将单个 Areas(即 Ranges)添加到数组中。

【讨论】:

  • 我的目标是将工作表中的两个多个范围与另一个工作表中的其他多个范围进行比较。基于比较(将Sheet1中的“A”列与Sheet2中的“C”列,Sheet1中的“C”列与sheet2中的“E”列,Sheet1中的“E”列与Sheet2中的“G”列),需要在另一个工作表中生成报告。所以,我的实现必须将不同范围或区域的数据复制到一个数组中,因此可以在比较完成之前减少负载。我会试试你的建议,让你知道结果。谢谢。
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多