我想创建一个范围(Rng3),它结合了下表中的第一行和第三行。
1 2 3 4 5
11 22 33 44 55
111 222 333 444 555
为此,我使用这个脚本:
Sub combineRange()
Dim Rng1, Rng2, Rng3 As Range
Set Rng1 = ActiveSheet.Range("A1:E1")
Set Rng2 = ActiveSheet.Range("A3:E3")
Set Rng3 = Union(Rng1, Rng2)
End Sub
现在,当我检查Rng3时,我发现只有第一行数据在此范围内(1,2,3,4,5),而不是表格的第三行。
我做错了什么?
如果范围相邻,则确实有效!
Sub combineRange()
Dim Rng1, Rng2, Rng3 As Range
Set Rng1 = ActiveSheet.Range("A1:E1")
Set Rng2 = ActiveSheet.Range("A2:E2")
Set Rng3 = Union(Rng1, Rng2)
End Sub
答案 0 :(得分:3)
再次检查您的代码。你在这里得到什么?
Sub combineRange()
Dim Rng1 As Range, Rng2 As Range, Rng3 As Range
Set Rng1 = ActiveSheet.Range("A1:E1")
Set Rng2 = ActiveSheet.Range("A3:E3")
Set Rng3 = Union(Rng1, Rng2)
MsgBox (Rng3.Address)
End Sub
答案 1 :(得分:0)
注意:行
Dim Rng1, Rng2, Rng3 As Range
将Rng3
定义为Range
,其他人定义为Variant
。使用:
Dim Rng1 As Range, Rng2 As Range, Rng3 As Range
答案 2 :(得分:0)
据我所知,当您使用UNION
时,它会合并列中的范围而不是行,您可以尝试在使用UNION
之前调整范围:
Sub combineRange()
Dim Rng1,Rng2,Rng3,Rng4 as Range
Set Rng1 = application.transpose(ActiveSheet.Range("A1:E1"))
Set Rng2 = application.transpose(ActiveSheet.Range("A3:E3"))
Set Rng3 = Union(Rng1, Rng2)
Rng4=application.transpose(Rng3)
End Sub
你是对的,实际上我一直在尝试不同的替代方案而没有成功,我认为VBA做得对,我的意思是,当你在非连续范围内使用UNION时,你确实得到一个新的范围,但这不再是“那种矩阵了“所以你不能轻易地迭代它,这个新的范围是无用的,因为它是一个列范围(VBA堆栈两个范围而不是合并它们)。
请检查此示例,我希望它有所帮助。
Sub test()
Dim R1, R2, R3, R4 As Range
Set R1 = ThisWorkbook.Sheets(2).Range("A2:A10")
Set R2 = ThisWorkbook.Sheets(2).Range("B2:B10")
Set R3 = ThisWorkbook.Sheets(2).Range("A2:C10")
Set R4 = Application.Union(Application.Index(R3, , 1), Application.Index(R3, , 3))
Set R5 = Application.Intersect(R4, R4)
Debug.Print R4.Address
Debug.Print R4.Rows.Count
Debug.Print R4.Columns.Count
For Each mycell In R4
Debug.Print mycell
Next
答案 3 :(得分:0)
成功将范围定义为集合,并使用将集合转换为数组的函数。请参阅以下代码:
Sub combineRange()
Dim CombinedRange As Collection
Set CombinedRange = New Collection
CombinedRange.Add ActiveSheet.Range("A1:E1")
CombinedRange.Add ActiveSheet.Range("A3:E3")
'transfer cominedRange to array using function CollectionToArray
varTable = CollectionToArray(CombinedRange)
End Sub
Function CollectionToArray(col As Collection) As Variant()
Dim arr() As Variant, index As Long, it As Variant
ReDim arr(col.Count - 1) As Variant
For Each it In col
arr(index) = it
index = index + 1
Next it
CollectionToArray = arr
End Function