Giúp về code so sánh giữa 2 dữ liệu có sẵn (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

themorzer

Thành viên chính thức
Tham gia
24/5/13
Bài viết
95
Được thích
1
Mình cần giúp đỡ về code so sánh dữ liệu giữa 2 vùng NEW và OLD, đưa ra vùng Compare
1530069809907.png
+ Nếu vùng New và OLD bằng nhau thì không thay đổi
+ Nếu vùng New và OLD khác nhau thì Cột Change sẽ là giá trị cột Qty của vùng OLD và Cột Qty sẽ là giá trị cột Qty của vùng NEW
+ Nếu vùng OLD có tồn tại giá trị nhưng vùng NEW không có thì, cột Qty để trống, cột Change là giá trị của vùng OLD
+ Nếu vùng NEW có tồn tại giá trị nhưng vùng OLD không có thì, cột Qty để giá trị vùng OLD, cột Change để trống
 

File đính kèm

[Help] Giúp về code so sánh giữa 2 dữ liệu có sẵn
Bạn sửa tiêu đề, bỏ [Help] (vì không hiểu), tôi sẽ viết cho bạn 1 Sub giải quyết chuyện này.
PHP:
Public Sub GPE()
Dim sArr(), I As Long, Rws As Long, Tem As String
With CreateObject("Scripting.Dictionary")
    '--------------------------------------Bang so sanh'
    sArr = Range("A5", Range("A5").End(xlDown)).Resize(, 3).Value
    Rws = UBound(sArr)
    ReDim dArr(1 To Rws, 1 To 2)
    For I = 1 To Rws
        .Item(sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)) = I
    Next I
    '--------------------------------------Bang New'
    sArr = Range("G5", Range("G5").End(xlDown)).Resize(, 6).Value
    For I = 1 To UBound(sArr)
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)
        If .Exists(Tem) Then
            dArr(.Item(Tem), 2) = sArr(I, 6)
        End If
    Next I
    '--------------------------------------Bang Old'
    sArr = Range("M5", Range("M5").End(xlDown)).Resize(, 6).Value
    For I = 1 To UBound(sArr)
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)
        If .Exists(Tem) Then
            If sArr(I, 6) <> dArr(.Item(Tem), 2) Then dArr(.Item(Tem), 1) = sArr(I, 6)
        End If
    Next I
End With
Range("E5").Resize(Rws, 2) = dArr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Giúp về code so sánh giữa 2 dữ liệu có sẵn

Đã gởi lại Sub ở bài trên.

xin lỗi mình chưa đưa rõ ra, mình cần so sánh như hình,
1530079909099.png
khi bấm vào nút start thì kết quả là hình mình đã đăng lên ở trên
dựa theo vùng OLD để lấy dữ liệu cột Part code, Maker, Size, Unit
 
Upvote 0
xin lỗi mình chưa đưa rõ ra, mình cần so sánh như hình,
View attachment 198285
khi bấm vào nút start thì kết quả là hình mình đã đăng lên ở trên
dựa theo vùng OLD để lấy dữ liệu cột Part code, Maker, Size, Unit
Khỏi cần so sánh làm gì cho mất công.
Vì nhìn bằng mắt thường thì Part code và Maker của vùng OLD và vùng NEW không giống nhau rồi thì làm sao mà so.
 
Upvote 0
bạn nhìn sao ma k giống, cần làm bảng so sanh để biết cái nào thay đổi
Nhìn hình thì sẽ biết, muốn tra thì Part code và Maker nó phải là duy nhất, nằm 1 đống vầy thi tra kiểu gì cho chính xác. Còn không thì phải giải thích cho rõ ràng đâu phải ai cũng trong nghề đâu mà nhìn sơ là hiểu liền.

A_Tra.JPG
 
Upvote 0
xin lỗi mình chưa đưa rõ ra, mình cần so sánh như hình,
View attachment 198285
khi bấm vào nút start thì kết quả là hình mình đã đăng lên ở trên
dựa theo vùng OLD để lấy dữ liệu cột Part code, Maker, Size, Unit
Thay Sub cũ thành cái này:
PHP:
Public Sub GPE()
Dim sArr(), dArr(1 To 1000, 1 To 6), I As Long, J As Long, K As Long, R As Long, Tem As String
With CreateObject("Scripting.Dictionary")
    '--------------------------------------Bang Old'
    sArr = Range("M5", Range("M5").End(xlDown)).Resize(, 6).Value
    For I = 1 To UBound(sArr)
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)
        .Item(Tem) = I
        K = K + 1
        For J = 1 To 4
            dArr(K, J) = sArr(I, J)
        Next J
        dArr(K, 5) = sArr(I, 6)
    Next I
    '--------------------------------------Bang New'
    sArr = Range("G5", Range("G5").End(xlDown)).Resize(, 6).Value
    For I = 1 To UBound(sArr)
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)
        If .Exists(Tem) Then
            R = .Item(Tem)
            dArr(R, 6) = sArr(I, 6)
            If dArr(R, 5) = dArr(R, 6) Then dArr(R, 5) = Empty
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
            dArr(K, 6) = sArr(I, 6)
        End If
    Next I
