从不相交的列创建二维数组



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

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

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

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

我还尝试了一个应该帮助我通过 VBA 完成此操作的函数,但结果是variant而不是范围,所以我不能使用它来生成输入以CustomFunc

如何生成一组串联的列并将其显示为我的函数CustomFunc的范围?

编辑

Union函数似乎无视顺序。

新问题:

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

如果在非连续列区域上使用 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

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

最新更新