HeSanbi
Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
- Tham gia
- 24/2/13
- Bài viết
- 2,610
- Được thích
- 4,046
- Giới tính
- Nam
Trong quá trình lập trình với VBA thì tôi nhận thấy VBA không có Phương thức lấy đối tượng Range không giao nhau giữa tập hợp các đối tượng Range khác nhau. Trong VBA có các phương thức như: gộp đối tượng Range bằng hàm Union, lấy đối tượng Range giao nhau bằng Hàm Intersect. Mặc dù tôi đã tham khảo một số Code trên tìm kiếm Google, nhưng các đoạn code ấy thường hay dùng bẫy lỗi hoặc là chưa được tối ưu. Vì vậy hôm nay tôi đã bỏ chút ít thời gian để viết ra hàm NonIntersect - Phương thức lấy đối tượng Range không giao nhau giữa tập hợp các đối tượng Range khác nhau.
----------------------------------------------------------------------
Hàm NonIntersect là gì?
Hàm NonIntersect nhận 3 đối số truyền vào:
----------------------------------------------------------------------
Hàm paNonIntersect là gì? ở hàm NonIntersect chỉ nhận 2 đối tượng Range, vì vậy hàm paNonIntersect được tạo ra để nhận nhiều hơn 1 Đối tượng Range (Ít nhất là 2 đối tượng Range, nhiều nhất là giới hạn của VBA)
Sử dụng hàm:
----------------------------------------------------------------------
Ứng dụng:
Tag: Hàm NonIntersect, ngược lại với hàm Intersect, not intersect, Non-Intersect, not intersect vba, non-Intersect vba
Liên hệ
----------------------------------------------------------------------
Hàm NonIntersect là gì?
Trong VBA hàm Intersect sẽ trả về đối tượng Range giao nhau giữa tập hợp các đối tượng Range khác nhau.
Thì hàm NonIntersect sẽ là ngược lại của hàm Intersect, hàm sẽ chỉ lấy các đối tượng Range không giao nhau giữa tập hợp các đối tượng Range khác nhau.
Hàm NonIntersect nhận 3 đối số truyền vào:
1. RngA As Range: Đối tượng Range A
2. RngB As Range: Đối tượng Range B
3. NonOfA As Boolean: Chỉ lấy các đối tượng không giao nhau của Đối tượng Range A
Sử dụng hàm:
PHP:
Dim Rng As Range
Set Rng = NonIntersect(Cells, Range("A1:D10"), False )
Hàm paNonIntersect là gì? ở hàm NonIntersect chỉ nhận 2 đối tượng Range, vì vậy hàm paNonIntersect được tạo ra để nhận nhiều hơn 1 Đối tượng Range (Ít nhất là 2 đối tượng Range, nhiều nhất là giới hạn của VBA)
Sử dụng hàm:
Hàm paNonIntersect nhận 1 đối số đầu tiên NonOfA để xác định xem chỉ lấy các đối tượng không giao nhau của Đối tượng Range đầu tiên hay không, còn lại là nhận nhiều hơn 1 Đối tượng Range
PHP:
Dim Rng As Range
Set Rng = paNonIntersect(False , Range("A1:D10"), Range("B1:F10"), Range("A15:C100"), Range("N1:Z15")) ' , ....)
Ứng dụng:
1. FormatCondition không trùng với FormatCondition trước đó:
2. Tô màu không trùng với FormatCondition hoặc Vùng đã tô trước đó
... Và nhiều ứng dụng khác.
==================================================================
PHP:
Sub test_NonIntersect()
Dim R As Range, R1 As Range, R2 As Range
Set R1 = Cells
Set R2 = Range("A2:A10,B15:C1000")
Dim ti#: ti = Timer
Set R = NonIntersect(R1, R2)
If Not R Is Nothing Then
Debug.Print R.address(0, 0)
End If
Debug.Print Round(Timer - ti, 2)
End Sub
Sub test_paNonIntersect()
Dim R As Range, R1 As Range, R2 As Range, R3 As Range
Set R1 = Range("A1:B1")
Set R2 = Range("B1:C1")
Set R3 = Range("C1:D1")
Dim ti#: ti = Timer
Set R = paNonIntersect(False, R1, R2, R3)
If Not R Is Nothing Then
Debug.Print R.address(0, 0)
End If
Debug.Print Round(Timer - ti, 2)
End Sub
Function NonIntersect(RngA As Range, RngB As Range, _
Optional ByVal NonOfA As Boolean) As Range
Dim Ri As Range, Ru As Range
Dim P As Worksheet, Su, Si
If Not RngA.Parent Is RngB.Parent Then GoTo Ends
Set P = RngA.Parent
If NonOfA Then Set Ru = RngA Else Set Ru = UnionA(RngA, RngB)
Set Ri = Intersect(RngA, RngB)
If Ri Is Nothing Then Set NonIntersect = Ru: GoTo Ends
Set Su = Ru.Areas: Set Si = Ri.Areas
Dim cU As Range, cI As Range, t_R As Range, nF As Boolean
Dim r1U&, r2U&, c1U%, c2U%
Dim r1I&, r2I&, c1I%, c2I%
For Each cU In Su
Set t_R = Nothing: nF = False
For Each cI In Si
If Not Intersect(cI, cU) Is Nothing Then
If t_R Is Nothing Then
r1U = cU.Row: r2U = cU.Rows.Count + r1U - 1
c1U = cU.Column: c2U = cU.Columns.Count + c1U - 1
r1I = cI.Row: r2I = cI.Rows.Count + r1I - 1
c1I = cI.Column: c2I = cI.Columns.Count + c1I - 1
With P
If r1I - r1U > 0 Then Set t_R = UnionA(.Range(.Cells(r1U, c1U), .Cells(r1I - 1, c2U)), t_R)
If r2U - r2I > 0 Then Set t_R = UnionA(.Range(.Cells(r2I + 1, c1U), .Cells(r2U, c2U)), t_R)
If c1I - c1U > 0 Then Set t_R = UnionA(.Range(.Cells(r1U, c1U), .Cells(r2U, c1I - 1)), t_R)
If c2U - c2I > 0 Then Set t_R = UnionA(.Range(.Cells(r1U, c2I + 1), .Cells(r2U, c2U)), t_R)
End With
Else
Set t_R = NonIntersect(t_R, cI)
End If
nF = True
End If
Next cI
If Not nF Then Set t_R = cU
Set NonIntersect = UnionA(NonIntersect, t_R)
Next cU
Ends:
Set Ru = Nothing: Set Ri = Ru: Set t_R = Ru
Set cU = Ru: Set Su = Ru
Set cI = Ru: Set Si = Ru: Set P = Ru
End Function
Function paNonIntersect(NonOfA As Boolean, ParamArray Agrs()) As Range
Dim C%, I%: C = UBound(Agrs)
If C < 1 Then Exit Function
Dim Total As Range, Agr1 As Range, Agr2 As Range
Dim P As Worksheet
For I = 0 To C
If TypeName(Agrs(I)) = "Range" Then
If Agr1 Is Nothing Then
Set Agr1 = Agrs(I): Set P = Agr1.Parent
Else
Set Agr2 = Agrs(I)
If P Is Agr2.Parent Then
Set Agr1 = NonIntersect(Agr1, Agr2, NonOfA)
End If
End If
End If
Next
Set paNonIntersect = Agr1
Set P = Nothing: Set Agr1 = P: Set Agr2 = P
End Function
Function UnionA(RngA As Range, RngB As Range) As Range
If RngA Is Nothing And Not RngB Is Nothing Then
Set UnionA = RngB
ElseIf RngB Is Nothing Then
Set UnionA = RngA
Else
Set UnionA = Union(RngA, RngB)
End If
End Function
Tag: Hàm NonIntersect, ngược lại với hàm Intersect, not intersect, Non-Intersect, not intersect vba, non-Intersect vba
Liên hệ
Lần chỉnh sửa cuối: