我有一个接受范围作为输入的大型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:X110
和B10:I110
来创建9x100
项目数组,其中X
列是第一个/左边最近的一栏?
答案 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
它将使用隐藏工作表来复制指定范围的内容,以便按正确的顺序选择范围。