So Sánh 2 mảng. Mong Anh/Chị giúp đỡ.

Liên hệ QC

alias1313

Thành viên hoạt động
Tham gia
7/4/17
Bài viết
163
Được thích
13
Em cần tổng hợp công của công nhân từ nhiều sheet khác nhau( 3 sheet).

Vì vậy em muốn có thể dùng mảng để so sánh tìm ra tên công nhân giống nhau từ 3 sheet rồi + số công lại.
( Em cũng không biết trường hợp này dùng mảng có đúng không )
Nhưng đến phần so sánh code báo lỗi do: Ubound(Arr3) = 0, em không biết tại sao.

Mong các Anh giúp đỡ, em cũng đang muốn tìm hiểu thêm về mảng.

Em cám ơn. Em có đình kèm theo file.

Mã:
Sub SOSANH()
Dim sheet As Worksheet
Dim rg1 As Range
Dim rg2 As Range
Dim Arr1() As Variant
Dim Arr2() As Variant
Dim Arr3() As Variant

Application.ScreenUpdating = False

Arr1 = Array(ActiveWorkbook.Sheets("Sheet1").Range("B4:B19"))

Arr2 = Array(ActiveWorkbook.Sheets("Sheet2").Range("C4:C22"))
Arr3 = Array(ActiveWorkbook.Sheets("Sheet3").Range("B3:B32"))
For j = 1 To UBound(Arr3)
If Arr1(j)= Arr3(j)  Then
ActiveWorkbook.Sheets("TINHCONG").Range("B7").Offset(i, 0).Value = Arr1(j)
Next i
End If
Next j
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Mang.xlsm
    17.9 KB · Đọc: 29
Trước tiên là nói về cấu trúc các trang:
Bạn hiện có 3 trang, mỗi trang dữ liệu gồm 02 cột;
Cái tên hiện thời là tiêu đề 2 cột này ở 2 trang khác nhau lại nằm ở các dòng khác nhau.
Chuyện này là bạn tự làm khó cho mình đấy thôi!

Vấn đề nữa trong CSDL ta có tên người (LĐ); Nhưng thường trong xử lí dữ liệu ta không thể xài ngay tới chuỗi họ & tên nữa, chứ nói gì đến tên;
Người ta xài mã duy nhất để CSDL sống đời ở kiếp với bạn; Nếu xài tên như bạn thì chả mấy chốc nó biến thành bãi rác mà thôi.

Trong các công việc tổng hợp công của tháng hay cả quí, năm, ta cần có danh sách toàn thể CNV kể từ đầu năm; Cho dù đã nghỉ làm trước tháng đang thống kê hay mới vô cơ quan.
Danh sách (DS) này bạn đang thiếu
DS này nhất thiết phải có các trường [STT], [Mã NV], [Họ Tên], & các trường khác liên quan đến chế độ, BHXH, thai sản, ốm đau, con ốm hay cho con bú,. . . .
Dò tổng công trong tháng hay các tháng sẽ fải thông qua DS chung này.

Vài í nhỏ góp í cùng bạn, những mong tẹo hữu ích nào đến với bạn & chúc vui!
 
Upvote 0
Ubound(Arr3) = 0, em không biết tại sao
"Arr3 = Array(ActiveWorkbook.Sheets("Sheet3").Range("B3:B32"))"
thì biến Arr3 là một biến mảng, mảng 1 chiều, có 1 phần tử.
Mặc khác Option Base 0 (mặc định).
Nên Ubound(Arr3) = 0 là đúng, chuẩn rồi. Không có lỗi gì cả.
 
Upvote 0
Trước tiên là nói về cấu trúc các trang:
Bạn hiện có 3 trang, mỗi trang dữ liệu gồm 02 cột;
Cái tên hiện thời là tiêu đề 2 cột này ở 2 trang khác nhau lại nằm ở các dòng khác nhau.
Chuyện này là bạn tự làm khó cho mình đấy thôi!

Vấn đề nữa trong CSDL ta có tên người (LĐ); Nhưng thường trong xử lí dữ liệu ta không thể xài ngay tới chuỗi họ & tên nữa, chứ nói gì đến tên;
Người ta xài mã duy nhất để CSDL sống đời ở kiếp với bạn; Nếu xài tên như bạn thì chả mấy chốc nó biến thành bãi rác mà thôi.

Trong các công việc tổng hợp công của tháng hay cả quí, năm, ta cần có danh sách toàn thể CNV kể từ đầu năm; Cho dù đã nghỉ làm trước tháng đang thống kê hay mới vô cơ quan.
Danh sách (DS) này bạn đang thiếu
DS này nhất thiết phải có các trường [STT], [Mã NV], [Họ Tên], & các trường khác liên quan đến chế độ, BHXH, thai sản, ốm đau, con ốm hay cho con bú,. . . .
Dò tổng công trong tháng hay các tháng sẽ fải thông qua DS chung này.

Vài í nhỏ góp í cùng bạn, những mong tẹo hữu ích nào đến với bạn & chúc vui!


Em cám ơn Anh! Góp ý của anh rất bổ ích, giúp em có cái nhìn bao quát hơn.
 
Upvote 0
"Arr3 = Array(ActiveWorkbook.Sheets("Sheet3").Range("B3:B32"))"
thì biến Arr3 là một biến mảng, mảng 1 chiều, có 1 phần tử.
Mặc khác Option Base 0 (mặc định).
Nên Ubound(Arr3) = 0 là đúng, chuẩn rồi. Không có lỗi gì cả.

Vậy trong trường hợp này em có thể dùng mảng để lọc không anh! Hay chỉ có 1 cách là dùng vòng lặp for để quét range.
Để so sánh cell trong 2 Range, thì cách tối ưu nhất là gì ạ!
Mong anh giúp đỡ.
 
Upvote 0
Arr3 = Array(ActiveWorkbook.Sheets("Sheet3").Range("B3:B32"))

Array (đỏ) là một hàm, trả về một mảng có phần tử là cái trong tham của nó (xanh). Dùng code trên thì biến Arr3 sẽ là một mảng 1 phần tử, phần tử ấy là cái range B3:B32

Bạn cần xem lại code trước đây ngừoi ta viết về mảng để thấy rõ cách thức chuyển trị trong range sang mảng như thế nào.

Nhưng đến phần so sánh code báo lỗi do: Ubound(Arr3) = 0, em không biết tại sao.

Phi lý. Nếu Ubound(Arr3) = 0 thì code trong vòng lặp For j = 1 To UBound(Arr3) không chạy. Phần so sánh đã khong chạy thì lấy gì báo lỗi?
 
Upvote 0
Em cần tổng hợp công của công nhân từ nhiều sheet khác nhau( 3 sheet).

Vì vậy em muốn có thể dùng mảng để so sánh tìm ra tên công nhân giống nhau từ 3 sheet rồi + số công lại.
( Em cũng không biết trường hợp này dùng mảng có đúng không )
Nhưng đến phần so sánh code báo lỗi do: Ubound(Arr3) = 0, em không biết tại sao.

Mong các Anh giúp đỡ, em cũng đang muốn tìm hiểu thêm về mảng.

Em cám ơn. Em có đình kèm theo file.

Mã:
Sub SOSANH()
Dim sheet As Worksheet
Dim rg1 As Range
Dim rg2 As Range
Dim Arr1() As Variant
Dim Arr2() As Variant
Dim Arr3() As Variant

Application.ScreenUpdating = False

Arr1 = Array(ActiveWorkbook.Sheets("Sheet1").Range("B4:B19"))

Arr2 = Array(ActiveWorkbook.Sheets("Sheet2").Range("C4:C22"))
Arr3 = Array(ActiveWorkbook.Sheets("Sheet3").Range("B3:B32"))
For j = 1 To UBound(Arr3)
If Arr1(j)= Arr3(j)  Then
ActiveWorkbook.Sheets("TINHCONG").Range("B7").Offset(i, 0).Value = Arr1(j)
Next i
End If
Next j
  Application.ScreenUpdating = True
End Sub
tạo mảng từ Range:
Arr3 = ActiveWorkbook.Sheets("Sheet3").Range("B3:B32").Value
 
Upvote 0
Array (đỏ) là một hàm, trả về một mảng có phần tử là cái trong tham của nó (xanh). Dùng code trên thì biến Arr3 sẽ là một mảng 1 phần tử, phần tử ấy là cái range B3:B32

Bạn cần xem lại code trước đây ngừoi ta viết về mảng để thấy rõ cách thức chuyển trị trong range sang mảng như thế nào.



Phi lý. Nếu Ubound(Arr3) = 0 thì code trong vòng lặp For j = 1 To UBound(Arr3) không chạy. Phần so sánh đã khong chạy thì lấy gì báo lỗi?

Em cũng không hiểu tại sao, cám ơn anh!
 
Upvote 0
tạo mảng từ Range:
Arr3 = ActiveWorkbook.Sheets("Sheet3").Range("B3:B32").Value
Hihi...em cám ơn anh @HieuCD .

Em đang tìm hiểu về mảng để viết code kiểm tra, so sánh dữ liệu: công làm việc trong tháng,
so sánh xem công sau khi cập nhật lên hệ thống có giống với bảng công chấm hàng ngày không( để tránh mất công của công nhân).
em có 2 Sheet: CONG1 và CONG2, trong đó có tên và hai cột chấm công ( V, V3(ca đêm))
Em tạo hai mảng: Arr1 ( dữ liệu sheet(CONG2), Arr2 (CONG1) sau đó:

- Sau đó em so sánh:
+ Nếu Nguyen van A có trong cả Arr1 và Arr2 --->( If (Arr1(i,1) = Arr2(i,2)) thì sẽ so sánh tiếp
2 cột công V và V3 nếu có 1 trong hai cột khác thì chép kết qua ra Sheet(CONG).
+ Nếu cả 2 cột V, V3 giá trị giống nhau thì ko cần làm gì.
- Nhưng em chạy ra kết quả không đúng , có ra tên nhưng V,V3 lại giống nhau.
Mong anh giúp em chỉ ra chỗ sai để em làm tiếp!

Mã:
Sub LOC() ' dang tinh
Dim sheet As Worksheet
Dim rg1 As Range
Dim rg2 As Range
Dim rg3 As Range
Dim Arr1()
Dim Arr2()
Dim Arr3()
Dim kq()
Dim kq2()

Dim i As Long, j As Long, k1 As Long, k2 As Long


'On Error Resume Next
Application.ScreenUpdating = False

Dim dict As Object
Set dict = CreateObject("Scripting.dictionary")
 
Arr1 = ThisWorkbook.Sheets("CONG2").Range("B7:DN100").Value
Arr2 = ThisWorkbook.Sheets("CONG1").Range("C13:AS190").Value

ReDim kq(1 To UBound(Arr1, 1), 1 To 4)
ReDim kq2(1 To UBound(Arr2, 1), 1 To 4)
With CreateObject("Scripting.dictionary")
For i = 1 To UBound(Arr1)
    If Not dict.exists(Arr1(i, 1)) Then
            k1 = k1 + 1
            dict.Add Arr1(i, 1), k1
         If Len(Arr1(i, 1)) > 0 Then ' bo cell rong
            kq(k1, 1) = Arr1(i, 1)
            kq(k1, 2) = Arr1(i, 2)
            kq(k1, 3) = Arr1(i, 100)
            kq(k1, 4) = Arr1(i, 101)
        
        End If

    End If
 
For j = 1 To UBound(Arr2)
    If Not dict.exists(Arr2(j, 1)) Then
            k2 = k2 + 1
            dict.Add Arr2(j, 1), k2
        If Len(Arr2(j, 1)) > 0 Then ' bo cell rong
 
            kq2(k2, 1) = Arr2(j, 1)
            kq2(k2, 3) = Arr2(j, 21)
            kq2(k2, 4) = Arr2(j, 22)
        End If
    End If



If (Arr1(i, 1) = Arr2(j, 1) And Len(Arr1(i, 1)) > 0) Then
    Debug.Print Arr1(i, 1)
    If (Arr1(i, 100) = Arr2(j, 21)) And _
        (Arr1(i, 101) = Arr2(j, 22)) Then
    Else
        kq(k1, 3) = Arr1(i, 100)
        kq(k1, 4) = Arr1(i, 101)
    
     End If

 
   End If

Next j
Next i
ThisWorkbook.Sheets("CONG").UsedRange.Clear
ThisWorkbook.Sheets("CONG").Range("B7").Resize(k1, 4).Value = kq

End With
MsgBox "ok"
Application.ScreenUpdating = True

End Sub
 

File đính kèm

  • cong.xls
    126.5 KB · Đọc: 14
Upvote 0
Hihi...em cám ơn anh @HieuCD .

Em đang tìm hiểu về mảng để viết code kiểm tra, so sánh dữ liệu: công làm việc trong tháng,
so sánh xem công sau khi cập nhật lên hệ thống có giống với bảng công chấm hàng ngày không( để tránh mất công của công nhân).
em có 2 Sheet: CONG1 và CONG2, trong đó có tên và hai cột chấm công ( V, V3(ca đêm))
Em tạo hai mảng: Arr1 ( dữ liệu sheet(CONG2), Arr2 (CONG1) sau đó:

- Sau đó em so sánh:
+ Nếu Nguyen van A có trong cả Arr1 và Arr2 --->( If (Arr1(i,1) = Arr2(i,2)) thì sẽ so sánh tiếp
2 cột công V và V3 nếu có 1 trong hai cột khác thì chép kết qua ra Sheet(CONG).
+ Nếu cả 2 cột V, V3 giá trị giống nhau thì ko cần làm gì.
- Nhưng em chạy ra kết quả không đúng , có ra tên nhưng V,V3 lại giống nhau.
Mong anh giúp em chỉ ra chỗ sai để em làm tiếp!

Mã:
Sub LOC() ' dang tinh
Dim sheet As Worksheet
Dim rg1 As Range
Dim rg2 As Range
Dim rg3 As Range
Dim Arr1()
Dim Arr2()
Dim Arr3()
Dim kq()
Dim kq2()

Dim i As Long, j As Long, k1 As Long, k2 As Long


'On Error Resume Next
Application.ScreenUpdating = False

Dim dict As Object
Set dict = CreateObject("Scripting.dictionary")
 
Arr1 = ThisWorkbook.Sheets("CONG2").Range("B7:DN100").Value
Arr2 = ThisWorkbook.Sheets("CONG1").Range("C13:AS190").Value

ReDim kq(1 To UBound(Arr1, 1), 1 To 4)
ReDim kq2(1 To UBound(Arr2, 1), 1 To 4)
With CreateObject("Scripting.dictionary")
For i = 1 To UBound(Arr1)
    If Not dict.exists(Arr1(i, 1)) Then
            k1 = k1 + 1
            dict.Add Arr1(i, 1), k1
         If Len(Arr1(i, 1)) > 0 Then ' bo cell rong
            kq(k1, 1) = Arr1(i, 1)
            kq(k1, 2) = Arr1(i, 2)
            kq(k1, 3) = Arr1(i, 100)
            kq(k1, 4) = Arr1(i, 101)
       
        End If

    End If
 
For j = 1 To UBound(Arr2)
    If Not dict.exists(Arr2(j, 1)) Then
            k2 = k2 + 1
            dict.Add Arr2(j, 1), k2
        If Len(Arr2(j, 1)) > 0 Then ' bo cell rong
 
            kq2(k2, 1) = Arr2(j, 1)
            kq2(k2, 3) = Arr2(j, 21)
            kq2(k2, 4) = Arr2(j, 22)
        End If
    End If



If (Arr1(i, 1) = Arr2(j, 1) And Len(Arr1(i, 1)) > 0) Then
    Debug.Print Arr1(i, 1)
    If (Arr1(i, 100) = Arr2(j, 21)) And _
        (Arr1(i, 101) = Arr2(j, 22)) Then
    Else
        kq(k1, 3) = Arr1(i, 100)
        kq(k1, 4) = Arr1(i, 101)
   
     End If

 
   End If

Next j
Next i
ThisWorkbook.Sheets("CONG").UsedRange.Clear
ThisWorkbook.Sheets("CONG").Range("B7").Resize(k1, 4).Value = kq

End With
MsgBox "ok"
Application.ScreenUpdating = True

End Sub
Sửa code hơi khó, viết mới dể hơn
Ở mỗi sheet tên trùng nhau làm sao biết để so sánh đúng dòng?
 
Upvote 0
Sao không thấy mã duy nhất ứng với mỗi người. Không có mã này không dám làm gì tiếp.
+ Nếu Nguyen van A có trong cả Arr1 và Arr2 thì sẽ so sánh tiếp
2 cột công V và V3 nếu có 1 trong hai cột khác thì chép kết qua ra
Có ở một trong hai cột khác là thế nào bạn? Không hiểu.
Giá trị ở 2 cột đó tương ứng khác nhau hả?

Cho vài kết quả làm bằng mắt và tay vào file xem...
 
Upvote 0
Sao không thấy mã duy nhất ứng với mỗi người. Không có mã này không dám làm gì tiếp.

Có ở một trong hai cột khác là thế nào bạn? Không hiểu.
Giá trị ở 2 cột đó tương ứng khác nhau hả?

Cho vài kết quả làm bằng mắt và tay vào file xem...

Em có 2 bảng chấm công( 1 cái chấm bằng tay, 1 cái chấm bằng máy) tổng hợp 1 tháng/1 lần.
Em cần kiểm tra xem 2 bảng công này có khớp nhau không, bằng cách kiểm tra giá trị ở 2 ô V(công ca ngày), V3(công ca đêm).
Em ví dụ: ------------------------------- Bảng công 1-------------------------------- Bảng công 2
Họ và tên------------------------- --- V---- ---------- V3----------------- -- ---------V ---------- V3
Nguyen van A ------------------------13 ---- --------- 10 -------------------------- -13---------------10 ===> Anh này công chấm đúng, không cần làm gì

Nguyen van B -----------------------13---------------- 9 -----------------------------13 --------------- 10 =====> Anh này chấm sai, 2 bảng công không khớp nhau ( giá trị V3 khác nhau) ===> lọc ra sheet mới)

Trần van C ------------------ ---------9 ------------------ 9 ----------------------- ---11 --------------- 11 =====> Anh này chấm sai, 2 bảng công không khớp nhau ===> lọc ra sheet mới)


Cám ơn anh!
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã sửa lại! Cám ơn anh @HieuCD
Tạo kết quả 6 cột
Mã:
Sub LOC() ' dang tinh
Dim NV1(), Cong1(), NV2(), Cong2(), kq()
Dim i As Long, j As Long, k As Long, ik As Long
Application.ScreenUpdating = False

Dim dic As Object, key as string
Set dic = CreateObject("Scripting.dictionary")
  
NV1 = ThisWorkbook.Sheets("CONG1").Range("C13:C190").Value
Cong1 = ThisWorkbook.Sheets("CONG1").Range("W13:X190").Value

NV2 = ThisWorkbook.Sheets("CONG2").Range("B7:C100").Value
Cong2 = ThisWorkbook.Sheets("CONG2").Range("CW7:CX100").Value

ReDim kq(1 To UBound(NV1, 1) + UBound(NV2, 1), 1 To 6)

For i = 1 To UBound(NV2)
  Key = NV2(i, 1)
  If Len(Key) > 0 Then  ' bo cell rong
    If Not dic.exists(Key) Then
      dic.Add Key, i
    End If
  End If
Next i

For i = 1 To UBound(NV1)
  Key = NV1(i, 1)
  If Len(Key) > 0 Then  ' bo cell rong
    If Not dic.exists(Key) Then
      dic.Add Key, 0
      k = k + 1
      kq(k, 1) = Key
      kq(k, 3) = Cong1(i, 1)
      kq(k, 4) = Cong1(i, 2)
    Else
      ik = dic.Item(Key)
      If ik > 0 Then
        If Cong2(ik, 1) <> Cong1(i, 1) Or Cong2(ik, 2) <> Cong1(i, 2) Then
          k = k + 1
          kq(k, 1) = NV2(ik, 1)
          kq(k, 2) = NV2(ik, 2)
          kq(k, 3) = Cong1(i, 1)
          kq(k, 4) = Cong1(i, 2)
          kq(k, 5) = Cong2(ik, 1)
          kq(k, 6) = Cong2(ik, 2)
        End If
      End If
    End If
  End If
Next i

ThisWorkbook.Sheets("CONG").UsedRange.Clear
ThisWorkbook.Sheets("CONG").Range("B7").Resize(k, 6).Value = kq

MsgBox "ok"
Application.ScreenUpdating = True

End Sub
 
Upvote 0
Tạo kết quả 6 cột
Mã:
Sub LOC() ' dang tinh
Dim NV1(), Cong1(), NV2(), Cong2(), kq()
Dim i As Long, j As Long, k As Long, ik As Long
Application.ScreenUpdating = False

Dim dic As Object, key as string
Set dic = CreateObject("Scripting.dictionary")
 
NV1 = ThisWorkbook.Sheets("CONG1").Range("C13:C190").Value
Cong1 = ThisWorkbook.Sheets("CONG1").Range("W13:X190").Value

NV2 = ThisWorkbook.Sheets("CONG2").Range("B7:C100").Value
Cong2 = ThisWorkbook.Sheets("CONG2").Range("CW7:CX100").Value

ReDim kq(1 To UBound(NV1, 1) + UBound(NV2, 1), 1 To 6)

For i = 1 To UBound(NV2)
  Key = NV2(i, 1)
  If Len(Key) > 0 Then  ' bo cell rong
    If Not dic.exists(Key) Then
      dic.Add Key, i
    End If
  End If
Next i

For i = 1 To UBound(NV1)
  Key = NV1(i, 1)
  If Len(Key) > 0 Then  ' bo cell rong
    If Not dic.exists(Key) Then
      dic.Add Key, 0
      k = k + 1
      kq(k, 1) = Key
      kq(k, 3) = Cong1(i, 1)
      kq(k, 4) = Cong1(i, 2)
    Else
      ik = dic.Item(Key)
      If ik > 0 Then
        If Cong2(ik, 1) <> Cong1(i, 1) Or Cong2(ik, 2) <> Cong1(i, 2) Then
          k = k + 1
          kq(k, 1) = NV2(ik, 1)
          kq(k, 2) = NV2(ik, 2)
          kq(k, 3) = Cong1(i, 1)
          kq(k, 4) = Cong1(i, 2)
          kq(k, 5) = Cong2(ik, 1)
          kq(k, 6) = Cong2(ik, 2)
        End If
      End If
    End If
  End If
Next i

ThisWorkbook.Sheets("CONG").UsedRange.Clear
ThisWorkbook.Sheets("CONG").Range("B7").Resize(k, 6).Value = kq

MsgBox "ok"
Application.ScreenUpdating = True

End Sub


Code chạy chính xác và rất nhanh anh ơi. Em cám ơn anh @HieuCD rất nhiều.
Cám ơn các anh đã giúp đỡ!
Chúc các anh một ngày mới mạnh khỏe và vui vẻ! ^_^...
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Sub LOC() ' dang tinh
Dim NV1(), Cong1(), NV2(), Cong2(), kq()
Dim i As Long, j As Long, k As Long, ik As Long
Application.ScreenUpdating = False

Dim dic As Object, key As String
Set dic = CreateObject("Scripting.dictionary")
 
NV1 = ThisWorkbook.Sheets("CONG1").Range("C13:C175").Value
Cong1 = ThisWorkbook.Sheets("CONG1").Range("W13:X190").Value

NV2 = ThisWorkbook.Sheets("CONG2").Range("B7:C100").Value
Cong2 = ThisWorkbook.Sheets("CONG2").Range("CW7:CX100").Value

ReDim kq(1 To UBound(NV1, 1) + UBound(NV2, 1), 1 To 6)
' Kiem tra gán keys vào dic
For i = 1 To UBound(NV2)
  key = NV2(i, 1)
  If Len(key) > 0 Then                                                  ' bo cell rong
    If Not dic.exists(key) Then
      dic.Add key, i                                                                ' gán key, item chua có vào dic
    End If
  End If
Next i
'===================================

For i = 1 To UBound(NV1)
   key = NV1(i, 1)                                                                 ' gan keys cho NV1
  If Len(key) > 0 Then
    If Not dic.exists(key) Then                                            ' kiem tra xem keys da co trong dic chua?
      dic.Add key, 0                                                                     ' gan keys, items neu trong dic chua co
      k = k + 1
      kq(k, 1) = key
      kq(k, 3) = Cong1(i, 1)
      kq(k, 4) = Cong1(i, 2)
    Else
      ik = dic.Item(key)                                               ' neu trong dic co key roi, lay item cua key do. ( item nay cua NV2, vi key gan vao dic la key cua NV2)
      If ik > 0 Then                                                       ' Kiem tra xem co item k, neu co thi chay tiep, ko co thi end if
        If Cong2(ik, 1) <> Cong1(i, 1) Or Cong2(ik, 2) <> Cong1(i, 2) Then     ' so sanh công, bang cach so sanh items tuong ung cua NV2 va NV1
          k = k + 1                                                       ' moi gia tri cua k la 1 dong cua vung ket qua,xac dinh dong nay  de gán ket qua tim duoc(thoa DK) vao _
                                                                                  khong quan trong thu tu truoc sau, chi la xac dinh vung de chua ket qua
                                
          kq(k, 1) = NV2(ik, 1)   ' ten NV2
          kq(k, 2) = NV2(ik, 2)   ' Cot 2 cua arry NV2
          kq(k, 3) = Cong1(i, 1)  ' công V NV1
          kq(k, 4) = Cong1(i, 2)   ' Công V3 NV1
          kq(k, 5) = Cong2(ik, 1)  ' Công V NV2
          kq(k, 6) = Cong2(ik, 2)   'Công V3 NV2
      
          End If
        End If
      End If
    End If
 
Next i


ThisWorkbook.Sheets("CONG").UsedRange.Clear                                          ' xóa Sheet("CONG") truoc khi add ket qua
ThisWorkbook.Sheets("CONG").Range("B7").Resize(k, 6).Value = kq     ' Resize vung = voi vung kq, de gán kq

MsgBox "ok"
Application.ScreenUpdating = True

End Sub



Em dịch code theo sự hiểu của mình, anh xem giúp em vậy đã hiểu đúng chưa nha anh!
Em thấy code này độc đáo nhất ở chỗ:
Mã:
For i = 1 To UBound(NV1)
   key = NV1(i, 1)
lấy tên key của NV2 đặt cho NV1.
giá trị của '"ik" nằm trong vòng for của NV1, nhưng dùng để xác định NV2, CONG2 ==> vì keys, items trong dic là key của NV2.
Khi so sánh để tìm tên trùng nhau của NV1 và NV2, em phải dùng hàm If để so sánh(rất phức tạp),
anh lại so sánh bằng cách kiểm tra xem NV1 có trong dic chưa ==> chỗ này quả thật vi diệu, thể hiện rõ cái hay của dic và người áp dụng.
Đọc xong code của anh em hiểu ra 1 điều trong lập trình ngoài đi theo cấu trúc căn bản của câu lệnh, ta còn phải áp dụng nó bằng tư duy logic của bản thân để sử dụng hết cái hay của nó.

Cám ơn các anh vì sự giúp đỡ, cám ơn vì sự tận tâm!
 
Upvote 0
Web KT
Back
Top Bottom