End With
Range("A5").Resize(K, 6) = dArr
End Sub
 

File đính kèm

Upvote 0
Thay Sub cũ thành cái này:
PHP:
Public Sub GPE()
Dim sArr(), dArr(1 To 1000, 1 To 6), I As Long, J As Long, K As Long, R As Long, Tem As String
With CreateObject("Scripting.Dictionary")
    '--------------------------------------Bang Old'
    sArr = Range("M5", Range("M5").End(xlDown)).Resize(, 6).Value
    For I = 1 To UBound(sArr)
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)
        .Item(Tem) = I
        K = K + 1
        For J = 1 To 4
            dArr(K, J) = sArr(I, J)
        Next J
        dArr(K, 5) = sArr(I, 6)
    Next I
    '--------------------------------------Bang New'
    sArr = Range("G5", Range("G5").End(xlDown)).Resize(, 6).Value
    For I = 1 To UBound(sArr)
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)
        If .Exists(Tem) Then
            R = .Item(Tem)
            dArr(R, 6) = sArr(I, 6)
            If dArr(R, 5) = dArr(R, 6) Then dArr(R, 5) = Empty
        Else
            K = K + 1
            For J = 1 To 4
                dArr(K, J) = sArr(I, J)
            Next J
            dArr(K, 6) = sArr(I, 6)
        End If
    Next I
End With
Range("A5").Resize(K, 6) = dArr
End Sub
cam on ban, minh lam dc roi
nhưng nếu mình muốn sort vùng Comparate thì add code vô chỗ nào
 
Upvote 0
cam on ban, minh lam dc roi
nhưng nếu mình muốn sort vùng Comparate thì add code vô chỗ nào
Viết tiếng Việt không dấu đầy đủ, viết tắt là phạm quy. (Vì ai đọc hiểu sao cũng được)
- Tôi hoàn thành công việc theo lời hứa bài #2.
- Comparate là vùng nào "biết chết liền". Bạn cứ Record Macro để anh Bill giúp bạn 1 Sub, chạy chung với Sub GPE
 
Lần chỉnh sửa cuối:
Upvote 0
- Tôi hoàn thành công việc theo lời hứa bài $2.
- Comparate là vùng nào "biết chết liền". Bạn cứ Record Macro để anh Bill giúp bạn 1 Sub, chạy chung với Sub GPE
- Tôi hoàn thành công việc theo lời hứa bài $2.
- Comparate là vùng nào "biết chết liền". Bạn cứ Record Macro để anh Bill giúp bạn 1 Sub, chạy chung với Sub GPE
xin lỗi Comparate -> Compration
cám ơn bạn, nhưng còn phần chữ in nghiên và tô màu đỏ như hình đầu, thì mình thêm ngay trên mảng hay phải làm riêng
cụ thể là nếu vùng New có mà vùng OLD không có thì vùng Compration sẽ tô đỏ in nghiên giá trị đó
 
Lần chỉnh sửa cuối:
Upvote 0
cám ơn bạn, nhưng còn phần chữ in nghiên và tô màu đỏ như hình đầu, thì mình thêm ngay trên mảng hay phải làm riêng
cụ thể là nếu vùng New có mà vùng OLD không có thì vùng Compration sẽ tô đỏ in nghiên giá trị đó
Khuyên bạn không nên "màu mè" quá trong sheet sẽ làm nặng file, nhìn hoa mắt thôi.
In nghiêng và thẳng đứng thì có gì dễ phân biệt?
Tôi thêm cho bạn những dòng chỉ có New mà không có Old thì font chữ màu đỏ.
Các ý muốn còn lại bạn có thể dùng Conditional Formatting để làm.
Cột E từ E5 xuống bạn format trước nó có gạch ngang hàng chữ.
 

File đính kèm

Upvote 0
Khuyên bạn không nên "màu mè" quá trong sheet sẽ làm nặng file, nhìn hoa mắt thôi.
In nghiêng và thẳng đứng thì có gì dễ phân biệt?
Tôi thêm cho bạn những dòng chỉ có New mà không có Old thì font chữ màu đỏ.
Các ý muốn còn lại bạn có thể dùng Conditional Formatting để làm.
Cột E từ E5 xuống bạn format trước nó có gạch ngang hàng chữ.
thanks bạn, minh đa lam dc
 
Upvote 0
Mình cần giúp đỡ về code so sánh dữ liệu giữa 2 vùng NEW và OLD, đưa ra vùng Compare
View attachment 198260
+ Nếu vùng New và OLD bằng nhau thì không thay đổi
+ Nếu vùng New và OLD khác nhau thì Cột Change sẽ là giá trị cột Qty của vùng OLD và Cột Qty sẽ là giá trị cột Qty của vùng NEW
+ Nếu vùng OLD có tồn tại giá trị nhưng vùng NEW không có thì, cột Qty để trống, cột Change là giá trị của vùng OLD
+ Nếu vùng NEW có tồn tại giá trị nhưng vùng OLD không có thì, cột Qty để giá trị vùng OLD, cột Change để trống
Chạy thử code
Mã:
Sub Compare()
  Dim sArr As Variant, dArr As Variant, Res(), Rng As Range, Rng2 As Range
  Dim i As Long, k As Long, ik, j As Byte, iKey
 
  Call ClearCompare
  With Sheets("W2")
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 4 Then sArr = .Range("G5:L" & i).Value: k = UBound(sArr)
    i = .Range("M" & Rows.Count).End(xlUp).Row
    If i > 4 Then dArr = .Range("M5:R" & i).Value: k = k + UBound(dArr)
  End With
  If k = 0 Then Exit Sub
  ReDim Res(1 To k, 1 To 6)
  k = 0
  With CreateObject("scripting.dictionary")
    If IsArray(sArr) Then
      For i = 1 To UBound(sArr)
        iKey = sArr(i, 1) & "#" & sArr(i, 2) & "#" & sArr(i, 3)
        If Len(iKey) > 2 Then
          k = k + 1
          .Item(iKey) = k
          For j = 1 To 6
            If j <> 5 Then Res(k, j) = sArr(i, j)
          Next j
        End If
      Next i
    End If
    
    If IsArray(dArr) Then
      For i = 1 To UBound(dArr)
        iKey = dArr(i, 1) & "#" & dArr(i, 2) & "#" & dArr(i, 3)
        If .exists(iKey) Then
          ik = .Item(iKey)
          If dArr(i, 6) <> Res(ik, 6) Then Res(ik, 5) = dArr(i, 6)
          .Remove (iKey)
        Else
          k = k + 1
          For j = 1 To 4
            Res(k, j) = dArr(i, j)
          Next j
          Res(k, 5) = dArr(i, 6)
        End If
      Next i
      If .Count > 0 Then
        For Each ik In .items
          Res(ik, 5) = "a"
        Next
      End If
    End If
  End With
 
  With Sheets("W2")
    .Range("A5:F5").Resize(k) = Res
    ik = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A4:F" & ik).Sort .[A4], 1, .[B4], , 1, .[C4], , 1, Header:=xlYes
    
    If IsArray(dArr) Then
      For i = 5 To ik
        iKey = .Range("E" & i)
        If Len(iKey) Then
          If iKey = "a" Then
            .Range("E" & i).ClearContents
            Set Rng2 = .Range("A" & i).Resize(, 6)
          Else
            Set Rng2 = .Range("F" & i)
          End If
          If Rng Is Nothing Then Set Rng = Rng2 Else Set Rng = Union(Rng, Rng2)
          If Rng.Count > 30 Then
            Rng.Range("F7").Font.Color = -16776961
            Rng.Range("F7").Font.FontStyle = "Italic"
            Set Rng = Nothing
          End If
        End If
      Next i
      If Not Rng Is Nothing Then
        Rng.Font.Color = -16776961
        Rng.Font.FontStyle = "Italic"
      End If
      Set Rng = Nothing: Set Rng2 = Nothing
    
      With .Range("E5:E" & ik)
        .Font.Color = -16776961
        .Font.FontStyle = "Italic"
        .Font.Strikethrough = True
      End With
    Else
      With .Range("A5:F" & ik)
        .Font.Color = -16776961
        .Font.FontStyle = "Italic"
      End With
    End If
  End With
End Sub

Sub ClearCompare()
  Dim i As Long
  With Sheets("W2")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i > 4 Then
      With .Range("A5:F" & i)
        .ClearContents
        .Font.Italic = False
        .Font.ColorIndex = xlAutomatic
      End With
    End If
  End With
End Sub
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom