viết code cho công thức tại cột E,F,G

Liên hệ QC

kimthoa89

Thành viên thường trực
Tham gia
3/11/17
Bài viết
219
Được thích
17
Giới tính
Nữ
Thân gửi anh chị !
Nhờ anh chị viết code giúp em vì dữ liệu nặng quá, hiện tại em đang để công thức ở cột E,F, G
Công thức cột E : =IF(H2=0,I2,H2)
Công thức cột F : =IF(WEEKDAY(B2)=1,IF(OR(I2>0,J2>0),"CN1","CN"),IF(AND(E2>0,E2<=480),1,E2))
Công thức cột G : =COUNTIF(C:C,C2)
Em cảm ơn anh chị !
 

File đính kèm

  • Check - cong.xlsx
    2.5 MB · Đọc: 13
Thân gửi anh chị !
Nhờ anh chị viết code giúp em vì dữ liệu nặng quá, hiện tại em đang để công thức ở cột E,F, G
Công thức cột E : =IF(H2=0,I2,H2)
Công thức cột F : =IF(WEEKDAY(B2)=1,IF(OR(I2>0,J2>0),"CN1","CN"),IF(AND(E2>0,E2<=480),1,E2))
Công thức cột G : =COUNTIF(C:C,C2)
Em cảm ơn anh chị !
Bạn thử xem.Kết quả đang để ở A12
 

File đính kèm

  • Check - cong.xlsm
    2.5 MB · Đọc: 11
Upvote 0
Cảm ơn anh chị đã giúp đỡ, nhưng em chỉ muốn đếm những người có trong ds đó 1 lần thôi ạ
Bạn đếm ở cột nào? cột C hay cột D? Chẳng phải là trong đề bài bạn đếm ở cột C rồi à:
"Công thức cột G : =COUNTIF(C:C,C2)"
Tôi không hiểu ý bạn và cũng không biết mục đích của bạn khi sử dụng Công thức ở cột G là gì?
Code trong file đính kèm trả lại cho bạn tôi nói là Kết quả đang để ở A12 là có ý bạn chạy code và so sánh với dữ liệu gốc của bạn.
Nếu bạn sử dụng code này (với dữ liệu lớn hàng ngàn, chục, trăm ngàn bản ghi ) thì chỉ cần bạn thay dòng Sh.Range("A12").Resize(R, C) = KQ thành Sh.Range("A2").Resize(R, C) = KQ và thêm 1 button gán cái macro Sub THAYCONGTHUC ấy vào và nhấn nút là đã có kết quả (nhanh chậm phụ thuộc vào số lượng bản ghi)
Mà cũng không hiểu là bạn chê gì ngài Bill Gate hay là ngài đó làm phật ý bạn như thế nào mà bạn lại không sử dụng hàm có sẵn của MS Ex (trừ trường hợp dữ liệu của bạn lớn(như đã nói ở trên) và trong workbook bạn sử dụng công thức linhk, tham chiếu đến nhiều ô, nhiều sheet- đây là lý do để sử dụng VBA thay hàm có sẵn)
 
Upvote 0
Mà cũng không hiểu là bạn chê gì ngài Bill Gate hay là ngài đó làm phật ý bạn như thế nào mà bạn lại không sử dụng hàm có sẵn của MS Ex
Mà cũng không hiểu là bạn chê gì ngài Bill Gate hay là ngài đó làm phật ý bạn như thế nào mà bạn lại không sử dụng hàm có sẵn của MS Ex


Em chưa hiểu ý này ạ


Dạ file chạy rồi em cảm ơn anh chị ạ
Bài đã được tự động gộp:

Bạn đếm ở cột nào? cột C hay cột D? Chẳng phải là trong đề bài bạn đếm ở cột C rồi à:
"Công thức cột G : =COUNTIF(C:C,C2)"
Tôi không hiểu ý bạn và cũng không biết mục đích của bạn khi sử dụng Công thức ở cột G là gì?
Code trong file đính kèm trả lại cho bạn tôi nói là Kết quả đang để ở A12 là có ý bạn chạy code và so sánh với dữ liệu gốc của bạn.
Nếu bạn sử dụng code này (với dữ liệu lớn hàng ngàn, chục, trăm ngàn bản ghi ) thì chỉ cần bạn thay dòng Sh.Range("A12").Resize(R, C) = KQ thành Sh.Range("A2").Resize(R, C) = KQ và thêm 1 button gán cái macro Sub THAYCONGTHUC ấy vào và nhấn nút là đã có kết quả (nhanh chậm phụ thuộc vào số lượng bản ghi)
Mà cũng không hiểu là bạn chê gì ngài Bill Gate hay là ngài đó làm phật ý bạn như thế nào mà bạn lại không sử dụng hàm có sẵn của MS Ex (trừ trường hợp dữ liệu của bạn lớn(như đã nói ở trên) và trong workbook bạn sử dụng công thức linhk, tham chiếu đến nhiều ô, nhiều sheet- đây là lý do để sử dụng VBA thay hàm có sẵn)
Không biết em sai thai tác ở đâu khi em copy dữ liệu bấm nút nó không chạy xuống dòng cuối cùng ạ, anh chị em xem giúp em với ạ
 

File đính kèm

  • Check - cong..xlsm
    4.3 MB · Đọc: 4
Upvote 0
Mà cũng không hiểu là bạn chê gì ngài Bill Gate hay là ngài đó làm phật ý bạn như thế nào mà bạn lại không sử dụng hàm có sẵn của MS Ex


Em chưa hiểu ý này ạ


Dạ file chạy rồi em cảm ơn anh chị ạ
Bài đã được tự động gộp:


Không biết em sai thai tác ở đâu khi em copy dữ liệu bấm nút nó không chạy xuống dòng cuối cùng ạ, anh chị em xem giúp em với ạ
Bạn thử lại ở file đính kèm này nhé. Code có sửa lại tý chút cho bạn
C1: xử lý dữ liệu xong đập lại vào A2 (có nghĩa là dữ liệu gốc được đưa vào mảng sau gán lại vào Sheet
C2: chỉ xử lý những cột cần xử lý thay phải dùng bằng Hàm của MS Ex (cột A, E,F, G) thành mảng sau đó gán lại vào đúng các cột ấy .
Dữ liệu của bạn là trên 54K (chính xác là 54233) bản ghi nên chạy code (mặc dù đã đưa vào mảng để xử lý ) nhưng cũng phải tốn 1 lượng thời gian đáng kể.

LỜI THỈNH CẦU:
Ở bài này, Tôi đã làm mọi cách mình có thể để cho code chạy nhanh, nhưng vẫn không cải thiện được nhiều. Anh chị em nào thành viên trên diễn đàn có ghé qua xem bài xin cho góp ý để cải thiện code giúp cho chủ thớt có được đáp án tốt hơn, giúp tôi có thêm kinh nghiệm,và bổ sung thêm kiến thức, và biết đâu đó, nó cũng sẽ trở thành 1 kiến thức quý giá đối với các thành viên khác đang muốn tìm hiểu học tập trên diễn đàn này.
Trân trọng!
 

File đính kèm

  • Check - cong..xlsm
    4.8 MB · Đọc: 9
Upvote 0
Bạn thử lại ở file đính kèm này nhé. Code có sửa lại tý chút cho bạn
C1: xử lý dữ liệu xong đập lại vào A2 (có nghĩa là dữ liệu gốc được đưa vào mảng sau gán lại vào Sheet
C2: chỉ xử lý những cột cần xử lý thay phải dùng bằng Hàm của MS Ex (cột A, E,F, G) thành mảng sau đó gán lại vào đúng các cột ấy .
Dữ liệu của bạn là trên 54K (chính xác là 54233) bản ghi nên chạy code (mặc dù đã đưa vào mảng để xử lý ) nhưng cũng phải tốn 1 lượng thời gian đáng kể.

LỜI THỈNH CẦU:
Ở bài này, Tôi đã làm mọi cách mình có thể để cho code chạy nhanh, nhưng vẫn không cải thiện được nhiều. Anh chị em nào thành viên trên diễn đàn có ghé qua xem bài xin cho góp ý để cải thiện code giúp cho chủ thớt có được đáp án tốt hơn, giúp tôi có thêm kinh nghiệm,và bổ sung thêm kiến thức, và biết đâu đó, nó cũng sẽ trở thành 1 kiến thức quý giá đối với các thành viên khác đang muốn tìm hiểu học tập trên diễn đàn này.
Trân trọng!
Sao không dùng Dictionary đếm dữ liệu mà dùng hàm Countif.Mỗi 1 bước nhảy là nó lại phải tính lai hàm countif.Mà theo mình biết hàm countif là hàm mảng nên tốc độ sẽ chậm.
 
Upvote 0
Sao không dùng Dictionary đếm dữ liệu mà dùng hàm Countif.Mỗi 1 bước nhảy là nó lại phải tính lai hàm countif.Mà theo mình biết hàm countif là hàm mảng nên tốc độ sẽ chậm.
Cảm ơn anh đã chỉ giúp. Để tôi thử lại xem. Mà cũng không biết chủ thớt có ý định đếm số lần ID xuất hiện và đưa vào Cột G không? Nói thế nhưng cũng thử một lần để đúc rút kiến thức.
Đúng là dùng Dic để đếm tốc độ có cải thiện đáng kể
Mã:
Option Explicit

Sub THAYCTHUC()
Dim i&, j&, Lr&, k&, t&, R&, C&
Dim Arr(), COTA(), COTEFG()
Dim Sh As Worksheet, WF As Object
Dim Dic As Object, Key

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Set WF = Application.WorksheetFunction
Set Sh = Sheets("Data")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("A2:K" & Lr).Value
R = UBound(Arr): C = UBound(Arr, 2)
ReDim COTA(1 To R, 1 To 1)
ReDim COTEFG(1 To R, 1 To 3)
Set Dic = CreateObject("Scripting.Dictionary")

For i = 1 To R
        COTA(i, 1) = WF.Text(Arr(i, 2), "0") & Arr(i, 3)
    If Arr(i, 8) = 0 Or Arr(i, 8) = Empty Then COTEFG(i, 1) = Arr(i, 9) Else COTEFG(i, 1) = Arr(i, 8)
    If VBA.Weekday(CDate(Arr(i, 2))) = 1 Then
        If Arr(i, 9) > 0 Or Arr(i, 10) > 0 Then COTEFG(i, 2) = "CN1" Else COTEFG(i, 2) = "CN"
    Else
        If COTEFG(i, 1) > 0 And COTEFG(i, 1) <= 480 Then COTEFG(i, 2) = 1 Else COTEFG(i, 2) = COTEFG(i, 1)
    End If
Key = Arr(i, 3)
    If Not Dic.Exists(Key) Then
        t = t + 1: Dic.Add (Key), t
        COTEFG(i, 3) = 1
    Else
         k = Dic.Item(Key)
         COTEFG(k, 3) = COTEFG(k, 3) + 1
    End If
Next i
Sh.Range("A2").Resize(R, 1) = COTA
Sh.Range("E2").Resize(R, 3) = COTEFG
MsgBox "Xong", vbInformation, "THÔNG BÁO"
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Kiểm tra lại kết quả thấy code chạy không đúng. Xin lỗi mọi người nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Tham khảo thêm 1 cách
Công thức trong sheet "Check - Cong" tham chiếu vùng quá lớn nên khi điền kết quả xuống sheet sẽ bị chậm
Mã:
Option Explicit

Sub test()
Dim Nguon
Dim EFG 'ket qua thay the cong thuc cot EFG
Dim CN 'ngay chu nhat dau tien 2005
Dim ID() As Integer 'mang thongke ID
Dim rws, cls
Dim i, j, k

With Sheet3
    rws = .Range("C2").End(xlDown).Row
    Nguon = .Range("A2:K" & rws)
End With
rws = UBound(Nguon)
cls = UBound(Nguon, 2)
ReDim EFG(1 To rws, 1 To 3)

'tim ngay CN dau tien trong nam 2005, khai bao mang thong ke ID
k = WorksheetFunction.Weekday(DateSerial(2005, 1, 1))
If k = 1 Then
    CN = DateSerial(2005, 1, 1)
Else
    For i = 2 To 9
        k = WorksheetFunction.Weekday(DateSerial(2005, 1, i))
        If k = 1 Then
            CN = DateSerial(2005, 1, i)
            Exit For
        End If
    Next i
End If
ReDim ID(100000 To 30000000)

For i = 1 To rws
    'cot E
    If Nguon(i, 8) = 0 Then
        EFG(i, 1) = Nguon(i, 9)
    Else
        EFG(i, 1) = Nguon(i, 8)
    End If
    'cot F
    If (Nguon(i, 2) - CN) Mod 7 = 0 Then
        If Nguon(i, 9) > 0 Or Nguon(i, 10) > 0 Then
            EFG(i, 2) = "CN1"
        Else
            EFG(i, 2) = "CN"
        End If
    Else
        If EFG(i, 1) > 0 And EFG(i, 1) <= 480 Then
            EFG(i, 2) = 1
        Else
            EFG(i, 2) = EFG(i, 1)
        End If
    End If
    'cot F
    'thong ke ID
    ID(Nguon(i, 3)) = ID(Nguon(i, 3)) + 1
    'thong ke ID
Next i

'cot G
For i = 1 To rws
    EFG(i, 3) = ID(Nguon(i, 3))
Next i

'With Sheet3
'    .Range("E2").Resize(rws, 3) = EFG
'End With
End Sub
 
Upvote 0
Tham khảo thêm 1 cách
Công thức trong sheet "Check - Cong" tham chiếu vùng quá lớn nên khi điền kết quả xuống sheet sẽ bị chậm
Mã:
Option Explicit

Sub test()
Dim Nguon
Dim EFG 'ket qua thay the cong thuc cot EFG
Dim CN 'ngay chu nhat dau tien 2005
Dim ID() As Integer 'mang thongke ID
Dim rws, cls
Dim i, j, k

With Sheet3
    rws = .Range("C2").End(xlDown).Row
    Nguon = .Range("A2:K" & rws)
End With
rws = UBound(Nguon)
cls = UBound(Nguon, 2)
ReDim EFG(1 To rws, 1 To 3)

'tim ngay CN dau tien trong nam 2005, khai bao mang thong ke ID
k = WorksheetFunction.Weekday(DateSerial(2005, 1, 1))
If k = 1 Then
    CN = DateSerial(2005, 1, 1)
Else
    For i = 2 To 9
        k = WorksheetFunction.Weekday(DateSerial(2005, 1, i))
        If k = 1 Then
            CN = DateSerial(2005, 1, i)
            Exit For
        End If
    Next i
End If
ReDim ID(100000 To 30000000)

For i = 1 To rws
    'cot E
    If Nguon(i, 8) = 0 Then
        EFG(i, 1) = Nguon(i, 9)
    Else
        EFG(i, 1) = Nguon(i, 8)
    End If
    'cot F
    If (Nguon(i, 2) - CN) Mod 7 = 0 Then
        If Nguon(i, 9) > 0 Or Nguon(i, 10) > 0 Then
            EFG(i, 2) = "CN1"
        Else
            EFG(i, 2) = "CN"
        End If
    Else
        If EFG(i, 1) > 0 And EFG(i, 1) <= 480 Then
            EFG(i, 2) = 1
        Else
            EFG(i, 2) = EFG(i, 1)
        End If
    End If
    'cot F
    'thong ke ID
    ID(Nguon(i, 3)) = ID(Nguon(i, 3)) + 1
    'thong ke ID
Next i

'cot G
For i = 1 To rws
    EFG(i, 3) = ID(Nguon(i, 3))
Next i

'With Sheet3
'    .Range("E2").Resize(rws, 3) = EFG
'End With
End Sub
Code này chạy cho ra kết quả đúng. chủ thớt nên dùng code này để giải quyết bài cuẩ mình.
 
Upvote 0
Cảm ơn anh đã chỉ giúp. Để tôi thử lại xem. Mà cũng không biết chủ thớt có ý định đếm số lần ID xuất hiện và đưa vào Cột G không? Nói thế nhưng cũng thử một lần để đúc rút kiến thức.
Đúng là dùng Dic để đếm tốc độ có cải thiện đáng kể
Mã:
Option Explicit

Sub THAYCTHUC()
Dim i&, j&, Lr&, k&, t&, R&, C&
Dim Arr(), COTA(), COTEFG()
Dim Sh As Worksheet, WF As Object
Dim Dic As Object, Key

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Set WF = Application.WorksheetFunction
Set Sh = Sheets("Data")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("A2:K" & Lr).Value
R = UBound(Arr): C = UBound(Arr, 2)
ReDim COTA(1 To R, 1 To 1)
ReDim COTEFG(1 To R, 1 To 3)
Set Dic = CreateObject("Scripting.Dictionary")

For i = 1 To R
        COTA(i, 1) = WF.Text(Arr(i, 2), "0") & Arr(i, 3)
    If Arr(i, 8) = 0 Or Arr(i, 8) = Empty Then COTEFG(i, 1) = Arr(i, 9) Else COTEFG(i, 1) = Arr(i, 8)
    If VBA.Weekday(CDate(Arr(i, 2))) = 1 Then
        If Arr(i, 9) > 0 Or Arr(i, 10) > 0 Then COTEFG(i, 2) = "CN1" Else COTEFG(i, 2) = "CN"
    Else
        If COTEFG(i, 1) > 0 And COTEFG(i, 1) <= 480 Then COTEFG(i, 2) = 1 Else COTEFG(i, 2) = COTEFG(i, 1)
    End If
Key = Arr(i, 3)
    If Not Dic.Exists(Key) Then
        t = t + 1: Dic.Add (Key), t
        COTEFG(i, 3) = 1
    Else
         k = Dic.Item(Key)
         COTEFG(k, 3) = COTEFG(k, 3) + 1
    End If
Next i
Sh.Range("A2").Resize(R, 1) = COTA
Sh.Range("E2").Resize(R, 3) = COTEFG
MsgBox "Xong", vbInformation, "THÔNG BÁO"
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Kiểm tra lại kết quả thấy code chạy không đúng. Xin lỗi mọi người nhé.
Anh chị cho em hỏi em copy code vào rồi nhưng nó chỉ chạy đến dòng 3499 nó không chạy hết đến hết dữ liệu, anh chị xem lại giúp em, xem em có làm sai chỗ nào không ạ. Em cảm ơn ạ
 

File đính kèm

  • Check - cong....xlsm
    5.6 MB · Đọc: 5
Upvote 0
Cảm ơn anh đã chỉ giúp. Để tôi thử lại xem. Mà cũng không biết chủ thớt có ý định đếm số lần ID xuất hiện và đưa vào Cột G không? Nói thế nhưng cũng thử một lần để đúc rút kiến thức.
Đúng là dùng Dic để đếm tốc độ có cải thiện đáng kể
Mã:
Option Explicit

Sub THAYCTHUC()
Dim i&, j&, Lr&, k&, t&, R&, C&
Dim Arr(), COTA(), COTEFG()
Dim Sh As Worksheet, WF As Object
Dim Dic As Object, Key

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Set WF = Application.WorksheetFunction
Set Sh = Sheets("Data")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("A2:K" & Lr).Value
R = UBound(Arr): C = UBound(Arr, 2)
ReDim COTA(1 To R, 1 To 1)
ReDim COTEFG(1 To R, 1 To 3)
Set Dic = CreateObject("Scripting.Dictionary")

For i = 1 To R
        COTA(i, 1) = WF.Text(Arr(i, 2), "0") & Arr(i, 3)
    If Arr(i, 8) = 0 Or Arr(i, 8) = Empty Then COTEFG(i, 1) = Arr(i, 9) Else COTEFG(i, 1) = Arr(i, 8)
    If VBA.Weekday(CDate(Arr(i, 2))) = 1 Then
        If Arr(i, 9) > 0 Or Arr(i, 10) > 0 Then COTEFG(i, 2) = "CN1" Else COTEFG(i, 2) = "CN"
    Else
        If COTEFG(i, 1) > 0 And COTEFG(i, 1) <= 480 Then COTEFG(i, 2) = 1 Else COTEFG(i, 2) = COTEFG(i, 1)
    End If
Key = Arr(i, 3)
    If Not Dic.Exists(Key) Then
        t = t + 1: Dic.Add (Key), t
        COTEFG(i, 3) = 1
    Else
         k = Dic.Item(Key)
         COTEFG(k, 3) = COTEFG(k, 3) + 1
    End If
Next i
Sh.Range("A2").Resize(R, 1) = COTA
Sh.Range("E2").Resize(R, 3) = COTEFG
MsgBox "Xong", vbInformation, "THÔNG BÁO"
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Kiểm tra lại kết quả thấy code chạy không đúng. Xin lỗi mọi người nhé.
Tại sao lại đếm và điền thế kia.Với bài toán trên thì phải tách chạy 2 vòng lặp mới được.Điền giá trị ở I.Lưu giá trị t.Xong lấy giá trị T.Kết quả đúng được mới là lạ.
 
Upvote 0
Tại sao lại đếm và điền thế kia.Với bài toán trên thì phải tách chạy 2 vòng lặp mới được.Điền giá trị ở I.Lưu giá trị t.Xong lấy giá trị T.Kết quả đúng được mới là lạ.
Tôi cũng đã phát hiện ra sai sót, và đã thừa nhận ở bài#8 và khuyên chủ thớt sử dụng code ở bài#10. Và thực ra tôi đã viết lại code nhưng không đăng nên nữa vì nghĩ rằng chủ thớt đã sử dụng code của bài#9( của Anh @CHAOQUAY )
Song đến bài #11 chủ thớt lại hỏi tôi. Lúc này tôi mới đem code của mình viết để so sánh kết quả và thời gian chạy code của Anh @CHAOQUAY. Thì thấy Kết quả giống nhau nhưng code của Anh @CHAOQUAY chạy nhanh hơn 3 lần code của tôi, quả là đáng khâm phục và kính nể.
Cũng nhân đây Tôi mong muốn các Anh Hoặc Anh @CHAOQUAY nếu vào xem bài này Nếu có thể giải thích giúp tôi 1 số đoạn mà tôi do không có cơ bản về VBA nên không hiểu tý gì.
Đó là:
Sao chỗ này không là DateSerial(2022,1,1) mà lại là DateSerial(2005,1,1)
Mã:
.....
k = WorksheetFunction.Weekday(DateSerial(2005, 1, 1))
If k = 1 Then
    CN = DateSerial(2005, 1, 1)
Else
    For i = 2 To 9
        k = WorksheetFunction.Weekday(DateSerial(2005, 1, i))
        If k = 1 Then
            CN = DateSerial(2005, 1, i)
            Exit For
        End If
    Next i
End If
Và chỗ này nữa: Sao lại là ReDim ID(100000 To 30000000)
Và các dòng phía dưới thì chịu không hiểu 1 tý gì.
Mã:
ReDim ID(100000 To 30000000)
'cot F
    'thong ke ID
    ID(Nguon(i, 3)) = ID(Nguon(i, 3)) + 1
    'thong ke ID
Next i

'cot G
For i = 1 To rws
    EFG(i, 3) = ID(Nguon(i, 3))
Next i
 
Lần chỉnh sửa cuối:
Upvote 0
Anh chị cho em hỏi em copy code vào rồi nhưng nó chỉ chạy đến dòng 3499 nó không chạy hết đến hết dữ liệu, anh chị xem lại giúp em, xem em có làm sai chỗ nào không ạ. Em cảm ơn ạ
Bạn sử dụng code của Anh @CHAOQUAY nhưng tại sao bạn không tắt bỏ dấu " ' " ở đầu các dòng code ghi kết quả xuống Sheet. Do vậy kết quả mà bạn thấy đó vẫn là kết quả của lần chạy code trước kia (khi chưa có code của anh CHAOQUAY). -Cái này là do bạn không gán Sub Test cho nút TỔNG HƠP C2.
Code của anh CHAO QUAY không nối Cột B với cột C (dòng tương ứng) để gán vào cột A, nên bạn vẫn phải dùng hàm để nối. Tôi có thêm vào code để bạn không phải sử dụng hàm ỏ cột A.
Ở Sheet Chec-... Bạn sử dụng Hàm Vlookup quá nhiều (load lâu, file nặng....). Tôi đã code cho bạn. Tếu bạn sử dụng thì chỉ cần nhấn nút là có kết quả.
P/s: Sheet Chec-Cong(2) là sheet gốc để bạn so sánh vói kết quả chạy code.nếu bạn sử dụng code thì nên xóa bỏ Sheet này
Bạn xem file.
 

File đính kèm

  • Check - cong..xlsm
    5.4 MB · Đọc: 11
Upvote 0
Bạn sử dụng code của Anh @CHAOQUAY nhưng tại sao bạn không tắt bỏ dấu " ' " ở đầu các dòng code ghi kết quả xuống Sheet. Do vậy kết quả mà bạn thấy đó vẫn là kết quả của lần chạy code trước kia (khi chưa có code của anh CHAOQUAY). -Cái này là do bạn không gán Sub Test cho nút TỔNG HƠP C2.
Code của anh CHAO QUAY không nối Cột B với cột C (dòng tương ứng) để gán vào cột A, nên bạn vẫn phải dùng hàm để nối. Tôi có thêm vào code để bạn không phải sử dụng hàm ỏ cột A.
Ở Sheet Chec-... Bạn sử dụng Hàm Vlookup quá nhiều (load lâu, file nặng....). Tôi đã code cho bạn. Tếu bạn sử dụng thì chỉ cần nhấn nút là có kết quả.
P/s: Sheet Chec-Cong(2) là sheet gốc để bạn so sánh vói kết quả chạy code.nếu bạn sử dụng code thì nên xóa bỏ Sheet này
Bạn xem file.
Em cảm ơn anh chị !
đúng ý em rồi ạ
 
Upvote 0
Và chỗ này nữa: Sao lại là ReDim ID(100000 To 30000000)
Và các dòng phía dưới thì chịu không hiểu 1 tý gì.
Mã:
ReDim ID(100000 To 30000000)
'cot F
    'thong ke ID
    ID(Nguon(i, 3)) = ID(Nguon(i, 3)) + 1
    'thong ke ID
Next i

'cot G
For i = 1 To rws
    EFG(i, 3) = ID(Nguon(i, 3))
Next i
Cái này là: Lấy mã nhân viên làm chỉ số phần tử của mảng ID để đếm số lần xuất hiện của nhân viên đó.
Bạn giả định Nguon(i,3) là 1 con số cụ thể nào đó là sẽ ra vấn đề ngay thôi.
 
Upvote 0
Cái này là: Lấy mã nhân viên làm chỉ số phần tử của mảng ID để đếm số lần xuất hiện của nhân viên đó.
Bạn giả định Nguon(i,3) là 1 con số cụ thể nào đó là sẽ ra vấn đề ngay thôi.
Cảm ơn anh đã chỉ giáo. Bây giờ tôi đã hiểu.
 
Upvote 0
...Đúng là dùng Dic để đếm tốc độ có cải thiện đáng kể ...
...
Song đến bài #11 chủ thớt lại hỏi tôi. Lúc này tôi mới đem code của mình viết để so sánh kết quả và thời gian chạy code của Anh @CHAOQUAY. Thì thấy Kết quả giống nhau nhưng code của Anh @CHAOQUAY chạy nhanh hơn 3 lần code của tôi, quả là đáng khâm phục và kính nể....
Cái này là: Lấy mã nhân viên làm chỉ số phần tử của mảng ID để đếm số lần xuất hiện của nhân viên đó.
Bạn giả định Nguon(i,3) là 1 con số cụ thể nào đó là sẽ ra vấn đề ngay thôi.

Mảng đương nhiên nhanh hơn bất kỳ một object, công cụ nào khác.
Khi key là số thì dùng key làm chỉ số mảng là kỹ thuật căn bản của sắp xếp, lọc, thống kê...
So sánh với đít sần thì:
Mảng là các phần tử liên tục, VBA truy cập bằng cách dùng chỉ số để tính khoảng cách từ đầu mảng đến phần tử cần truy cập. Khi truy cập thì cả mảng nằm trong bộ nhớ, rất nhanh.
Đít sần chỉ là một collection. Tuy nó dùng bảng băm là một kỹ thuật cao để truy cập phần tử nhưng vẫn không thể nào nhanh bằng trực tiếp chỉ số. Mỗi lần cần tra, nó băm key và dò trong bảng mục lục (thường thì là cây nhị phân) để lấy địa chỉ item. Lúc ấy, chưa chắc items đã nằm sẵn trong bộ nhớ. (Nếu truy cập nhiều lần thì có thể Windows để luôn, không swap out)

Trường hợp duy nhất mà đít sần có thể hiệu quả hơn mảng là khi số lượng items rất ít so với dộ lớn của mảng. Điển hình, ta có số 1-100000 thì phải tạo mảng 100000 phần tử; nhưng lúc dùng thì chỉ có chừng 100 số rải rác.

Chú: khi dùng timer để đo tốc độ code thì kết luận chỉ có thể áp dụng cho code và dữ liệu đang dùng.
Mỗi kỹ thuật chúng có vùng "mượt" (sweet spots) tuỳ theo loại, nhóm dữ liệu sử dụng. Code A chạy nhanh hơn code B ở vùng dữ liệu xyz, nhưng vẫn chưa chắc B sẽ thua A ở vùng dữ liệu vuw. Điều này tôi đã đề cập vài lần trước đây.
 
Upvote 0
Web KT

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

Back
Top Bottom