如何使用Union组合两个不相邻的范围?

问题描述 投票:2回答:4

我想创建一个范围(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
excel vba excel-vba union
4个回答
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

0
投票

注意:该行

Dim Rng1, Rng2, Rng3 As Range

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

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

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

enter image description here


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
© www.soinside.com 2019 - 2024. All rights reserved.