Code Tự động gộp ô tương ứng giữa 2 cột

Liên hệ QC

pingping2288

Thành viên chính thức
Tham gia
1/11/11
Bài viết
86
Được thích
1
Em có 1 file như này, bao gồm 1 sheet gốc và 1 sheet đích, những ô gộp chung em đã bôi vàng và phải giữ nguyên nội dung. Em nhờ các bác có code để thực hiện tự động những thao tác này được không ạ vì những thao tác này được lặp lại rất nhiều lần! Em cám ơn trước ạ!
 

File đính kèm

Em có 1 file như này, bao gồm 1 sheet gốc và 1 sheet đích, những ô gộp chung em đã bôi vàng và phải giữ nguyên nội dung. Em nhờ các bác có code để thực hiện tự động những thao tác này được không ạ vì những thao tác này được lặp lại rất nhiều lần! Em cám ơn trước ạ!
Bạn thử cái này nhé.
Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObject("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = arr(i, 1)
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
 

File đính kèm

Upvote 0
Bạn thử cái này nhé.
Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObj
[QUOTE="snow25, post: 929710, member: 1166775"]
Sub gop() Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long Set dic = CreateObject("scripting.dictionary") With Sheets("file goc") lr = .Range("B" & Rows.Count).End(xlUp).Row arr = .Range("A2:C" & lr).Value2 ReDim kq(1 To UBound(arr), 1 To 3) End With For i = 1 To UBound(arr) dk = arr(i, 2) If Not dic.exists(dk) Then a = a + 1 kq(a, 1) = arr(i, 1) kq(a, 2) = arr(i, 2) kq(a, 3) = arr(i, 3) dic.Add dk, a Else b = dic.Item(dk) kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3) End If Next i With Sheets("ketqua") lr = .Range("B" & Rows.Count).End(xlUp).Row If lr > 1 Then .Range("A2:C" & lr).ClearContents If a Then .Range("A2:C2").Resize(a).Value = kq End With Set dic = Nothing End Sub
[/QUOTE]

ect("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = arr(i, 1)
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
Em làm được rồi, cám ơn bác nhiều nhiều, chúc bác sức khỏe ạ!
Bài đã được tự động gộp:

Bạn thử cái này nhé.
Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObject("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = arr(i, 1)
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
Em hỏi chút nữa ạ! Cái cột số thứ tự sao nó không chạy lần lượt mà lại nhảy cách thế ạ?Bác giúp em xíu nữa ạ!
 
Upvote 0
Em làm được rồi, cám ơn bác nhiều nhiều, chúc bác sức khỏe ạ!
Bài đã được tự động gộp:


Em hỏi chút nữa ạ! Cái cột số thứ tự sao nó không chạy lần lượt mà lại nhảy cách thế ạ?Bác giúp em xíu nữa ạ!
Tại bạn để như vậy trong file mẫu mà.
Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObject("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = a
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
Bạn thử cái này.
 
Upvote 0
Anh ( chị) ơi. Cho em hỏi ở đoạn code có Chr(10) nghĩa là gì thế ạ
Bạn chịu khó tìm trên diễn đàn nhé:
Bài đã được tự động gộp:

Tại bạn để như vậy trong file mẫu mà.
Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObject("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = a
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
Bạn thử cái này.
Cám ơn bác ạ!
 
Upvote 0
Tại bạn để như vậy trong file mẫu mà.
Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObject("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = a
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
Bạn thử cái này.
Em chỉ muốn gộp cột B và C với nhau thôi mà không cần gộp cột số thứ tự thì làm như nào ạ,? Em thử chỉnh code của bác mà ko được! Cám ơn bác trước ạ!
 
Upvote 0
Em chỉ muốn gộp cột B và C với nhau thôi mà không cần gộp cột số thứ tự thì làm như nào ạ,? Em thử chỉnh code của bác mà ko được! Cám ơn bác trước ạ!
Bạn xóa dòng này


Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObject("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = a ' xóa dòng này'
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
 
Upvote 0
Bạn xóa dòng này


Mã:
Sub gop()
Dim arr, i As Long, dic As Object, lr As Long, dk As Long, kq, b As Long, a As Long
Set dic = CreateObject("scripting.dictionary")
    With Sheets("file goc")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         arr = .Range("A2:C" & lr).Value2
         ReDim kq(1 To UBound(arr), 1 To 3)
    End With
        For i = 1 To UBound(arr)
            dk = arr(i, 2)
            If Not dic.exists(dk) Then
               a = a + 1
               kq(a, 1) = a ' xóa dòng này'
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 3)
               dic.Add dk, a
            Else
               b = dic.Item(dk)
               kq(b, 3) = kq(b, 3) & Chr(10) & arr(i, 3)
            End If
       Next i
    With Sheets("ketqua")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:C" & lr).ClearContents
         If a Then .Range("A2:C2").Resize(a).Value = kq
    End With
    Set dic = Nothing
End Sub
Không được anh ạ!
 
Upvote 0
Xài macro này thử trên file #10:
PHP:
Sub GopTheoThoiGian()
Dim Rws As Long, W As Integer, J As Long, Dat As Date
Dim Arr()

With Sheets("file goc")
    Rws = .[B2].CurrentRegion.Rows.Count
    Arr() = .[B2].Resize(Rws, 2).Value:                       ReDim dArr(1 To Rws, 1 To 3)
    Sheets("KetQua").[A1].Resize(Rws, 3).Value = dArr()
    W = 1:                                                     dArr(W, 1) = .[A1].Value
    dArr(W, 2) = .[B1].Value:                                  dArr(W, 3) = .[C1].Value
End With
For J = 1 To UBound(Arr())
    If Arr(J, 1) = "" Then Exit For                            'Thoát Khi Hêt Du Liêu  '
    If Arr(J, 1) <> Dat Then
        W = W + 1:                                              dArr(W, 1) = W - 1
        dArr(W, 2) = Arr(J, 1):                                 dArr(W, 3) = Arr(J, 2)
        Dat = Arr(J, 1)
    Else
        dArr(W, 3) = dArr(W, 3) & Chr(10) & Arr(J, 2)
    End If
Next J
Sheets("KetQua").[A1].Resize(W, 3).Value = dArr()
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom