Tổng hợp và so sánh

Liên hệ QC

Phương Phương mito

Thành viên thường trực
Tham gia
1/5/19
Bài viết
275
Được thích
65
Kính gửi anh chị và các bạn
Em có File đính kèm. Vùng màu xanh em làm bằng tay và hàm. Nhờ anh chị hỗ trợ code VBA ạ!
 

File đính kèm

  • TỔNG HƠP VA SO SÁNH.xlsm
    13.8 KB · Đọc: 19
Cột E, F là bạn tự điền trước à.Hay thế nào
Vậy là chỉ điền vào cột số lượng và cái cột none gì ấy à. Bạn có thể nói logic cột cuối cùng cho mình hiểu được không
Bài đã được tự động gộp:

Cái đó em cũng cần code lấy ra đó ạ.
Vậy cái chỗ bôi xanh đâu có đúng đâu
 
Upvote 0
Kính gửi anh chị và các bạn
Em có File đính kèm. Vùng màu xanh em làm bằng tay và hàm. Nhờ anh chị hỗ trợ code VBA ạ!
Chẳng giải thích gì cho người khác hiểu cách nào ra kết quả. Ngẫm mãi mới hiểu thế này.
Đẹp nhất là Sort 3 cột A,B,C theo điều kiện cột A rồi B từ A-Z
Bạn xem file nhé!
 

File đính kèm

  • TỔNG HƠP VA SO SÁNH.xlsm
    23.7 KB · Đọc: 20
Lần chỉnh sửa cuối:
Upvote 0
Vậy là chỉ điền vào cột số lượng và cái cột none gì ấy à. Bạn có thể nói logic cột cuối cùng cho mình hiểu được không
Bài đã được tự động gộp:


Vậy cái chỗ bôi xanh đâu có đúng đâu
Cột đó chia làm 3 trường hợp khi so sánh ạ. So sánh mảng lấy ra tại E và F và mảng tại cột I, J ạ. Không có thì là NONE, có nhưng khác Code thì là DIFF còn lại là có và bằng thì là SAME ạ.
Bài đã được tự động gộp:

Chẳng giải thích gì cho người khác hiểu cách nào ra kết quả. Ngẫm mãi mới hiểu thế này.
Đẹp nhất là Sort 3 cột A,B,C theo điều kiện cột A rồi B từ A-Z
Bạn xem file nhé!
Anh cho em hỏi chút ạ: Cái vòng lặp em bôi đậm trong ngay đầu code của anh có ý nghĩa gì ạ ? Em chưa hiểu tác dụng của vòng lặp này ạ.

sArr = Range("J2", Range("K2").End(xlDown)).Value
Rws = UBound(sArr)
For I = 1 To Rws
.Item(sArr(I, 1) & "#") = sArr(I, 2)
Next I
 
