如何结合使用联盟的两个不相邻的范围?

我想创build一个范围(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 

再次检查你的代码。 你在这里得到什么?

 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 

注意:该行

 Dim Rng1, Rng2, Rng3 As Range 

Rng3定义为Range ,将其他定义为Variant 。 使用:

 Dim Rng1 As Range, Rng2 As Range, Rng3 As Range 

据我所知,当你使用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 

你是对的,其实我一直在尝试不同的select而没有成功,我认为,VBA是做对了,我的意思是,当你在非连续的范围使用UNION,你确实得到了一个新的范围,但这不是“种matrix了”,所以你无法轻松地迭代,这个新的范围是无用的,因为它是一个列的范围(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 

在这里输入图像描述

通过将范围定义为集合并使用将集合转换为数组的函数来成功完成。 见下面的代码:

 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