从不相交的列创建2D数组

时间:2018-02-02 05:54:41

标签: excel vba excel-vba range union

我有一个接受范围作为输入的大型Excel VBA宏(无法修改)。它目前通过以下方式运行:

CustomFunc(Range("A10:I110"), outputFileName)

现在,我需要更改一些调用此函数,以使用不同的列代替具有非常不同的字符串集的列A。我试图通过以下方式组合列,但它们似乎不起作用(函数抱怨不兼容的类型,所以我认为我正在尝试的列的串联不起作用):

CustomFunc(Range("X10:X110,B10:I110"), outputFileName)
CustomFunc(Union(Range("X10:X110"), Range("B10:I110")), outputFileName)

I've also tried a function that is supposed to help me accomplish this via VBA,但结果是variant而非范围,因此我无法使用它来生成CustomFunc的输入。

如何生成连续的列集并将其作为范围显示给我的函数CustomFunc

修改

It appears that the Union function disregards order.

新问题:

如何从两个范围创建数组,即X10:X110B10:I110来创建9x100项目数组,其中X列是第一个/左边最近的一栏?

1 个答案:

答案 0 :(得分:1)

如果在非连续列范围上使用Union对象并将其传递给函数或子过程,则循环遍历行可能会给出与预期不同的内容。这几乎就像VBA认为两列是堆积

例如,如果您在下面的代码中运行宏测试,您将看到通过行循环意味着您循环遍历2列的每个单元格。

Sub test()
    Call SelectRowByRow(Union(Range("A1:A3"), Range("C1:C3")))
End Sub

Sub SelectRowByRow(rng As Range)

    Dim r As Range, i As Integer
    For Each r In rng.Rows
        r.Select
        i = i + 1
        MsgBox "Row " & i
    Next

End Sub

如果某些列是连续的,但是不是全部列,这会有点混乱。例如,使用 test2 ,您会看到列C和D被视为A列中的单独块,但它会将它们的行视为一起。

Sub test2()
    Call SelectRowByRow(Union(Range("A1:A3"), Range("C1:C3"), Range("D1:D3")))
End Sub

因此,我建议通过 循环

新问题:

如果你只有2个范围,你可以使用这样的函数:

Function UnionOrdered(rng1 As Range, rng2 As Range) As Range

    Dim wksTemp As Worksheet
    On Error Resume Next
        Set wksTemp = Sheets("TempUnion")
    On Error GoTo 0

    If wksTemp Is Nothing Then
        Set wksTemp = Sheets.Add
        wksTemp.Name = "TempUnion"
        wksTemp.Visible = False
    End If

    wksTemp.Cells.Clear
    rng1.Parent.Activate
    wksTemp.Cells(1, 1).Resize(rng1.Rows.Count, rng1.Columns.Count).Value2 = rng1.Value2
    wksTemp.Cells(1, 1 + rng1.Columns.Count).Resize(rng2.Rows.Count, rng2.Columns.Count).Value2 = rng2.Value2

    Set UnionOrdered = wksTemp.Range("A1").CurrentRegion

End Function

它将使用隐藏工作表来复制指定范围的内容,以便按正确的顺序选择范围。