Lần chỉnh sửa cuối:
Upvote 0
Kính gửi anh chị và các bạn
Em có File đính kèm. Vùng màu xanh em làm bằng tay và hàm. Nhờ anh chị hỗ trợ code VBA ạ!
Bài nầy khá phức tạp và hay
Yêu cầu bảng Ma_DT và CODE phải nhập chuẩn và cột CODE có nhiều code phải xếp theo thứ tự, ví dụ thêm dòng 8
WLD606, 611, 623
606, 611, 623 được xếp thứ tự từ thấp đến cao
Mã:
Sub XYZ()
  Dim aTmp(), aCode(), sArr(), res(), dic As Object
  Dim sRow&, i&, k&, sMa$, sCode$
 
  With Sheets("Sheet1")
    aCode = .Range("J2", .Range("K2").End(xlDown)).Value 'Ma & Code
    aTmp = .Range("A2", .Range("C2").End(xlDown)).Value 'Du lieu
    sRow = UBound(aTmp)
    .Range("A2:C2").Resize(sRow).Sort .[A2], 1, .[B2], , 1, Header:=xlNo 'Sort Du Lieu
    sArr = .Range("A2:C2").Resize(sRow).Value
  End With
  Set dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aCode)
    dic.Item(aCode(i, 1)) = Replace(aCode(i, 2), " ", "")
  Next i

  ReDim res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    If sMa <> sArr(i, 1) Then
      k = k + 1
      sMa = sArr(i, 1)
      res(k, 1) = sMa
      res(k, 2) = CStr(sArr(i, 2))
      sCode = res(k, 2)
    ElseIf sCode <> sArr(i, 2) Then
      sCode = sArr(i, 2)
      res(k, 2) = res(k, 2) & ", " & sCode
    End If
    res(k, 3) = res(k, 3) + sArr(i, 3)
  Next i

  For i = 1 To k
    sCode = dic.Item(res(i, 1))
    If sCode = Empty Then
      res(i, 4) = "NONE"
    ElseIf Replace(res(i, 2), " ", "") = sCode Then
        res(i, 4) = "SAME"
    Else
        res(i, 4) = "DIFF"
    End If
  Next i
  With Sheets("Sheet1")
    .Range("B2").Resize(sRow).NumberFormat = "@"
    .Range("A2:C2").Resize(sRow).Value = aTmp 'Tra Du Lieu Goc
    i = .Range("E" & Rows.Count).End(xlDown).Row
    If i > 2 Then .Range("E2:H" & i).ClearContents 'Xoa ket qua cu
    .Range("F2").Resize(k).NumberFormat = "@"
    .Range("E2:H2").Resize(k) = res 'Gan ket qua
    .Range("E2:H2").Resize(k).Sort Key1:=Range("E2") 'Sort ket qua
  End With
End Sub
 

File đính kèm

  • TỔNG HƠP VA SO SÁNH.xlsm
    22.4 KB · Đọc: 15
Upvote 0
Bài nầy khá phức tạp và hay
Yêu cầu bảng Ma_DT và CODE phải nhập chuẩn và cột CODE có nhiều code phải xếp theo thứ tự, ví dụ thêm dòng 8
WLD606, 611, 623
606, 611, 623 được xếp thứ tự từ thấp đến cao
Mã:
Sub XYZ()
  Dim aTmp(), aCode(), sArr(), res(), dic As Object
  Dim sRow&, i&, k&, sMa$, sCode$
 
  With Sheets("Sheet1")
    aCode = .Range("J2", .Range("K2").End(xlDown)).Value 'Ma & Code
    aTmp = .Range("A2", .Range("C2").End(xlDown)).Value 'Du lieu
    sRow = UBound(aTmp)
    .Range("A2:C2").Resize(sRow).Sort .[A2], 1, .[B2], , 1, Header:=xlNo 'Sort Du Lieu
    sArr = .Range("A2:C2").Resize(sRow).Value
  End With
  Set dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aCode)
    dic.Item(aCode(i, 1)) = Replace(aCode(i, 2), " ", "")
  Next i

  ReDim res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    If sMa <> sArr(i, 1) Then
      k = k + 1
      sMa = sArr(i, 1)
      res(k, 1) = sMa
      res(k, 2) = CStr(sArr(i, 2))
      sCode = res(k, 2)
    ElseIf sCode <> sArr(i, 2) Then
      sCode = sArr(i, 2)
      res(k, 2) = res(k, 2) & ", " & sCode
    End If
    res(k, 3) = res(k, 3) + sArr(i, 3)
  Next i

  For i = 1 To k
    sCode = dic.Item(res(i, 1))
    If sCode = Empty Then
      res(i, 4) = "NONE"
    ElseIf Replace(res(i, 2), " ", "") = sCode Then
        res(i, 4) = "SAME"
    Else
        res(i, 4) = "DIFF"
    End If
  Next i
  With Sheets("Sheet1")
    .Range("B2").Resize(sRow).NumberFormat = "@"
    .Range("A2:C2").Resize(sRow).Value = aTmp 'Tra Du Lieu Goc
    i = .Range("E" & Rows.Count).End(xlDown).Row
    If i > 2 Then .Range("E2:H" & i).ClearContents 'Xoa ket qua cu
    .Range("F2").Resize(k).NumberFormat = "@"
    .Range("E2:H2").Resize(k) = res 'Gan ket qua
    .Range("E2:H2").Resize(k).Sort Key1:=Range("E2") 'Sort ket qua
  End With
End Sub
Code hay quá ạ ! Cảm ơn anh đã trợ giúp ạ !
 
Upvote 0
Bài nầy khá phức tạp và hay
Yêu cầu bảng Ma_DT và CODE phải nhập chuẩn và cột CODE có nhiều code phải xếp theo thứ tự, ví dụ thêm dòng 8
WLD606, 611, 623
606, 611, 623 được xếp thứ tự từ thấp đến cao
Mã:
Sub XYZ()
  Dim aTmp(), aCode(), sArr(), res(), dic As Object
  Dim sRow&, i&, k&, sMa$, sCode$
 
  With Sheets("Sheet1")
    aCode = .Range("J2", .Range("K2").End(xlDown)).Value 'Ma & Code
    aTmp = .Range("A2", .Range("C2").End(xlDown)).Value 'Du lieu
    sRow = UBound(aTmp)
    .Range("A2:C2").Resize(sRow).Sort .[A2], 1, .[B2], , 1, Header:=xlNo 'Sort Du Lieu
    sArr = .Range("A2:C2").Resize(sRow).Value
  End With
  Set dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aCode)
    dic.Item(aCode(i, 1)) = Replace(aCode(i, 2), " ", "")
  Next i

  ReDim res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    If sMa <> sArr(i, 1) Then
      k = k + 1
      sMa = sArr(i, 1)
      res(k, 1) = sMa
      res(k, 2) = CStr(sArr(i, 2))
      sCode = res(k, 2)
    ElseIf sCode <> sArr(i, 2) Then
      sCode = sArr(i, 2)
      res(k, 2) = res(k, 2) & ", " & sCode
    End If
    res(k, 3) = res(k, 3) + sArr(i, 3)
  Next i

  For i = 1 To k
    sCode = dic.Item(res(i, 1))
    If sCode = Empty Then
      res(i, 4) = "NONE"
    ElseIf Replace(res(i, 2), " ", "") = sCode Then
        res(i, 4) = "SAME"
    Else
        res(i, 4) = "DIFF"
    End If
  Next i
  With Sheets("Sheet1")
    .Range("B2").Resize(sRow).NumberFormat = "@"
    .Range("A2:C2").Resize(sRow).Value = aTmp 'Tra Du Lieu Goc
    i = .Range("E" & Rows.Count).End(xlDown).Row
    If i > 2 Then .Range("E2:H" & i).ClearContents 'Xoa ket qua cu
    .Range("F2").Resize(k).NumberFormat = "@"
    .Range("E2:H2").Resize(k) = res 'Gan ket qua
    .Range("E2:H2").Resize(k).Sort Key1:=Range("E2") 'Sort ket qua
  End With
End Sub
Em muốn tô màu cho các dòng SAME, DIFF, NONE theo 3 màu và em thử thêm đoạn này dArr(I, 4).Interior.Color = 255 thì không được. Có cách gì tô màu để highlight lên không ạ !

For I = 1 To K
Txt = dArr(I, 1) & "#"
If Not .Exists(Txt) Then
dArr(I, 4) = "NONE"
dArr(I, 4).Interior.Color = 255
Else
If dArr(I, 2) = .Item(Txt) Then
dArr(I, 4) = "SAME"
Else
dArr(I, 4) = "DIFF"
End If
End If
Next I
 
Lần chỉnh sửa cuối:
Upvote 0
Em muốn tô màu cho các dòng SAME, DIFF, NONE theo 3 màu và em thử thêm đoạn này dArr(I, 4).Interior.Color = 255 thì không được. Có cách gì tô màu để highlight lên không ạ !

For I = 1 To K
Txt = dArr(I, 1) & "#"
If Not .Exists(Txt) Then
dArr(I, 4) = "NONE"
dArr(I, 4).Interior.Color = 255
Else
If dArr(I, 2) = .Item(Txt) Then
dArr(I, 4) = "SAME"
Else
dArr(I, 4) = "DIFF"
End If
End If
Next I
Tô màu phải tô trên Range của Sheet, không tô trong mảng được đâu.
 
Upvote 0
Tô màu phải tô trên Range của Sheet, không tô trong mảng được đâu.
Anh cho em hỏi chút ạ: Cái vòng lặp em bôi đậm trong ngay đầu code của anh có ý nghĩa gì ạ ? Em chưa hiểu tác dụng của vòng lặp này ạ.

sArr = Range("J2", Range("K2").End(xlDown)).Value
Rws = UBound(sArr)
For I = 1 To Rws
.Item(sArr(I, 1) & "#") = sArr(I, 2)
Next I
 
Upvote 0
Anh cho em hỏi chút ạ: Cái vòng lặp em bôi đậm trong ngay đầu code của anh có ý nghĩa gì ạ ? Em chưa hiểu tác dụng của vòng lặp này ạ.

sArr = Range("J2", Range("K2").End(xlDown)).Value
Rws = UBound(sArr)
For I = 1 To Rws
.Item(sArr(I, 1) & "#") = sArr(I, 2)
Next I
Dấu "chấm" đầu dòng 2 là thay cho cái With bên trên - With CreateObject("Scripting.Dictionary")
 
Upvote 0
Không ạ. Em muốn hỏi ý nghĩa của vòng lặp này cơ ạ. Và mối liện hệ của nó tới tổng thể code của anh ấy ạ.
Đó là Nạp cái mảng J2:K7 vào Dictionary, Key là cột J (thêm dấu #), Item là cột K. Nếu bạn chưa biết Dictionary thì giải thích bạn cũng không hiểu. Bạn tìm bài viết về Dictionary trên GPE này để đọc.
 
Lần chỉnh sửa cuối:
Upvote 0
Đó là Nạp cái mảng J2:K7 vào Dictionary, Key là cột J, Item là cột K. Nếu bạn chưa biết Dictionary thì giải thích bạn cũng không hiểu. Bạn tìm bài viết về Dictionary trên GPE này để đọc.
Dạ, em có đọc về DIC rồi ạ, nhưng để hiểu sâu thì khó. Em thấy sArr(I, 2) xuất hiện tổng 4 lần trong tất cả code của anh. Em hỏi chút là sArr(I, 2) đầu tiên và 3 lần sau có phải là một không ạ.
 
Upvote 0
Dạ, em có đọc về DIC rồi ạ, nhưng để hiểu sâu thì khó. Em thấy sArr(I, 2) xuất hiện tổng 4 lần trong tất cả code của anh. Em hỏi chút là sArr(I, 2) đầu tiên và 3 lần sau có phải là một không ạ.
Bạn đọc code thì phải xem sArr(I, 2) của từng dòng lệnh nó là gì, ở đâu.
Tôi không phải người chuyên VBA mà chỉ là học lóm được trên GPE này, hiểu sao làm vậy.
Code này tôi có ghi chú những dòng lệnh tôi hiểu, bạn xem và nghiên cứu chứ giải thích hơn nữa thì tôi chịu.
 

File đính kèm

  • TongHop_Sosanh_2.xlsm
    185.5 KB · Đọc: 10
Upvote 0
Bạn đọc code thì phải xem sArr(I, 2) của từng dòng lệnh nó là gì, ở đâu.
Tôi không phải người chuyên VBA mà chỉ là học lóm được trên GPE này, hiểu sao làm vậy.
Code này tôi có ghi chú những dòng lệnh tôi hiểu, bạn xem và nghiên cứu chứ giải thích hơn nữa thì tôi chịu.
Em cảm ơn anh nhiều ạ !
 
Upvote 0
Web KT

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

Back
Top Bottom