So sánh 2 bảng dữ liệu bằng ngôn ngữ VBA

Liên hệ QC

tdnhandno

Thành viên mới
Tham gia
10/3/16
Bài viết
47
Được thích
1
Chả là em có 2 danh sách muốn đối chiếu. Nếu khớp thì xuất khớp số liệu, ko khớp thì báo lỗi. Hàm excel thì e biết viết rồi ạ. Nhưng e muốn học hỏi xem viết bằng ngôn ngữ VBA thì như thế nào. Mong mọi người giúp e.
 

File đính kèm

  • Doi chieu giay nop tien.xls
    37.5 KB · Đọc: 25
Xin chào!
Bạn thử đoạn code này xem sao
Mã:
Sub Button1_Click()

For i = 5 To 30
    checkk = IIf(Range("A" & i) = Range("C" & i) And Range("B" & i) = Range("D" & i), "Khop", "Err")
    Range("F" & i) = checkk
Next

MsgBox "Ket thuc"
End Sub
 
Upvote 0
Chả là em có 2 danh sách muốn đối chiếu. Nếu khớp thì xuất khớp số liệu, ko khớp thì báo lỗi. Hàm excel thì e biết viết rồi ạ. Nhưng e muốn học hỏi xem viết bằng ngôn ngữ VBA thì như thế nào. Mong mọi người giúp e.
Bạn thử.
Mã:
Sub sosanh()
   Dim lr As Long, i As Long, arr, kq, dk As String, dks As String
   With Sheets("sheet1")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr < 5 Then Exit Sub
       arr = .Range("A5:D" & lr).Value2
       ReDim kq(1 To UBound(arr), 1 To 1)
       For i = 1 To UBound(arr)
           dk = arr(i, 1) & "#" & arr(i, 2)
           dks = arr(i, 3) & "#" & arr(i, 4)
           If dk = dks Then
              kq(i, 1) = "Kh" & ChrW(7899) & "p s" & ChrW(7889) & " li" & ChrW(7879) & "u"
           Else
              kq(i, 1) = "Error"
           End If
       Next i
       .Range("E5:E" & lr).Value = kq
   End With
End Sub
 
Upvote 0
Chả là em có 2 danh sách muốn đối chiếu. Nếu khớp thì xuất khớp số liệu, ko khớp thì báo lỗi. Hàm excel thì e biết viết rồi ạ. Nhưng e muốn học hỏi xem viết bằng ngôn ngữ VBA thì như thế nào. Mong mọi người giúp e.
Thử đoạn code này coi sao. Cũng tương đương code bài 5
Mã:
Sub Checking()
Dim sArr(), i As Long
sArr = Range("A5", [A65536].End(3)).Resize(, 5).Value
For i = 1 To UBound(sArr)
   If sArr(i, 1) = sArr(i, 3) Then
      If sArr(i, 2) = sArr(i, 4) Then
         sArr(i, 5) = "OK"
      Else
         sArr(i, 5) = "ERROR"
      End If
   Else
      sArr(i, 5) = "ERROR"
   End If
Next
[A5].Resize(i - 1, UBound(sArr, 2)) = sArr
End Sub
 
Upvote 0
Sao e nhấp vô nút Chạy đối chiếu thì nó lại báo lỗi "Cannot run the macro..." mọi người nhỉ. E lại phải chạy lại code từ đầu ạ. Mong mọi người giúp đỡ
 
Upvote 0
Thử đoạn code này coi sao. Cũng tương đương code bài 5
Mã:
Sub Checking()
Dim sArr(), i As Long
sArr = Range("A5", [A65536].End(3)).Resize(, 5).Value
For i = 1 To UBound(sArr)
   If sArr(i, 1) = sArr(i, 3) Then
      If sArr(i, 2) = sArr(i, 4) Then
         sArr(i, 5) = "OK"
      Else
         sArr(i, 5) = "ERROR"
      End If
   Else
      sArr(i, 5) = "ERROR"
   End If
Next
[A5].Resize(i - 1, UBound(sArr, 2)) = sArr
End Sub
Sao Hải không "gom" 2 cái sArr(I, 5)= "ERROR" thành 1.
PHP:
For i = 1 To UBound(sArr)
    sArr(i, 5) = "ERROR"
    If sArr(i, 1) = sArr(i, 3) Then
        If sArr(i, 2) = sArr(i, 4) Then
            sArr(i, 5) = "OK"
        End If
    End If
Next i
 
Upvote 0
Sao e nhấp vô nút Chạy đối chiếu thì nó lại báo lỗi "Cannot run the macro..." mọi người nhỉ. E lại phải chạy lại code từ đầu ạ. Mong mọi người giúp đỡ
E đã sửa được lỗi này rồi ạ. E cám ơn mọi người
Bài đã được tự động gộp:

Bạn thử.
Mã:
Sub sosanh()
   Dim lr As Long, i As Long, arr, kq, dk As String, dks As String
   With Sheets("sheet1")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr < 5 Then Exit Sub
       arr = .Range("A5:D" & lr).Value2
       ReDim kq(1 To UBound(arr), 1 To 1)
       For i = 1 To UBound(arr)
           dk = arr(i, 1) & "#" & arr(i, 2)
           dks = arr(i, 3) & "#" & arr(i, 4)
           If dk = dks Then
              kq(i, 1) = "Kh" & ChrW(7899) & "p s" & ChrW(7889) & " li" & ChrW(7879) & "u"
           Else
              kq(i, 1) = "Error"
           End If
       Next i
       .Range("E5:E" & lr).Value = kq
   End With
End Sub
E đã chạy thử code này và đã thành công ạ. E cám ơn a và mọi người rất nhiều
 
Upvote 0
Bạn thử.
Mã:
Sub sosanh()
   Dim lr As Long, i As Long, arr, kq, dk As String, dks As String
   With Sheets("sheet1")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr < 5 Then Exit Sub
       arr = .Range("A5:D" & lr).Value2
       ReDim kq(1 To UBound(arr), 1 To 1)
       For i = 1 To UBound(arr)
           dk = arr(i, 1) & "#" & arr(i, 2)
           dks = arr(i, 3) & "#" & arr(i, 4)
           If dk = dks Then
              kq(i, 1) = "Kh" & ChrW(7899) & "p s" & ChrW(7889) & " li" & ChrW(7879) & "u"
           Else
              kq(i, 1) = "Error"
           End If
       Next i
       .Range("E5:E" & lr).Value = kq
   End With
End Sub
Nếu e muốn so sánh A1 cùng B1 so với cả 2 cột C,D. Nếu có thì báo "khớp số liệu", sai báo "Error". Thì như thế nào vậy mấy a ơi.
 
Upvote 0
Code bài 5 chỉ so sánh theo hàng với nhau bạn ạ. Mình muốn so sánh hàng A,B so với cột C,D thỏa 2 điều kiện khớp nhau thì xuất đó bạn
Bài đã được tự động gộp:

Bài #7 đã có người hỏi sao bạn không trả lời ngay bài đó.
Dạ. Vì đọc xong bài 7. Sáng nay E mới nghĩ ra câu hỏi bạn đó rất hay a ạ
 
Upvote 0
Code bài 5 chỉ so sánh theo hàng với nhau bạn ạ. Mình muốn so sánh hàng A,B so với cột C,D thỏa 2 điều kiện khớp nhau thì xuất đó bạn
Bài đã được tự động gộp:


Dạ. Vì đọc xong bài 7. Sáng nay E mới nghĩ ra câu hỏi bạn đó rất hay a ạ
Xét từng dòng của cột A,B - Dò từng Dòng của cột C,D. Nếu trùng thì "OK"?
PHP:
Option Explicit

Public Sub sGpe()
Dim sArr(), dArr(), I As Long, J As Long, R As Long, Tmp As String
    sArr = Range("A5", Range("A60000").End(xlUp)).Resize(, 4).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 1)
For I = 1 To R
    dArr(I, 1) = "Error"
    Tmp = sArr(I, 1) & "#" & sArr(I, 2)
    For J = 1 To R
        If sArr(J, 3) & "#" & sArr(J, 4) = Tmp Then
            dArr(I, 1) = "OK"
            Exit For
        End If
    Next J
Next I
Range("E5").Resize(R) = dArr
End Sub
 
Upvote 0
Xét từng dòng của cột A,B - Dò từng Dòng của cột C,D. Nếu trùng thì "OK"?
PHP:
Option Explicit

Public Sub sGpe()
Dim sArr(), dArr(), I As Long, J As Long, R As Long, Tmp As String
    sArr = Range("A5", Range("A60000").End(xlUp)).Resize(, 4).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 1)
For I = 1 To R
    dArr(I, 1) = "Error"
    Tmp = sArr(I, 1) & "#" & sArr(I, 2)
    For J = 1 To R
        If sArr(J, 3) & "#" & sArr(J, 4) = Tmp Then
            dArr(I, 1) = "OK"
            Exit For
        End If
    Next J
Next I
Range("E5").Resize(R) = dArr
End Sub
Sao Ba Tê không dùng Dít- To, 2 vòng lặp chạy đúng số dòng của dữ liệu, viết thế này nó chạynhiều hơn hay sao í
Thân
 
Upvote 0
Sao Ba Tê không dùng Dít- To, 2 vòng lặp chạy đúng số dòng của dữ liệu, viết thế này nó chạynhiều hơn hay sao í
Thân
Dò trùng tôi đã nghĩ đến "Dit" rồi, nhưng thấy dữ liệu của bạn ấy chỉ có "mấy dòng". Xài cái "Dit Chà bá" sợ nhiều người "chịu hổng nỗi"
Hi hi...
 
Upvote 0
Dò trùng tôi đã nghĩ đến "Dit" rồi, nhưng thấy dữ liệu của bạn ấy chỉ có "mấy dòng". Xài cái "Dit Chà bá" sợ nhiều người "chịu hổng nỗi"
Hi hi...
Hình như với dữ liệu trong bài, với 25 dòng dữ liệu, code chạy hơn 400 lần ( hông bít phải hông nữa), nếu thêm vài chục dòng và thêm "cái xui" nữa code chạy hơi nhiều
Mà nhiều cũng có bao nhiêu đâu với lại máy nó chạy chứ hông phải mình chạy
Không sợ
Thân
 
Upvote 0
Web KT
Back
Top Bottom