Code so sánh hai mảng và đưa ra kết quả

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ị,
E có số liệu bán hàng của tháng 1 và 3. Nếu không dùng Pivot mà Code em muốn so sánh giá trị hàng theo mã hàng giữa hai tháng 1&3 và đưa ra kết quả theo 3 tiêu thức tại vùng H19:K21 như File thì code sẽ như thế nào ạ. Em cảm ơn anh chị ạ.
 

File đính kèm

Kính gửi anh chị,
E có số liệu bán hàng của tháng 1 và 3. Nếu không dùng Pivot mà Code em muốn so sánh giá trị hàng theo mã hàng giữa hai tháng 1&3 và đưa ra kết quả theo 3 tiêu thức tại vùng H19:K21 như File thì code sẽ như thế nào ạ. Em cảm ơn anh chị ạ.
Bạn xem thử file với code "Cùi bắp".
 

File đính kèm

Upvote 0
Bạn xem thử file với code "Cùi bắp".
Quá tuyệt vời với hai từ "Cùi bắp" đó ạ !!! Em còn một í thui ạ, với yêu cầu 2 và 3 ấy ạ, nó chỉ List ra các mã mà có tổng lớn hơn 200 thì thêm Code thế nào ạ. (Ví như G(87), H(225) thì nó chỉ list là H(225) vì G(87) < 200 ạ). Em cảm ơn Anh ạ !
 
Upvote 0
Bạn xem thử file với code "Cùi bắp".
Em cũng muốn học Code này của Bác Bate ạ. Nếu có thời gian nhờ bác chỉ rõ ý nghĩ của từng đoạn Code chính với ạ.

Public Sub sGpe()
Dim Arr1(), Arr2(), dArr(), tArr(), I As Long, J As Long, K As Long, R1 As Long, R2 As Long, Txt As String
Arr1 = Range("B2", Range("B10000").End(xlUp)).Resize(, 4).Value
R1 = UBound(Arr1)
Arr2 = Range("L2", Range("L10000").End(xlUp)).Resize(, 4).Value
R2 = UBound(Arr2)
ReDim tArr(1 To R1 + R2, 1 To 3)
With CreateObject("Scripting.Dictionary")

For I = 1 To R1
Txt = Arr1(I, 1)
If Not .Exists(Txt) Then
K = K + 1
.Item(Txt) = K
tArr(K, 1) = Txt
tArr(K, 2) = Arr1(I, 4)
Else
tArr(.Item(Txt), 2) = tArr(.Item(Txt), 2) + Arr1(I, 4)
End If
Next I



For I = 1 To R2
Txt = Arr2(I, 1)
If Not .Exists(Txt) Then
K = K + 1
.Item(Txt) = K
tArr(K, 1) = Txt
tArr(K, 3) = Arr2(I, 4)
Else
tArr(.Item(Txt), 3) = tArr(.Item(Txt), 3) + Arr2(I, 4)
End If
Next I
End With
R1 = K
ReDim dArr(1 To 3, 1 To 3)
For I = 1 To R1
If tArr(I, 2) > 0 And tArr(I, 3) > 0 Then
dArr(1, 1) = dArr(1, 1) + 1
dArr(1, 2) = dArr(1, 2) & tArr(I, 1) & ", "
dArr(1, 3) = dArr(1, 3) + tArr(I, 2) - tArr(I, 3)
ElseIf tArr(I, 2) > 0 And tArr(I, 3) = 0 Then
dArr(2, 1) = dArr(2, 1) + 1
dArr(2, 2) = dArr(2, 2) & tArr(I, 1) & "(" & tArr(I, 2) & "), "
dArr(2, 3) = dArr(2, 3) + tArr(I, 2)
ElseIf tArr(I, 2) = 0 And tArr(I, 3) > 0 Then
dArr(3, 1) = dArr(3, 1) + 1
dArr(3, 2) = dArr(3, 2) & tArr(I, 1) & "(" & tArr(I, 3) & "), "
dArr(3, 3) = dArr(3, 3) + tArr(I, 3)
End If
Next I
For I = 1 To 3
If Len(dArr(I, 2)) Then dArr(I, 2) = Left(dArr(I, 2), Len(dArr(I, 2)) - 2)
Next I
Range("H6").Resize(3, 3) = dArr
End Sub
 
Upvote 0
Kính gửi anh chị,
E có số liệu bán hàng của tháng 1 và 3. Nếu không dùng Pivot mà Code em muốn so sánh giá trị hàng theo mã hàng giữa hai tháng 1&3 và đưa ra kết quả theo 3 tiêu thức tại vùng H19:K21 như File thì code sẽ như thế nào ạ. Em cảm ơn anh chị ạ.
Mã:
Sub SoSanh()
  Dim sArr1(), sArr2(), tArr(), Res(1 To 3, 1 To 3), Dic As Object, iKey As String
  Dim i As Long, sRow1 As Long, sRow2 As Long, k As Long, ik As Long

  Set Dic = CreateObject("Scripting.Dictionary")
  sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 4).Value
  sArr2 = Range("L2", Range("L" & Rows.Count).End(xlUp)).Resize(, 4).Value
  sRow1 = UBound(sArr1): sRow2 = UBound(sArr2)
  ReDim tArr(1 To sRow1 + sRow2, 1 To 3)
  For i = 1 To sRow1
    iKey = sArr1(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 1) = tArr(ik, 1) + sArr1(i, 4)
  Next i
 
  For i = 1 To sRow2
    iKey = sArr2(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 2) = tArr(ik, 2) + sArr2(i, 4)
  Next i

  For i = 1 To k
    If Len(tArr(i, 1)) = 0 Then
      Res(3, 1) = Res(3, 1) + 1
      If tArr(i, 2) >= 200 Then
        Res(3, 2) = Res(3, 2) & "," & tArr(i, 3) & "(" & tArr(i, 2) & ")"
      End If
      Res(3, 3) = Res(3, 3) + tArr(i, 2)
    ElseIf Len(tArr(i, 2)) = 0 Then
      Res(2, 1) = Res(2, 1) + 1
      If tArr(i, 1) >= 200 Then
        Res(2, 2) = Res(2, 2) & "," & tArr(i, 3) & "(" & tArr(i, 1) & ")"
      End If
      Res(2, 3) = Res(2, 3) + tArr(i, 1)
    Else
      Res(1, 1) = Res(1, 1) + 1
      Res(1, 3) = Res(1, 3) + tArr(i, 1) - tArr(i, 2)
    End If
  Next i

  Res(2, 2) = Mid(Res(2, 2), 2, Len(Res(2, 2)))
  Res(3, 2) = Mid(Res(3, 2), 2, Len(Res(3, 2)))
  Range("I19").Resize(3, 3) = Res
End Sub
 
Upvote 0
Mã:
Sub SoSanh()
  Dim sArr1(), sArr2(), tArr(), Res(1 To 3, 1 To 3), Dic As Object, iKey As String
  Dim i As Long, sRow1 As Long, sRow2 As Long, k As Long, ik As Long

  Set Dic = CreateObject("Scripting.Dictionary")
  sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 4).Value
  sArr2 = Range("L2", Range("L" & Rows.Count).End(xlUp)).Resize(, 4).Value
  sRow1 = UBound(sArr1): sRow2 = UBound(sArr2)
  ReDim tArr(1 To sRow1 + sRow2, 1 To 3)
  For i = 1 To sRow1
    iKey = sArr1(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 1) = tArr(ik, 1) + sArr1(i, 4)
  Next i

  For i = 1 To sRow2
    iKey = sArr2(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 2) = tArr(ik, 2) + sArr2(i, 4)
  Next i

  For i = 1 To k
    If Len(tArr(i, 1)) = 0 Then
      Res(3, 1) = Res(3, 1) + 1
      If tArr(i, 2) >= 200 Then
        Res(3, 2) = Res(3, 2) & "," & tArr(i, 3) & "(" & tArr(i, 2) & ")"
      End If
      Res(3, 3) = Res(3, 3) + tArr(i, 2)
    ElseIf Len(tArr(i, 2)) = 0 Then
      Res(2, 1) = Res(2, 1) + 1
      If tArr(i, 1) >= 200 Then
        Res(2, 2) = Res(2, 2) & "," & tArr(i, 3) & "(" & tArr(i, 1) & ")"
      End If
      Res(2, 3) = Res(2, 3) + tArr(i, 1)
    Else
      Res(1, 1) = Res(1, 1) + 1
      Res(1, 3) = Res(1, 3) + tArr(i, 1) - tArr(i, 2)
    End If
  Next i

  Res(2, 2) = Mid(Res(2, 2), 2, Len(Res(2, 2)))
  Res(3, 2) = Mid(Res(3, 2), 2, Len(Res(3, 2)))
  Range("I19").Resize(3, 3) = Res
End Sub
Code rất hay ạ. Nhưng em muốn Anh bớt chút time diễn giải giúp em ý nghĩa một số đoạn code chính được không ạ. Em muốn học thêm cách làm này ạ (Em muốn biết ý nghĩa của cái sArr1(i, 4), Arr(i, 3), Res(3, 1)........vì sao lại lúc 3, lúc 4....em đọc ham quá mà không hiểu ạ :((). Mong anh chỉ giáo giúp em ạ !!! Em cảm ơn anh ạ.
 
Upvote 0
Code rất hay ạ. Nhưng em muốn Anh bớt chút time diễn giải giúp em ý nghĩa một số đoạn code chính được không ạ. Em muốn học thêm cách làm này ạ (Em muốn biết ý nghĩa của cái sArr1(i, 4), Arr(i, 3), Res(3, 1)........vì sao lại lúc 3, lúc 4....em đọc ham quá mà không hiểu ạ :((). Mong anh chỉ giáo giúp em ạ !!! Em cảm ơn anh ạ.
Nên học cơ bản từ đầu, VBA là gì, rồi Array trong VBA thì bạn sẽ hiểu, giờ thành viên khác có giải thích thì cũng chưa chắc đã hiểu, hay hiểu chưa chắc đã áp dụng chỗ khác.
 
Upvote 0
Upvote 0
Upvote 0
Code rất hay ạ. Nhưng em muốn Anh bớt chút time diễn giải giúp em ý nghĩa một số đoạn code chính được không ạ. Em muốn học thêm cách làm này ạ (Em muốn biết ý nghĩa của cái sArr1(i, 4), Arr(i, 3), Res(3, 1)........vì sao lại lúc 3, lúc 4....em đọc ham quá mà không hiểu ạ :((). Mong anh chỉ giáo giúp em ạ !!! Em cảm ơn anh ạ.
Bạn tìm lớp học VBA căn bản, hoặc đọc sách để nắm cơ bản
Trong file , mảng sArr1() là vùng dữ liệu tương ứng B2:E17, Res() tương ứng với I19:K21, là mảng 2 chiều
Cú pháp sArr(i,j) lấy giá trị tại dòng i và cột j của mảng sArr
Bạn xem minh họa trong file, các vấn đề khác phải học một số kiến thức căn bản mới có khả năng hiểu được
 

File đính kèm

Upvote 0
Bạn tìm lớp học VBA căn bản, hoặc đọc sách để nắm cơ bản
Trong file , mảng sArr1() là vùng dữ liệu tương ứng B2:E17, Res() tương ứng với I19:K21, là mảng 2 chiều
Cú pháp sArr(i,j) lấy giá trị tại dòng i và cột j của mảng sArr
Bạn xem minh họa trong file, các vấn đề khác phải học một số kiến thức căn bản mới có khả năng hiểu được
Em cảm ơn nhiều ạ !
 
Upvote 0
Bạn tìm lớp học VBA căn bản, hoặc đọc sách để nắm cơ bản
Trong file , mảng sArr1() là vùng dữ liệu tương ứng B2:E17, Res() tương ứng với I19:K21, là mảng 2 chiều
Cú pháp sArr(i,j) lấy giá trị tại dòng i và cột j của mảng sArr
Bạn xem minh họa trong file, các vấn đề khác phải học một số kiến thức căn bản mới có khả năng hiểu được
Dear Anh,
Để hiểu các số 2,3,1...em đã thay đổi lại ví trị các dòng và vị trí để xuất ra kết quả. Nhưng em thấy nó báo lỗi. A xem giúp em em sửa Code của anh sai chỗ nào ạ.
Em đang hiểu sơ là
+ sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 4).Value thì em sẽ thay 4 =1
+ Kích cỡ của vùng ra kết quả không thay đổi nên vẫn tối đa sẽ bằng 3 về kích cỡ
+ Thay đổi vị trí ô bắt đầu vùng xuất kết quả thành ô J6
 

File đính kèm

Upvote 0
Yếu quá, bạn xí dụ 1 đứa nhóc học 200 đô hoa kỳ / 1 buổi còn chưa được thì sức đâu mà vào chốn ấy học chứ
Cái "đứa nhóc" kia nó nói tiếng Việt.
Còn ở đây là dân Tây, xổ ra toàn đía đọt thánh thọt, chắc khi học sẽ được bụt gu gô phù hộ.
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Anh,
Để hiểu các số 2,3,1...em đã thay đổi lại ví trị các dòng và vị trí để xuất ra kết quả. Nhưng em thấy nó báo lỗi. A xem giúp em em sửa Code của anh sai chỗ nào ạ.
Em đang hiểu sơ là
+ sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 4).Value thì em sẽ thay 4 =1
+ Kích cỡ của vùng ra kết quả không thay đổi nên vẫn tối đa sẽ bằng 3 về kích cỡ
+ Thay đổi vị trí ô bắt đầu vùng xuất kết quả thành ô J6
Resize(, 4) là lấy 4 cột từ cột B, file cần lấy 2 cột
sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 2).Value
Lúc đó cột giá trị là cột thứ 2: sArr1(i, 2)
Mã:
Sub SoSanh()
  Dim sArr1(), sArr2(), tArr(), Res(1 To 3, 1 To 3), Dic As Object, iKey As String
  Dim i As Long, sRow1 As Long, sRow2 As Long, k As Long, ik As Long

  Set Dic = CreateObject("Scripting.Dictionary")
  sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 2).Value
  sArr2 = Range("F2", Range("F" & Rows.Count).End(xlUp)).Resize(, 2).Value
  sRow1 = UBound(sArr1): sRow2 = UBound(sArr2)
  ReDim tArr(1 To sRow1 + sRow2, 1 To 3)
  For i = 1 To sRow1
    iKey = sArr1(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 1) = tArr(ik, 1) + sArr1(i, 2)
  Next i
 
  For i = 1 To sRow2
    iKey = sArr2(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 2) = tArr(ik, 2) + sArr2(i, 2)
  Next i

  For i = 1 To k
    If Len(tArr(i, 1)) = 0 Then
      Res(3, 1) = Res(3, 1) + 1
      If tArr(i, 2) >= 200 Then
        Res(3, 2) = Res(3, 2) & "," & tArr(i, 3) & "(" & tArr(i, 2) & ")"
      End If
      Res(3, 3) = Res(3, 3) + tArr(i, 2)
    ElseIf Len(tArr(i, 2)) = 0 Then
      Res(2, 1) = Res(2, 1) + 1
      If tArr(i, 1) >= 200 Then
        Res(2, 2) = Res(2, 2) & "," & tArr(i, 3) & "(" & tArr(i, 1) & ")"
      End If
      Res(2, 3) = Res(2, 3) + tArr(i, 1)
    Else
      Res(1, 1) = Res(1, 1) + 1
      Res(1, 3) = Res(1, 3) + tArr(i, 1) - tArr(i, 2)
    End If
  Next i

  Res(2, 2) = Mid(Res(2, 2), 2, Len(Res(2, 2)))
  Res(3, 2) = Mid(Res(3, 2), 2, Len(Res(3, 2)))
  Range("j6").Resize(3, 3) = Res
End Sub
 
Upvote 0
Resize(, 4) là lấy 4 cột từ cột B, file cần lấy 2 cột
sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 2).Value
Lúc đó cột giá trị là cột thứ 2: sArr1(i, 2)
Mã:
Sub SoSanh()
  Dim sArr1(), sArr2(), tArr(), Res(1 To 3, 1 To 3), Dic As Object, iKey As String
  Dim i As Long, sRow1 As Long, sRow2 As Long, k As Long, ik As Long

  Set Dic = CreateObject("Scripting.Dictionary")
  sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 2).Value
  sArr2 = Range("F2", Range("F" & Rows.Count).End(xlUp)).Resize(, 2).Value
  sRow1 = UBound(sArr1): sRow2 = UBound(sArr2)
  ReDim tArr(1 To sRow1 + sRow2, 1 To 3)
  For i = 1 To sRow1
    iKey = sArr1(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 1) = tArr(ik, 1) + sArr1(i, 2)
  Next i

  For i = 1 To sRow2
    iKey = sArr2(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 2) = tArr(ik, 2) + sArr2(i, 2)
  Next i

  For i = 1 To k
    If Len(tArr(i, 1)) = 0 Then
      Res(3, 1) = Res(3, 1) + 1
      If tArr(i, 2) >= 200 Then
        Res(3, 2) = Res(3, 2) & "," & tArr(i, 3) & "(" & tArr(i, 2) & ")"
      End If
      Res(3, 3) = Res(3, 3) + tArr(i, 2)
    ElseIf Len(tArr(i, 2)) = 0 Then
      Res(2, 1) = Res(2, 1) + 1
      If tArr(i, 1) >= 200 Then
        Res(2, 2) = Res(2, 2) & "," & tArr(i, 3) & "(" & tArr(i, 1) & ")"
      End If
      Res(2, 3) = Res(2, 3) + tArr(i, 1)
    Else
      Res(1, 1) = Res(1, 1) + 1
      Res(1, 3) = Res(1, 3) + tArr(i, 1) - tArr(i, 2)
    End If
  Next i

  Res(2, 2) = Mid(Res(2, 2), 2, Len(Res(2, 2)))
  Res(3, 2) = Mid(Res(3, 2), 2, Len(Res(3, 2)))
  Range("j6").Resize(3, 3) = Res
End Sub
Em cảm ơn sự chỉ bảo tận tình của anh ạ !!!
 
Upvote 0
Resize(, 4) là lấy 4 cột từ cột B, file cần lấy 2 cột
sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 2).Value
Lúc đó cột giá trị là cột thứ 2: sArr1(i, 2)
Mã:
Sub SoSanh()
  Dim sArr1(), sArr2(), tArr(), Res(1 To 3, 1 To 3), Dic As Object, iKey As String
  Dim i As Long, sRow1 As Long, sRow2 As Long, k As Long, ik As Long

  Set Dic = CreateObject("Scripting.Dictionary")
  sArr1 = Range("B2", Range("B" & Rows.Count).End(xlUp)).Resize(, 2).Value
  sArr2 = Range("F2", Range("F" & Rows.Count).End(xlUp)).Resize(, 2).Value
  sRow1 = UBound(sArr1): sRow2 = UBound(sArr2)
  ReDim tArr(1 To sRow1 + sRow2, 1 To 3)
  For i = 1 To sRow1
    iKey = sArr1(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 1) = tArr(ik, 1) + sArr1(i, 2)
  Next i

  For i = 1 To sRow2
    iKey = sArr2(i, 1)
    If Not Dic.Exists(iKey) Then
      k = k + 1
      Dic.Add iKey, k
      tArr(k, 3) = iKey
    End If
    ik = Dic.Item(iKey)
    tArr(ik, 2) = tArr(ik, 2) + sArr2(i, 2)
  Next i

  For i = 1 To k
    If Len(tArr(i, 1)) = 0 Then
      Res(3, 1) = Res(3, 1) + 1
      If tArr(i, 2) >= 200 Then
        Res(3, 2) = Res(3, 2) & "," & tArr(i, 3) & "(" & tArr(i, 2) & ")"
      End If
      Res(3, 3) = Res(3, 3) + tArr(i, 2)
    ElseIf Len(tArr(i, 2)) = 0 Then
      Res(2, 1) = Res(2, 1) + 1
      If tArr(i, 1) >= 200 Then
        Res(2, 2) = Res(2, 2) & "," & tArr(i, 3) & "(" & tArr(i, 1) & ")"
      End If
      Res(2, 3) = Res(2, 3) + tArr(i, 1)
    Else
      Res(1, 1) = Res(1, 1) + 1
      Res(1, 3) = Res(1, 3) + tArr(i, 1) - tArr(i, 2)
    End If
  Next i

  Res(2, 2) = Mid(Res(2, 2), 2, Len(Res(2, 2)))
  Res(3, 2) = Mid(Res(3, 2), 2, Len(Res(3, 2)))
  Range("j6").Resize(3, 3) = Res
End Sub
Dear Anh,
Em làm phiền anh chút nữa vấn đề này với ạ. Tiếp theo mục đích trên, tại kết quả đưa ra tại K7 và K8 em muốn thêm yêu cầu:
(1) Các mã hàng đưa ra xếp theo thứ tự giá trị từ lớn đến bé ạ
(2) Sau đó, List ra tại I13 và J13 mã của 5 loại hàng có giá trị lớn nhất của từng tháng ạ.

Code sẽ thêm vào thế nào ạ. Em cảm ơn Anh ạ.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom