簡體   English   中英

如何使用Union合並兩個非相鄰范圍?

[英]How to combine two non-adjacent ranges using 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, 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

您是對的,實際上我一直在嘗試不同的替代方案而沒有成功,我認為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM