hỏi về gộp union trong vba !

Liên hệ QC

zxxzzxxz

Thành viên mới
Tham gia
10/12/18
Bài viết
22
Được thích
4
union.png
em có hình như trên. Em muốn gộp những ô với điều kiện như sau : nếu có một ô xanh và ô xanh tiếp sau mà cách nó ít hơn 3 ô đỏ thì sẽ gộp chúng lại thành union . Xin các anh chị giúp . địa chỉ bắt đầu và kết thúc union ta điền vào hai dòng trên cùng ạ. Em cảm ơn .
 
View attachment 265060
em có hình như trên. Em muốn gộp những ô với điều kiện như sau : nếu có một ô xanh và ô xanh tiếp sau mà cách nó ít hơn 3 ô đỏ thì sẽ gộp chúng lại thành union . Xin các anh chị giúp . địa chỉ bắt đầu và kết thúc union ta điền vào hai dòng trên cùng ạ. Em cảm ơn .
Đây là định dạng bình thường hay định dạng có điều kiện vậy bạn? Bạn cần gửi file lên đi.
 
Upvote 0
View attachment 265060
Em muốn gộp những ô với điều kiện như sau : nếu có một ô xanh và ô xanh tiếp sau mà cách nó ít hơn 3 ô đỏ thì sẽ gộp chúng lại thành union . Xin các anh chị giúp . địa chỉ bắt đầu và kết thúc union ta điền vào hai dòng trên cùng ạ. Em cảm ơn .
Hình như ở cột cuối chưa thỏa điều kiện ít hơn 3 ô mà?!
 
Upvote 0
Dạ anh. Hôm đó em vẫn lưu bài ạ. Nay em gặp bài toán muốn gộp cả xanh đỏ vào một cụm ạ.
Code vậy phải không?
Mã:
Option Explicit

Sub MergeCell()
Dim MyColor As Long, iCol As Long, iRw As Long, Rng As Range, RngTmp As Range
Const NumCol = 4 'Toi da o giua la 3 o do
MyColor = RGB(0, 176, 80)
With Sheets("Sheet1")
    Set Rng = .Range("H3:K38")
    For iCol = 1 To Rng.Columns.Count
        Set RngTmp = Nothing
        For iRw = 1 To Rng.Rows.Count
            If Rng(iRw, iCol).Interior.Color = MyColor Then
                If RngTmp Is Nothing Then
                    Set RngTmp = Rng(iRw, iCol)
                Else
                    If Rng(iRw, iCol).Row - RngTmp.Row <= NumCol Then
                        .Range(RngTmp, Rng(iRw, iCol)).Merge
                    End If
                    Set RngTmp = Rng(iRw, iCol)
                End If
            End If
        Next
    Next
End With
End Sub
 
Upvote 0
Code vậy phải không?
Mã:
Option Explicit

Sub MergeCell()
Dim MyColor As Long, iCol As Long, iRw As Long, Rng As Range, RngTmp As Range
Const NumCol = 4 'Toi da o giua la 3 o do
MyColor = RGB(0, 176, 80)
With Sheets("Sheet1")
    Set Rng = .Range("H3:K38")
    For iCol = 1 To Rng.Columns.Count
        Set RngTmp = Nothing
        For iRw = 1 To Rng.Rows.Count
            If Rng(iRw, iCol).Interior.Color = MyColor Then
                If RngTmp Is Nothing Then
                    Set RngTmp = Rng(iRw, iCol)
                Else
                    If Rng(iRw, iCol).Row - RngTmp.Row <= NumCol Then
                        .Range(RngTmp, Rng(iRw, iCol)).Merge
                    End If
                    Set RngTmp = Rng(iRw, iCol)
                End If
            End If
        Next
    Next
End With
End Sub
em muốn lấy vị trí của "cụm" rồi ghi vị trí lên hai dòng trên chứ ko phải gộp và biến thành cụm xanh hết cả anh ạ.
 
Upvote 0
em có hình như trên. Em muốn gộp những ô với điều kiện như sau : nếu có một ô xanh và ô xanh tiếp sau mà cách nó ít hơn 3 ô đỏ thì sẽ gộp chúng lại thành union . Xin các anh chị giúp . địa chỉ bắt đầu và kết thúc union ta điền vào hai dòng trên cùng ạ. Em cảm ơn .
Bạn hỏi mả tiết kiệm lời giải thích, đồng thời cũng không cho biết tại sao có con số ở trên, trong khi bên dưới nó chẳng có chữ số nào? vậy thì gộp cái gì vào các con số ở dòng 1,2 ở trên?
 
Upvote 0
vâng ,em gửi file đính kèm ạ.
Có lẽ đây là đáp án mong đợi :D
Mã:
Option Explicit

Sub LTDN()
Dim Nguon As Range
Dim Dau, Cuoi, Gioihan
Dim Kq
Dim rws, cls
Dim i, j, k
Gioihan = 3
With Sheet1
    Set Nguon = .Range("H3:K38")
    rws = Nguon.Rows.Count
    cls = Nguon.Columns.Count
    ReDim Kq(1 To 3, 1 To cls)
    For j = 1 To cls
        k = 0
        For i = 1 To rws
            If Nguon(i, j).Interior.Color = 255 Then
                If k = 0 Then Dau = Nguon(i, j).Row
                k = k + 1
            Else
                If k > Gioihan Then
                    If k > Kq(3, j) Then
                        Kq(3, j) = k
                        Kq(1, j) = Dau
                        Kq(2, j) = Nguon(i, j).Row - 1
                    End If
                End If
                k = 0
            End If
        Next i
    Next j
    .Range("H1").Resize(2, cls) = Kq
End With
End Sub
 
Upvote 0
Giả sử nó có nhiều vùng thì ghi cái nào
Cái trường hợp í em sẽ duyệt for từng cụm một anh ạ. Nên em mới đơn giản hoá bài toán. Dữ liệu sẽ hàng ngàn cột và hàng ngàn dòng ạ,em chỉ chưa làm được trong một mảng dữ liệu tối giản nên phải hỏi ạ. Em cảm ơn anh và anh em 4room !
 
Upvote 0
Cái trường hợp í em sẽ duyệt for từng cụm một anh ạ. Nên em mới đơn giản hoá bài toán. Dữ liệu sẽ hàng ngàn cột và hàng ngàn dòng ạ,em chỉ chưa làm được trong một mảng dữ liệu tối giản nên phải hỏi ạ. Em cảm ơn anh và anh em 4room !
Đề tài rất hay, bạn gửi thử file có vài ngàn dòng cột lên để tăng tốc code nhé
 
Upvote 0
Cái trường hợp í em sẽ duyệt for từng cụm một anh ạ. Nên em mới đơn giản hoá bài toán. Dữ liệu sẽ hàng ngàn cột và hàng ngàn dòng ạ,em chỉ chưa làm được trong một mảng dữ liệu tối giản nên phải hỏi ạ. Em cảm ơn anh và anh em 4room !
Đến bài #15 rồi mình vẫn chưa rõ ý muốn của bạn là gì.
Lần trước lấy địa chỉ dòng của vùng màu đỏ lớn nhất => Cái này ok xong rồi mà đúng không?
Bây giờ có phải là muốn lấy địa chỉ của dòng màu xanh (đầu và cuối) mà ở giữa nó không quá 3 ô đỏ đúng không? => Nếu là đúng thì mình đã hỏi thêm: giả sử trong một cột có nhiều vùng thỏa mãn không quá 3 ô đỏ nhưng nó không liên tiếp => Lúc này ghi địa chỉ của vùng nào lên trên cùng? vì trên đó chỉ có 2 ô
Còn nếu không đúng thì bạn diễn giải cho chi tiết
 
Upvote 0
Đến bài #15 rồi mình vẫn chưa rõ ý muốn của bạn là gì.
Lần trước lấy địa chỉ dòng của vùng màu đỏ lớn nhất => Cái này ok xong rồi mà đúng không?
Bây giờ có phải là muốn lấy địa chỉ của dòng màu xanh (đầu và cuối) mà ở giữa nó không quá 3 ô đỏ đúng không? => Nếu là đúng thì mình đã hỏi thêm: giả sử trong một cột có nhiều vùng thỏa mãn không quá 3 ô đỏ nhưng nó không liên tiếp => Lúc này ghi địa chỉ của vùng nào lên trên cùng? vì trên đó chỉ có 2 ô
Còn nếu không đúng thì bạn diễn giải cho chi tiết
Đọc bài 12 tôi đã góp ý nhưng chủ Topic đâu có quan tâm. Ít ra họ cho 1 sheet kết quả để còn nhìn so sanh.
 
Upvote 0
Đến bài #15 rồi mình vẫn chưa rõ ý muốn của bạn là gì.
Lần trước lấy địa chỉ dòng của vùng màu đỏ lớn nhất => Cái này ok xong rồi mà đúng không?
Bây giờ có phải là muốn lấy địa chỉ của dòng màu xanh (đầu và cuối) mà ở giữa nó không quá 3 ô đỏ đúng không? => Nếu là đúng thì mình đã hỏi thêm: giả sử trong một cột có nhiều vùng thỏa mãn không quá 3 ô đỏ nhưng nó không liên tiếp => Lúc này ghi địa chỉ của vùng nào lên trên cùng? vì trên đó chỉ có 2 ô
Còn nếu không đúng thì bạn diễn giải cho chi tiết
dạ ý em đúng là sẽ định muốn lấy địa chỉ của dòng màu xanh (đầu và cuối) mà ở giữa nó không quá 3 ô đỏ. Trong file này mỗi cột cũng có duy nhất một cụm như vậy nên sẽ ghi đầu cuối lên hai dòng trên như ghi đầu cuối đoạn đỏ . Còn nếu bài toán dữ liệu lớn , phát sinh thêm nhiều cái đó em sẽ tìm cách duyệt một biến đếm cụm ạ . Vì em mới đang nghĩ cách giải quyết trong một bài toán đơn giản ngắn gọn này nên cũng chưa lường được ,sorry các anh !
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom