簡體   English   中英

Excel vba Union方法復制重疊的單元格

[英]Excel vba Union method duplicates cells that overlap

我希望下面的宏顯示6,但它顯示8.我明白這是因為Union重復了重疊的單元格,就像我的例子中的單元格b1:b2一樣:

Sub a()
Dim myRange As Range
Set myRange = Application.Union(Range("a1:b2"), Range("b1:b4"))
MsgBox myRange.Count
End Sub

我找到了這個問題的解決方案,但我很想知道為什么這是Union工作的方式,如果還有其他方法來解決這個問題,除了編寫上述鏈接所建議的新功能。

是的,Union運算符實際上更像是SQL中的UNION ALL語句。 Excel的聯盟運營商不會返回不同的一組細胞。

我發現很多關於20年前閉源設計決策的推測有點沒有意義,盡管有趣的是要注意Excel-VBA處理Union網格的方式與Excel處理電子表格函數中的多個范圍選擇的方式。 在這:

在此輸入圖像描述

總和評估為12而不是10.因此,VBA的方法似乎是嘗試提出一個Range對象,該對象與Excel本身如何處理重疊選擇相對應。 這會將設計決策推遲到VBA之前的Excel。

如果Union沒有做你想做的事,那么你需要編寫一個不同的功能。 Chip Pearson是一位非常優秀的VBA程序員,所以如果他錯過任何簡單的解決方案,我會感到驚訝。 你的實際問題討論了工會的數量 如果這是你想要的,你可以編寫一個較小的函數:

Function UnionCount(A As Range, B As Range) As Long
    Dim adjustment As Long
    If Not Intersect(A, B) Is Nothing Then
        adjustment = Intersect(A, B).Cells.Count
    End If
    UnionCount = Union(A, B).Cells.Count - adjustment
End Function

然后UnionCount(Range("A1:B2"), Range("B1:B4"))評估為6。

HIL,

union方法創建一個包含n個區域的范圍。

有趣的是,這個Application.Union(Range("a1:c2"), Range("a1:c2"), Range("a1:c2"))創建了一個區域。 事實上,對於其中一個范圍完全包含所有其他范圍的情況,您將只返回1個區域。 例如Application.Union(Range("a1:f2"), Range("b2:d2")) 另一個有趣的例子是Application.Union(Range("a1:f2"), Range("b2:d3"), Range("d2:e3"))這個合並范圍(b2:e3)並創建了2個區域。

此時要說明的是,連續范圍必須是矩形。

因此,Union將創建最有效的連續范圍塊,但可能仍存在一些重疊。

CPearson的網站從一開始就存在,所以你不太可能找到更好的問題來源。 我不是CPearson )。

關心加雷思

暫無
暫無

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

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