Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何使用并集合并两个不相邻的范围?_Vba_Excel_Union - Fatal编程技术网

Vba 如何使用并集合并两个不相邻的范围?

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,

我想创建一个范围(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
定义为
范围
,其他定义为
变量
。使用:

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&111222333444555
Rng3
是一个范围,而不是一个数组。要处理一个不连续的范围,你需要在它的区域中循环。正如我在对你的原始问题的评论中提到的,我认为是你的检查有缺陷,而不是
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有所帮助(我将继续介绍它);)