Vba 如何使用并集合并两个不相邻的范围?
我想创建一个范围(Rng3),它结合了下表的第一行和第三行Vba 如何使用并集合并两个不相邻的范围?,vba,excel,union,Vba,Excel,Union,我想创建一个范围(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,
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
定义为范围
,其他定义为变量
。使用:
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
你是对的,事实上,我一直在尝试不同的替代方案,但没有成功,我认为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
成功地将范围定义为集合,并使用将集合转换为数组的函数。请参阅下面的代码:
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
我想问题只在于你如何“检查”
Rng3
。有些事情告诉我Union没有做你认为应该做的事情。你认为输出范围应该是什么?我在调试模式中使用Add watch…检查Rng3。输出应该是“1,2,3,4,5和111222333444555”,然后我得到$A$1:$E$1,$A$3:$E$3,这不是你想要的?@Martenoninkno,我希望Rng3包含1,2,3,4,5&111222333444555Rng3
是一个范围,而不是一个数组。要处理一个不连续的范围,你需要在它的区域中循环。正如我在对你的原始问题的评论中提到的,我认为是你的检查有缺陷,而不是Union
运算符。@martennink要在区域上迭代,你需要两个循环:首先迭代over area属性和每个区域的第二个循环单元:用于rngUnion中的每个rngArea。区域:用于rngArea中的每个单元:下一个:下一个
谢谢,但我仍然得到相同的数据(仅第一行)使用:Dim Rng1作为变量,Rng2作为变量,Rng3作为RangeUNION也适用于行。如果范围相邻,则它确实有效:设置Rng1=ActiveSheet.Range(“A1:E1”)设置Rng2=ActiveSheet.Range(“A2:E2”)
您提供的代码给出了运行时错误(13):不幸的是,不匹配。是的,你是对的,我添加了新信息。希望它对使用Python/Pandas有所帮助(我将继续介绍它);)