So sánh trùng và không trùng trên 2 cột. (1 người xem)

  • Thread starter Thread starter viendo
  • Ngày gửi Ngày gửi
Liên hệ QC

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

viendo

Tầm sư học Excel
Tham gia
5/10/07
Bài viết
516
Được thích
749
Nghề nghiệp
Kỹ Thuật Dệt
Tôi làm file có các cột như sau :
  1. Cột A : Dữ liệu so sánh 1
  2. Cột B : Dữ liệu so sánh 2
  3. Cột C : Lọc dữ liệu có trong cột A mà không có trong cột B
  4. Cột D : Lọc dữ liệu có trong cột B mà không có trong cột A
  5. Cột E : Lọc dữ liệu trùng cột A và B

    Sau khi thử dữ liệu 300 dòng thì nó đã "lết bánh" rồi, trong khi công việc đang cần so sánh số liệu khoảng 50.000 dòng.
    Nhờ các Anh Chị xem hướng dẫn sửa Name và công thức dùm, làm bằng BVA cũng tốt, miễn sao nó chạy lẹ lẹ 1 tí. Thanks
 

File đính kèm

Bạn Thử Với 2 Cái Ni Xem Tốc Độ Ra Răng?

PHP:
Option Explicit
 Dim lRow As Long, jZ As Long
 Dim lRow0 As Long, jW As Long
  
Sub FilterAll()
 Dim SChu As String
 Dim XH As String
 
 XH = Chr(13) & Chr(10)
 lRow = Range("A65432").End(xlUp).Row
 lRow0 = Range("B65432").End(xlUp).Row
 SChu = "A: Co O Cot 'A', Khong Co O Cot 'B'" & XH
 SChu = SChu & "B: Co O Cot 'B', Khong Co O Cot 'A'"
 SChu = SChu & XH & "C: Co O Ca 2 Cot"
 SChu = InputBox(SChu, "GPE - SaDQ")
 SChu = UCase$(Left(SChu, 1))
 Application.ScreenUpdating = False
 If SChu = "A" Or SChu = "B" Then
    TongHop SChu
 ElseIf SChu = "C" Then
    Dim tRow As Long
    If lRow > lRow0 Then tRow = lRow Else tRow = lRow0
    Range("E3:C" & tRow).ClearContents
    For jZ = 3 To lRow
        For jW = 3 To lRow0
            If Cells(jZ, 1) = Cells(jW, 2) Then _
                Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        Next jW
    Next jZ
 Else
    XH = "BAN CAN CHON 1 TRONG 3 FUONG AN!" & XH
    MsgBox XH & "           BYE!", , "GPE - SaDQ"
 End If
End Sub
PHP:
Sub TongHop(MainCol As String)
 Dim Cot1 As Long, Cot2 As Long
 Dim StrC1 As String, StrC2 As String
 
 Select Case UCase$(MainCol)
 Case "A"
    Cot1 = lRow:        Cot2 = lRow0
    StrC1 = "C":        StrC2 = "C65432"
    Range("C3:C" & lRow).ClearContents
 Case "B"
    Cot1 = lRow0:        Cot2 = lRow
    StrC1 = "D":        StrC2 = "D65432"
    Range("D3:d" & lRow0).ClearContents
 End Select
 For jZ = 3 To Cot1
    For jW = 3 To Cot2
        If Cells(jZ, 1) = Cells(jW, 2) Then _
            Exit For
    Next jW
    If jW > Cot2 Then _
        Range(StrC1 & Range(StrC2).End(xlUp).Row + 1) = Cells(jZ, 1)
 Next jZ
End Sub
 
bạn có thê dùng công thức mảng
={if(Or(phần tử cột A = cột B),"trùng","ko trùng")}
Bạn làm tương tự cho cột B
Dùng Filter, lọc và paste sang một vùng mới.
Cái này tôi đã dùng rồi (Công ty tôi có danh sách gốc gần 200 người, danh sách tham gia cứu thương lần 1, .........tạo danh sách học cho những người chưa tham gia lần 1 sẽ tham gia lần 2 tôi cũng dùng cách này.

Bạn có thể tham khảo ở bài viết, trong đó có những cách của AnhTuan 1006 cũng rất hay mà chưa cần phải dùng đến VBA

http://www.giaiphapexcel.com/forum/showthread.php?t=8170
 
Lần chỉnh sửa cuối:
Sư phụ SA_DQ ơi tôi làm chưa được, phải nhờ các sư phụ chỉ tiếp và đừng la nhé vì chưa đủ hiểu cái code này và làm sao cho nó chạy, đang bị vướng thế này đây :
  1. Chép thử code 1 và code 2 lần lượt vào vùng Immediate để chạy thử nó báo lỗi là Invalid in Immediate pane.
  2. Chép code 1 lần lượt vào Module1, ThisworkkbbookkSheet1. Khi nhấn chạy nó đều báo lỗi là Sub or Function not defined. Ngoài ra nó tô vàng dòng Sub FillterAll() và tô đen Tonghop ở dòng TongHop Schu.
  3. Chép code 2 lần lượt vào Module1, ThisworkkbbookkSheet1. Khi nhấn chạy nó hiện bảng Macro mà chẳng có cái Macro nào để chọn.

    Phiền các sư phụ chỉ giáo tiếp dùm. Thanks
 
phải nhờ các sư phụ chỉ tiếp vì chưa đủ hiểu cái code này và làm sao cho nó chạy, đang bị vướng. Phiền các sư phụ chỉ giáo tiếp dùm.
Bạn nhấn tổ hợp fím {ALT} +{F11} để mở CS VBE
Và chép cả 2 macro vô module 1
Nói thêm: Macro TongHop được gọi bỡi macro còn lại & phải được nhận 1 đối số (biến) thích hợp 'A'/'B')
Như vậy bạn cần chạy cái macro còn lại kia (tên nó là FilterAll)
Khi đó 1 hộp thoại sẽ hỏi bạn cần chép vố cột nào tương ứng 'C', 'D' hay 'E'
Nếu bạn nạp biến 'A' hay 'B' thì macro này sẽ gọi macro còn lại (TongHop) truyền cho nó đối số tương ứng để nó chạy ra kết quả (KQ sẽ thể hiện trên cột 'C' hay 'D' tương ứng)
Nếu bạn nhập phương án 'C' thì macro FilterAll sẽ tiếp tục cho đến khi xong chuyện lọc ~ giá trị trùng trong 2 cột 'A' & 'B' ghi => 'E'
Bổ sung:
Nếu bạn muốn trường hợp 'C' nhanh hơn 1 tẹo nữa, thì trong macro FilterAll, tại dòng lệnh
Mã:
If Cells(jZ, 1) = Cells(jW, 2) Then _ 
                Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
Nên sửa lại là (Chú í: tôi đã bỏ dấu gạch dưới dùng nối 2 dòng lệnh)
PHP:
    If Cells(jZ, 1) = Cells(jW, 2) Then 
                Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1) 
                Exit For
    End If
 
Lần chỉnh sửa cuối:
feelingyes đã viết:
bạn có thê dùng công thức mảng
={if(Or(phần tử cột A = cột B),"trùng","ko trùng")}
Bạn làm tương tự cho cột B
Dùng Filter, lọc và paste sang một vùng mới.
Cái này tôi đã dùng rồi (Công ty tôi có danh sách gốc gần 200 người, danh sách tham gia cứu thương lần 1, .........tạo danh sách học cho những người chưa tham gia lần 1 sẽ tham gia lần 2 tôi cũng dùng cách này.
Bạn có thể tham khảo ở bài viết, trong đó có những cách của AnhTuan 1006 cũng rất hay mà chưa cần phải dùng đến VBA
http://www.giaiphapexcel.com/forum/showthread.php?t=8170
Cám ơn bạn nhiều, tôi đã tham khảo cách làm trên rồi, file tôi làm cũng đa phần là học từ các file của Anhtuan, trường hợp hiện tại của tôi là phải xử lý số liệu rất lớn và phải làm khoảng 4 lần (mỗi lần làm 1 quí khoảng 40 đến 50 ngàn dòng) rồi mới tổng hợp nên nó chạy không nổi luôn.
Ý tôi làm file này để đối chiếu sai sót của số lượng kiểm kê thực tế và số liệu trong chương trình xuất ra có chênh lệch. Một mặt phiền các sư phụ giúp file xử lý, một mặt tôi đang đề nghị chỉ kiểm tra trong từng tháng thì số liệu còn khoảng mười mấy ngàn dòng thôi.

To Sư phụ SA_DQ : để làm theo sư phụ chỉ, có gì sẽ phiền tiếp nhé, do công lực yếu kém quá nên tiếp thu cũng kém luôn hichic..
 
Đã làm theo hướng dẫn của Sư phụ và chạy rất ok với dữ liệu <1.000 dòng. Cám ơn rất nhiều.
Cho chạy thử Cột A 10.000 dòng và cột B 5.000 dòng nó chạy gần 20' Sư phụ ơi. (với cấu hình máy sau Processor: Intel(R) Pentium(R) 4 CPU 1.50GHz. Memory: 512MB RAM)
Có cách nào để cải thiện tiếp về tốc độ xử lý phiền các Sư phụ chỉ giáo tiếp. Thanks
 
Đã chạy rất ok với dữ liệu; Chạy thử Cột A 10.000 dòng và cột B 5.000 dòng nó chạy gần 20' Có cách nào để cải thiện tiếp về tốc độ xử lý phiền các Sư phụ chỉ giáo tiếp.

1*/ Hãy cho biết t1, t2 & t3 tương ứng là bao nhiêu; Để còn định hướng cải thiện í mà!

2*/ Dữ liệu của bạn có thể cho phép sắp xếp hay không?
Nếu trong trường hợp được phép, thì thử trước khi chạy macro, cho xếp 2 cột này lại 1 cách riêng rẽ xem tình hình có cải thiện hơn không?
imagesCA09OWA9.jpg
 
SA_DQ đã viết:
1*/ Hãy cho biết t1, t2 & t3 tương ứng là bao nhiêu; Để còn định hướng cải thiện í mà!

2*/ Dữ liệu của bạn có thể cho phép sắp xếp hay không?
Nếu trong trường hợp được phép, thì thử trước khi chạy macro, cho xếp 2 cột này lại 1 cách riêng rẽ xem tình hình có cải thiện hơn không?
  1. Dữ liệu hàng tháng dao động từ 10.000 đến cao nhất là 15.000 dòng.
  2. Dữ liệu này có thể sắp xếp, sort đều được vì mục đích là tìm ra các mã bị chênh lệch giữa 2 cột mà. Dữ liệu so sánh 2 cột thế này đây :
    .....
    SJL436MDFQ0030
    SJL436MDFQ0025
    HUL773ZABJ0006
    HUL773ZABJ0010
    HUL773ZABJ0004
    ADXN001EABB0019
    ADXN001EABB0020
    AEJL064ZAEJ0006
    AEJL064ZAEJ0007
    .....
Hy vọng Sư phụ tìm ra giải pháp giúp. Thanks
 
Chúng ta thử từng phần việc, vậy!

Bạn vô CS VBE như trên đã nêu; Vô menu Insert & thêm 1 module nữa (tạm là module2) Và chép 2 macro này & chạy thử, so sánh với macro FilterAll -> TongHop (A) & báo kết quả nha!
Chú í: Mình mới tách & thử với trường hợp hình thành KQ trên cột 'C' thôi nha! Hai trường hợp còn lại sẽ tiếp, một khi cái này có xu hướng không tồi!

PHP:
Option Explicit
Dim lRow As Long, jZ As Long
Dim lRowB As Long, jW As Long
Dim Timer_ As Double

Sub SearchColumnC()
 Dim lTemp As Long
 
 Timer_ = Timer
 lRow = Range("A65432").End(xlUp).Row
 lRowB = Range("b65432").End(xlUp).Row
 Application.ScreenUpdating = False
 Sort1Col Range("A2:A" & lRow), Range("A3")
 Sort1Col Range("B2:B" & lRow), Range("B3")
 Range("C2") = "List1<>List2"
 Range("C3:C" & lRowB).ClearContents
 lTemp = 3
 For jZ = 3 To lRow
    For jW = lTemp To lRowB
        If Cells(jZ, 1) = Cells(jW, 2) Then
            lTemp = jW:         Exit For
        End If
    Next jW
    If jW > lRowB Then _
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
 Next jZ
 MsgBox Str(Timer - Timer_)
End Sub
PHP:
Sub Sort1Col(Rng As Range, Clls As Range)
  Rng.Sort Key1:=Clls, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub
 
To bác Sa_DQ: Em nhận thấy trong code của bác có 2 vòng lặp For...Next.
PHP:
....
    For jZ = 3 To lRow
          For jW = 3 To lRow0
                If Cells(jZ, 1) = Cells(jW, 2) Then _
                Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
          Next jW
    Next jZ
Theo em, nếu thay cái vòng lặp For...Next con bằng 1 cái CountIf thì tốc độ có thể cải thiện hơn ạ.
PHP:
....
    For jZ = 3 To lRow
        If WorksheetFunction.CountIf(Range("B3:B" & lRow0), Cells(jZ, 1)) > 0 Then _
                Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    Next jZ
 
Lần chỉnh sửa cuối:
SA_DQ đã viết:
Bạn vô CS VBE như trên đã nêu; Vô menu Insert & thêm 1 module nữa (tạm là module2) Và chép 2 macro này & chạy thử, so sánh với macro FilterAll -> TongHop (A) & báo kết quả nha!
Chú í: Mình mới tách & thử với trường hợp hình thành KQ trên cột 'C' thôi nha! Hai trường hợp còn lại sẽ tiếp, một khi cái này có xu hướng không tồi!
PHP:
Sub Sort1Col(Rng As Range, Clls As Range)
Rng.Sort Key1:=Clls, Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End Sub
Nó báo lỗi không chạy Sư phụ ơi, khi ở cửa sổ VBE nhấn run thì nó báo lỗi Compile error : Variable not defined. Khi ở cửa sổ excel chạy thì nó báo lỗi Can't execute code in break mode.
Cả 2 trường hợp trên đều báo lỗi ở Sub Sort1Col(). Sư phụ xem lại dùm với. Thanks
Bây giờ chạy macromodule 1 nó cũng báo lỗi luôn Can't execute code in break mode.
 
Lần chỉnh sửa cuối:
viendo đã viết:
Tôi làm file có các cột như sau :
  1. Cột A : Dữ liệu so sánh 1
  2. Cột B : Dữ liệu so sánh 2
  3. Cột C : Lọc dữ liệu có trong cột A mà không có trong cột B
  4. Cột D : Lọc dữ liệu có trong cột B mà không có trong cột A
  5. Cột E : Lọc dữ liệu trùng cột A và B
Bạn thử Sub SoSanh này:

Mã:
Sub SoSanh()
Dim List1 As Range, List2 As Range, List12 As Range
Sheets("Check").Select
Range(Cells(3, 3), Cells(65536, 5)).ClearContents
rc = Cells(3, 1).End(xlDown).Row
Set List1 = Range(Cells(3, 1), Cells(rc, 1))
Set List2 = Range(Cells(3, 2), Cells(rc, 2))
Set List12 = Range(Cells(3, 5), Cells(rc, 5))
r1 = 3
r2 = 3
r12 = 3
For r = 3 To rc
[COLOR=blue]  'So sanh list1 voi list2[/COLOR]
  kiemtra = Application.WorksheetFunction.CountIf(List2, Cells(r, 1))
  If kiemtra = 0 Then 'list1<>list2
    Cells(r1, 3) = Cells(r, 1)
    r1 = r1 + 1
  Else                  [COLOR=blue] 'list1=list2
[/COLOR]    kiemtra = Application.WorksheetFunction.CountIf(List12, Cells(r, 1))
    If kiemtra = 0 Then
      Cells(r12, 5) = Cells(r, 1)
      r12 = r12 + 1
    End If
  End If
  
 [COLOR=blue] 'So sanh list1 voi list2[/COLOR]
  kiemtra = Application.WorksheetFunction.CountIf(List1, Cells(r, 2))
  If kiemtra = 0 Then 'list2<>list1
    Cells(r2, 4) = Cells(r, 2)
    r2 = r2 + 1
  Else                  [COLOR=blue] 'list1=list2
[/COLOR]    kiemtra = Application.WorksheetFunction.CountIf(List12, Cells(r, 2))
    If kiemtra = 0 Then
      Cells(r12, 5) = Cells(r, 2)
      r12 = r12 + 1
    End If
  End If
Next
End Sub
 

File đính kèm

Macro chinh & Macro phụ.

Một khi báo lỗi thì nên thoát ra đâu đó, như windows chẵng hạn, hút điếu thuốc/làm ly cà phê mới quay lại excel, bình tâm mà chạy tiếp;
Chú í các macro cần được cung cấp biến, ta không thể dùng {F5} để chạy trực tiếp nó được;
Bạn nhớ chép tất thẩy các dòng lệnh, kể các các biến khai báo trên cả các macro; đó là ~ biến dùng chung;
Chép xong thử vô menu Debug & biên dịch xem thử, VBA có cự nự gì về biến hay không.
Trước khi chạy macro bằng fím {F5} phải nhớ mở sheets chứa dữ liệu cho excel nó thấy, để nó tìm, chứ không nó trách chúng ta thờ ơ chuyện này!!
Nếu bạn biết làm nút lệnh trên trang tính thì thực thi đi; để đỡ tốn thời gian!

NHỜ CÁC MOD/SMOD XÓA BÀI NÀY SAU 2 GIỜ, XIN CẢM ƠN!
Flower9.jpg
 
Xem thử cái này coi có nhanh hơn chút nào không !
Kiểm tra dữ liệu với 10.000 dòng sẽ thấy kết quả.
 

File đính kèm

Lần chỉnh sửa cuối:
minhlev đã viết:
To bác Sa_DQ: Em nhận thấy trong code của bác có 2 vòng lặp For...Next.

Theo em, nếu thay cái vòng lặp For...Next con bằng 1 cái CountIf thì tốc độ có thể cải thiện hơn ạ.

Dùng Countif quả thật nhanh hơn For (đã có bài về vấn đề này), tuy nhiên hàm MATCH sẽ nhanh hơn nhiều.

Đơn giản bởi Countif luôn luôn phải quét hết mảng, còn MATCH thì không, đặc biệt là với mảng được sắp xếp.

Thân!
 
Xin cám ơn các sư phụ đã tận tình.
Test 3 file của 3 Sư phụ luôn trên máy Intel(R) Pentium(R) 4 CPU 3.00GHz (2CPUs), Memory 256MB RAM với dữ liệu là mỗi list 15.000 dòng :
  1. SA_DQ : Chạy code ở module1 cho cột C hơn 05' thế là đệ tử cho End luôn, Chạy code ở module2 cho cột C chỉ có 25". Vậy sư phụ cải tiến tiếp cho cột D, E nữa nhé, vì đôi khi cũng chỉ cần lấy kết quả 1 cột.
  2. Thầy Long : Chạy ra 3 cột luôn mất 03'09".
  3. Dmtdmtbb : Chạy ra 3 cột luôn mất 08'20".

    Trong đó có 1 điểm khác là ở kết quả cột E của Thầy Long và Dmtdmtbb :
    1. File Thầy Long lấy danh sách duy nhất không có trùng.
    2. Dmtdmtbb lấy danh sách có trùng luôn, vì vậy mà chạy lâu hơn.
      Không lường trước tình huống này nhưng đều sử dụng được cả 2 file này vì 2 list cột A và B bản thân không có trùng.

      Vậy là đệ tử lấy luôn 3 file này nhé, phiền sư phụ SD_QD làm tiếp cột D, E nữa nhé. Một lần nữa xin cám ơn sự tận tình giúp đỡ của các Thầy, các sư phụ.
 
Mr Okebab đã viết:
Dùng Countif quả thật nhanh hơn For (đã có bài về vấn đề này), tuy nhiên hàm MATCH sẽ nhanh hơn nhiều. Đơn giản bởi Countif luôn luôn phải quét hết mảng, còn MATCH thì không, đặc biệt là với mảng được sắp xếp. Thân!
Đúng BAB tuyệt chiêu!
Mình thử 3 phương án với cột 'C' khi dữ liệu cột 'A' = 1.000 dòng; cột 'B' = 400 dòng
Mcr của mình mất: 1.1094'' (làm tròn)
Theo hàm COUNTIF(): 0.3438''
Theo hướng dẫn của BAB: 0.1875''
Mà dùng 2 hàm này thấy nhẹ hẵn macro đi rất nhiều
Sau đây xin giới thiệu đến VienDo, nha:
PHP:
Option Explicit
Public Timer_ As Double
Dim lRow As Long, jZ As Long
Dim lRowB As Long, jW As Long
Sub SearchColumnF()
 Dim lTemp As Long
 
 Timer_ = Timer
 lRow = Range("A65432").End(xlUp).Row
 lRowB = Range("b65432").End(xlUp).Row
 Application.ScreenUpdating = False
 Sort1Col Range("A2:A" & lRow), Range("A3")
 Sort1Col Range("B2:B" & lRow), Range("B3")
 Range("C2") = "List1<>List2"
 Range("C3:C" & (lRowB + lRow)).ClearContents
 lTemp = 3
 For jZ = 3 To lRow
'    If WorksheetFunction.CountIf(Range("B3:B" & lRowB), Cells(jZ, 1)) = 0 Then '
    If WorksheetFunction.Match(Cells(jZ, 1), Range("B3:B" & lRowB)) = lRowB - 2 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    End If
 Next jZ
 Range("F7") = Timer - Timer_
End Sub
PHP:
 Public Sub Sort1Col(Rng As Range, Clls As Range)
  Rng.Sort Key1:=Clls, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub
VienDo chú í:
Mình đã khai báo 1 biến toàn cục Timer_ ; Coi chừng báo lỗi khi biên dịch nha;
Cũng như vậy với macro Sort1Cot ;
Có thể xóa macro Sort1Cot & biến Timer_ cũ đi; Một khi đã chép toàn bộ 2 macro này vô module thứ 3 của CS VBE
 
viendo đã viết:
Trong đó có 1 điểm khác là ở kết quả cột E của Thầy Long và Dmtdmtbb :

1.File Thầy Long lấy danh sách duy nhất không có trùng.
2.Dmtdmtbb lấy danh sách có trùng luôn, vì vậy mà chạy lâu hơn.
Không lường trước tình huống này nhưng đều sử dụng được cả 2 file này vì 2 list cột A và B bản thân không có trùng.

Để lấy kết quả cột E có 3 cách :
C1 : so sánh A và B tìm những phần tử trùng nhau cho qua cột E,lâu hơn nhưng độc lập.
C2 : sau khi lọc được A<>B, dựa vào cột này loại bỏ những phần tử vừa lọc => (A=B),nhanh hơn nhiều.
C3 : Trong khi lọc A<>B thì cho qua E những phần tử A=B, bỏ qua bước lọc A=B, cực nhanh.
 
Lần chỉnh sửa cuối:
Để lấy kết quả cột E có 3 cách :
C1 : so sánh A và B tìm những phần tử trùng nhau cho qua cột E,lâu hơn nhưng độc lập.
C2 : sau khi lọc được A<>B, dựa vào cột này loại bỏ những phần tử vừa lọc => (A=B),nhanh hơn nhiều.
C3 : Trong khi lọc A<>B thì cho qua E những phần tử A=B, bỏ qua bước lọc A=B, cực nhanh.

Nhưng chúng ta chưa hỏi tác gia Topic cho biết đặt thù của dữ liệu tại cột 'A' & 'B' NTN (!)
Nếu 'A' gấp 12 lần 'B' hay ngược lại Hoặc thường chỉ tìm thấy 1/10 trên 'C' thì cách giải có thể # so với chương trình chuẩn.
Tiện đây, cho hỏi về dữ liệu của VD luôn, hàng tháng thường sẽ NTN?
 
Phần này đã sửa lại một số như sau :
- So sánh 2 cột A và B để lấy số dòng nhiều nhất.
- Cùng lúc kiểm tra (A=B),(A<>B) và (B<> A) sẽ cải thiện tốc độ đáng kể.
- Nếu A nhiều hơn B hoặc ngược lại đều cho ra kết quả như sau : (A=B),(A<>B) và (B<> A).
Bác Viendo test lại dùm thời gian còn bao lâu.
Mã:
Dim i, rNum, tNum As Integer
Dim tVal As String
[COLOR=blue]Sub Loc()[/COLOR]
On Error Resume Next
Application.ScreenUpdating = False
Range("C3:E65536").ClearContents
[COLOR=seagreen]'So sanh cot A va B  de lay so dong nhieu nhat[/COLOR]
rNum = Range("A:A").Find(what:=vbNullString).Row - 1
tNum = Range("B:B").Find(what:=vbNullString).Row - 1
If rNum < tNum Then rNum = tNum
[COLOR=seagreen]''''''''''''''''''''''''''''''''''
[/COLOR]For i = 3 To rNum
[COLOR=seagreen]'Tim` A<>B & A=B[/COLOR]
  If Cells(i, 1) <> vbNullString Then
     tVal = Range("B:B").Find(what:=Cells(i, 1)).Value
     If Err.Number > 0 Then
       Range("C:C").Find(what:=vbNullString).Value = Cells(i, 1).Value
     Else
       Range("E:E").Find(what:=vbNullString).Value = tVal
     End If
     Err.Number = 0
  End If
[COLOR=seagreen]'Tim B<>A[/COLOR]
  If Cells(i, 2) <> vbNullString Then
     tVal = Range("A:A").Find(what:=Cells(i, 2)).Value
     If Err.Number > 0 Then Range("D:D").Find(what:=vbNullString).Value = Cells(i, 2).Value
     Err.Number = 0
  End If
Next i
Application.ScreenUpdating = True
[COLOR=blue]End Sub[/COLOR]
 

File đính kèm

Lần chỉnh sửa cuối:
Trong quá trình đi tìm tốc độ cho các con macro, mình cũng đã thử với phương thức Find() ; Kết quả như sau:
trong câu lệnh
Mã:
    If WorksheetFunction.Match(Cells(jZ, 1), Range("B3:B" & lRowB)) = lRowB - 2 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    End If
Mình dùng thay bằng các câu sau:
PHP:
    If Range("B3:B" & lRowB).Find(what:=Cells(jZ, 1)) Is Nothing Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    End If
Kết quả, thời gian tiêu hao hiện ra là: 0.5156 ''
Cho nên mình cho rằng áp dụng phương thức Find() sẽ chậm hơn, ngay cả trường hợp dùng COUNTIF();
Bạn có thể dùng hàm định thời TIMER() trong VBA kiểm việc này mà (!?)
 
Tôi nhận xét thấy rằng cái vụ tìm kiếm này thì chưa chắc có code nào nhanh bằng Conditional Formating... ấy vậy mà thử trên dử liệu 60.000 nó còn ì ạch huống chi là dùng code...
Bạn xem lại.. tôi nghĩ giãi quyết kiểu này ko ăn rồi...
Ta nên chọn 2 cách sau đây:
1> Nếu dử liệu trong từng List có trùng (trùng càng nhiều càng tốt) thì trước tiên nên lọc nó ra 1 danh sách duy nhất, sau đó mới nói đến chuyện TÌM KIẾM... như vậy bạn sẽ tiết kiệm dc rất nhiều thời gian
2> Nếu dử liệu trong từng cột gần như ko trùng nhau (hoặc trùng rất ít) thì bạn nên nghĩ đến hướng chia nhỏ danh sách ra mà tìm...
Vài ý kiến chủ quan... các cao thủ khác thì sao?
ANH TUẤN
 
SA_DQ đã viết:
đặt thù của dữ liệu tại cột 'A' & 'B' NTN (!)
Tiện đây, cho hỏi về dữ liệu của VD luôn, hàng tháng thường sẽ NTN?
Dữ liệu 2 cột 'A' và 'B' gần như bằng nhau, dữ liệu lấy ra ở cột 'C', 'D' không nhiều, nhưng ở cột 'E' thì nhiều. Để tiện kiểm tra đệ gửi dữ liệu thật của 1 tháng lên luôn. Chưa test được code của sư phụ làm hồi sáng.
dmtdmtbb đã viết:
Phần này đã sửa lại một số như sau :
- So sánh 2 cột A và B để lấy số dòng nhiều nhất.
- Cùng lúc kiểm tra (A=B),(A<>B) và (B<> A) sẽ cải thiện tốc độ đáng kể.
- Nếu A nhiều hơn B hoặc ngược lại đều cho ra kết quả như sau : (A=B),(A<>B) và (B<> A).
Bác Viendo test lại dùm thời gian còn bao lâu.
Do đang ở cty nên để chiều tối về mới test được, Sư phụ thông cảm nhé. Àh nhờ sư phụ chỉ bỏ cái hàm Time() vào code của sư phụ chỗ nào, hôm qua chỉ bỏ hàm Time() vào được file của Thầy Long, còn khi chạy file sư phụ thì dùng đồng hồ bấm giờ ở ngoài.

Thực ra 1 tháng chạy kiểm tra 1 lần với số dòng lớn và với thời gian chờ 5' hoặc 8' thì đệ tử nghĩ là đã đạt lắm rồi, vì trước thì làm tốn thời gian hơn rất nhiều đấy. Rất cám ơn các Sư phụ đã tận tình.
 

File đính kèm

Ý tôi muốn biết dử liệu trong từng list có trùng hay ko thôi (còn nó có trùng với list khác ta ko quan tâm)...
Tôi xem file bạn, dùng Advanced Filter để lọc Unique Only thì thấy quả thật list chẳng có trùng (đúng ra là có 1 cái trùng, cái này chắc nhầm lẩn).... Vậy thì dùng code để lọc ko ăn thua rồi...
Bạn cứ thử dùng Conditional Formating để tô màu theo đúng ý bạn sẽ biết liền... CF nhanh như thế mà còn xỉu lên xỉu xuống nữa chứ đừng nói là code...
Có lẽ như tôi đã nói, phải chia nhỏ dử liệu ra thành nhiều phần thôi... (theo tôi nhận định thì trong trường hợp của bạn phải chia ra mổi sheet ko quá 6000 dòng.. như thế mới cải thiện dc tốc độ)
5' hay 10'.. thậm chí là vài giờ, miển nó chạy dc thì còn tốt... chỉ sợ nó đơ luôn mất công bạn bấm Reset máy ấy chứ
ANH TUẤN
 
Lần chỉnh sửa cuối:
Từ VD của bác viendo, tôi viết code theo suy luận của bác dmtdmtbb và dùng hàm match như gợi ý của bác OkeBab, thấy thời gian để cho ra kết quả là chưa đầy 1 phút (cấu hình máy của tôi: Intel Pentium 3.0GHz x 2, Ram 1.0GB).
PHP:
Sub LocDs()
Dim i As Integer
Dim Rnum1 As Integer, Rnum2 As Integer, m, n, Ti
On Error Resume Next
Rnum1 = Cells(Rows.Count, 1).End(xlUp).Row
Rnum2 = Cells(Rows.Count, 2).End(xlUp).Row
m = 1
n = 1
Ti = Timer
For i = 1 To Rnum1
    If WorksheetFunction.Match(Cells(i, 1), Range("B1:B" & Rnum2), 0) = 0 Then
        Cells(m, 3) = Cells(i, 1)
        m = m + 1
    Else
        Cells(n, 5) = Cells(i, 1)
        n = n + 1
    End If
Next
m = 0
For i = 1 To Rnum2
    If WorksheetFunction.Match(Cells(i, 2), Range("A1:A" & Rnum1), 0) = 0 Then
        Cells(m, 4) = Cells(i, 2)
        m = m + 1
    End If
Next
Cells(1, 7) = Timer - Ti
End Sub
 
/(/hờ các MOD/SMOD xóa giúp bài này, Xin Cảm Ơn Nhiều

/(/hờ các MOD/SMOD xóa giúp bài này, Xin Cảm Ơn Nhiều
Lí do: Trùng lắp bài bên dưới!​

Qynh5.jpg
 
Lần chỉnh sửa cuối:
Test lại các file theo dữ liệu thật ~15.000 dòng với máy Intel(R) Pentium(R) 4 CPU 3.00GHz (2CPUs), Memory 256MB RAM.
  • SA_DQ : hình như code bị sai gì đó nên ra kết quả không đúng, cột C ra có 1 kết quả và cột D không có kết quả nào, cột E thì nhiều quá không kiểm tra, chỉ chạy xong mất 09 giây.
  • Thầy Long : chạy xong mất 62 giây.
  • Dmtdmtbb : chạy xong mất 125 giây. (code mới nhất)
  • Minhlev : chạy xong mất 42 giây.

    Xin gửi lên file thành quả của tập thể các Sư phụ đã bàn luận trao đổi gợi ý và cuối cùng đúc kết nên, xin chân thành cám ơn rất nhiều.
 

File đính kèm

Đọc Topic này thấy các bác so kè với nhau từng phần ngàn phút, cứ y như là thì Chạy 100m thế giới. Thú vị thật.

Mình nghĩ bạn viendo nên đưa File thực tế của bạn (đừng lấy VD vì VD sẽ không thể hiện hết được cái bạn yêu cầu), qua đấy cũng thấy sức sáng tạo của các cao thủ thật đa dạng.

Bội phục!

Thân!
 
viendo đã viết:
Test lại các file theo dữ liệu thật ~15.000 dòng với máy Intel(R) Pentium(R) 4 CPU 3.00GHz (2CPUs), Memory 256MB RAM.
  • SA_DQ : hình như code bị sai gì đó nên ra kết quả không đúng, cột C ra có 1 kết quả và cột D không có kết quả nào, cột E thì nhiều quá không kiểm tra, chỉ chạy xong mất 09 giây.
  • Thầy Long : chạy xong mất 62 giây.
  • Dmtdmtbb : chạy xong mất 125 giây. (code mới nhất)
  • Minhlev : chạy xong mất 42 giây.

    Xin gửi lên file thành quả của tập thể các Sư phụ đã bàn luận trao đổi gợi ý và cuối cùng đúc kết nên, xin chân thành cám ơn rất nhiều.

oh, đôi khi nhâm nhi li cafe mất đến 15' -- 30' trong khi đo ta đợi máy tính mấy giây thì bực mình - lạ wa

đôi khi thuật toán có thời nhanh phải phụ thuộc vào Dl cụ thể - khả năng bao quát của ng lập trình, và quan trọng hơn cách đặt vấn đề bài toán và phạm vi ứng dụng của nó
.
 
Từ VD của VienDo & sửa lại xíu code của Minhlev
Kết quả có giảm thời gian: do mình giảm dần vùng tìm kiếm:
VienDo & các bạn kiểm thử nha; Mình có ghi lại thời lượng máy của mình thực thi tại 'G1'

PHP:
Option Explicit

Public Timer_ As Double
Dim jZ As Long

Sub SearchColumnS()
Dim lrow As Long, lRowB As Long
Dim lTemp As Long

On Error Resume Next
lrow = Cells(Rows.Count, 1).End(xlUp).Row
lRowB = Cells(Rows.Count, 2).End(xlUp).Row

 Range("C3:E" & (lrow + lRowB)).ClearContents
 Sort1Col Range("A2:A" & lrow), Range("A3")
 Sort1Col Range("B2:B" & lrow), Range("B3")
 Range("C2") = "List1<>List2":                      Range("E2") = "List1=List2"
 Range("D2") = "List2<>List1":              Application.ScreenUpdating = False

Timer_ = Timer:             lTemp = 3
For jZ = 3 To lrow
    If Application.Match(Cells(jZ, 1), Range("B" & lTemp & ":B" & lRowB), 0) = 0 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    Else
        Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
2        If jZ > lTemp + 9 Then lTemp = jZ - 9
    End If
Next
lTemp = 3
For jZ = 3 To lRowB
    If Application.Match(Cells(jZ, 2), Range("A" & lTemp & ":A" & lrow), 0) = 0 Then
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
9        If jZ > lTemp + 9 Then lTemp = jZ - 1
    End If
Next
Cells(1, 7) = Timer - Timer_
 With Range("G1").Interior
    If .ColorIndex > 40 Or .ColorIndex < 34 Then .ColorIndex = 34 Else _
        .ColorIndex = .ColorIndex + 1
 End With
End Sub
PHP:
 Public Sub Sort1Col(Rng As Range, Clls As Range)
  Rng.Sort Key1:=Clls, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
viendo đã viết:
Do đang ở cty nên để chiều tối về mới test được, Sư phụ thông cảm nhé. Àh nhờ sư phụ chỉ bỏ cái hàm Time() vào code của sư phụ chỗ nào, hôm qua chỉ bỏ hàm Time() vào được file của Thầy Long, còn khi chạy file sư phụ thì dùng đồng hồ bấm giờ ở ngoài.
.

Mình quên đặt Timer cho bạn :
Vào module chương trình ở dòng Option Explicit thêm khai báo
Dim myTime as double
.....
myTime = Timer
For .......
Next .....
Range("F10").value = Timer - myTime
 
Mr Okebab đã viết:
Mình nghĩ bạn viendo nên đưa File thực tế của bạn (đừng lấy VD vì VD sẽ không thể hiện hết được cái bạn yêu cầu), qua đấy cũng thấy sức sáng tạo của các cao thủ thật đa dạng.
Lúc đầu nghĩ rằng chỉ đưa dữ liệu giả lập để làm vì đưa dữ liệu thật nó nặng quá, nhưng sau đó cũng đã đưa lên dữ liệu thật ở bài #24. Rất cám ơn và xin rút kinh nghiệm lần sau.
tigertiger đã viết:
oh, đôi khi nhâm nhi li cafe mất đến 15' -- 30' trong khi đo ta đợi máy tính mấy giây thì bực mình - lạ wa
đôi khi thuật toán có thời nhanh phải phụ thuộc vào Dl cụ thể - khả năng bao quát của ng lập trình, và quan trọng hơn cách đặt vấn đề bài toán và phạm vi ứng dụng của nó
Xin cám ơn sự góp ý, khi giải quyết dưới 10phút thì đã thấy ok rồi nhưng Anh thấy đấy các bậc Sư phụ chưa chịu hài lòng mà vẫn cố gắng làm tiếp và kết quả tuyệt vời đến không ngờ là xử lý dưới 1 phút. Qua đấy 1 lần nữa chứng tỏ lòng nhiệt tình của các Thầy các Sư phụ, cũng như là 1 nét văn hoá đoàn kết tận tình của GPE.

File So sánh kiểm tra này rất hữu dụng với tôi trong công việc, thiết nghĩ nó cũng có 1 phạm vi ứng dụng nào đó cho các công việc khác nữa.

Một lần nữa xin cám ơn tất cả mọi người.

To Sư phụ SA_DQ : Code cuối cùng quá tuyệt luôn, chính xác và chỉ mất 18 giây. Xin cám ơn Sư phụ đã tận tình trong mấy ngày qua, bữa nào phải offline kính mấy Sư phụ vài ly quá--=0
 
Lần chỉnh sửa cuối:
viendo đã viết:
Một lần nữa xin cám ơn tất cả mọi người.
To SA_DQ : Code cuối cùng quá tuyệt luôn, chính xác và chỉ mất 18 giây. Xin cám ơn Sư phụ đã tận tình trong mấy ngày qua, bữa nào phải offline kính mấy Sư phụ vài ly quá--=0

VienDo chú í các con số cuối cùng của các dòng lệnh mà mình vửa đánh số.

Nếu dữ liệu nhiều dòng trùng liên tục thì phải tăng lên để khỏi sai kết quả;

(Trong DL của bạn cột 'B' có 4 records trùng nhau liên tục đó!)
(Máy của mình chạy dưới 14''!)--=0
 
Thưa bác Sa_DQ, trong code của bác vẫn đưa ra kết quả chưa chính xác do bác thay đổi lTemp trong vòng lặp.
PHP:
....
If jZ > lTemp + 9 Then lTemp = jZ - 1
....
Em viết lại code cho các vòng lặp như sau:
PHP:
....
For jZ = 3 To lrow
    If Application.Match(Cells(jZ, 1), Range("B" & lTemp & ":B" & lRowB), 0) = 0 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    Else
        Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        'If jZ > lTemp + 9 Then lTemp = jZ - 1
        lTemp = Application.Match(Cells(jZ, 1), Range("B1:B" & lRowB), 1)
    End If
Next
lTemp = 3
For jZ = 3 To lRowB
    If Application.Match(Cells(jZ, 2), Range("A" & lTemp & ":A" & lrow), 0) = 0 Then
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        'If jZ > lTemp + 9 Then lTemp = jZ - 1
    Else
        lTemp = Application.Match(Cells(jZ, 2), Range("A1:A" & lrow), 1)
    End If
Next

....
Với cách này, thời gian tuy có lâu hơn một chút nhưng tránh được bỏ sót.
-----
Lúc trước tôi có hơi nhầm trong việc tìm lTemp. Nay đã sửa lại, thấy kết quả vẫn đúng và thời gian lại nhanh hơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Tiếp tục cho đến khi cạn!

minhlev đã viết:
Thưa bác Sa_DQ, trong code của bác vẫn đưa ra kết quả chưa chính xác do bác thay đổi lTemp trong vòng lặp.
Với cách mới này, thời gian tuy có lâu hơn một chút nhưng tránh được bỏ sót.
-----
Lúc trước tôi có hơi nhầm trong việc tìm lTemp. Nay đã sửa lại, thấy kết quả vẫn đúng và thời gian lại nhanh hơn.
Đúng là í tưởng cùng gặp nhau!
Rất cảm ơn bạn vì những nhắc nhỡ ( & cũng là ~ thúc ép tôi tiếp tục cải thiện điều kiện làm việc cho tốt hơn!)
Tuy nhiên, trước đó mình đã nghĩ đến cách tìm lTemp này 1 cách chính xác luôn;
Mình đã thử cách của bạn rồi, thời gian sẽ phải tăng lên 1,6 lần so với trước, nếu không muốn nói là tăng gấp đôi;
Tiếp sau đây bạn thử đoạn mã này. Trong đó mình xác định chính xác 1 lần duy nhất cho 1 cột 'A' hay 'B' giá trị 'lTemp' ứng với nó nói trên;
Về thời gian thì các bạn tự chiêm nghiệm, nha! Một lần nữa xin cảm ơn!
PHP:
Option Explicit
Dim lrow As Long, lRowB As Long
Public Timer_ As Double
Dim jZ As Long

Sub SearchColumnS()

Dim jW As Integer, SoGiam As Integer

On Error Resume Next
lrow = Cells(Rows.Count, 1).End(xlUp).Row
lRowB = Cells(Rows.Count, 2).End(xlUp).Row

 Range("C3:E" & (lrow + lRowB)).ClearContents
 Sort1Col Range("A2:A" & lrow), Range("A3")
 Sort1Col Range("B2:B" & lrow), Range("B3")
 Range("C2") = "List1<>List2":                      Range("E2") = "List1=List2"
 Range("D2") = "List2<>List1":              Application.ScreenUpdating = False

Timer_ = Timer:             jW = 3:         SoGiam = TimTrung(1)
For jZ = 3 To lrow
    If Application.Match(Cells(jZ, 1), Range("B" & jW & ":B" & lRowB), 0) = 0 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    Else
        Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        If jZ > jW + SoGiam Then jW = jZ - SoGiam
    End If
Next
jW = 3:                                 SoGiam = TimTrung(2)
For jZ = 3 To lRowB
    If Application.Match(Cells(jZ, 2), Range("A" & jW & ":A" & lrow), 0) = 0 Then
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        If jZ > jW + SoGiam Then jW = jZ - SoGiam
    End If
Next

Cells(1, 7) = Timer - Timer_
 With Range("G1").Interior
    If .ColorIndex > 40 Or .ColorIndex < 34 Then .ColorIndex = 34 Else _
        .ColorIndex = .ColorIndex + 1
 End With
End Sub
Mã:
[B]Function TimTrung(Cot As Byte)[/B] 

Dim SoR As Long, Wz As Long
 Dim bDem As Byte, bMax As Byte
 
 SoR = lrow + lRowB
 For Wz = 4 To SoR
    With Cells(Wz, Cot)
        If .Value = "" Then Exit For
        If .Offset(-1) = .Value Then
            bDem = bDem + 1
            If bMax < bDem Then bMax = bDem
        Else
            bDem = 0
        End If
    End With
 Next Wz
 TimTrung = bMax + 1
[B]End Function [/B]
PHP:
 Public Sub Sort1Col(Rng As Range, Clls As Range)
  Rng.Sort Key1:=Clls, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub
VienDo chú í: Để hàm mới tạo hiểu được 2 biến lRow & lRowB, mình đã chuyển lên khai báo dùng chung, đó nha!
 

File đính kèm

Lần chỉnh sửa cuối:
SA_DQ đã viết:
Mình đã thử cách của bạn rồi, thời gian sẽ phải tăng lên 1,6 lần so với trước, nếu không muốn nói là tăng gấp đôi;

Thưa bác Sa, chắc là bác thử cái file cũ rồi ạ. Cái file mới em gửi lại chạy ở máy của em hết có 6 giây thôi ạ. Tuy nhiên em mới xem lại bài đó thấy bị sai 1 dòng code trong vòng lặp thứ 2.
Code cũ
PHP:
....
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
....
Code đúng
PHP:
....
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 2)
....
 
Em cũng muốn thử nhào vô, tuy nhiên vì các bác đã gần chạm đích rồi, mà mình bây giờ mới bắt đầu thì . . . còn lâu mới kịp. Vì thế lại thôi.

Tuy nhiên thấy các bác như vậy thì học được nhiều rồi.

Thôi, đành làm kẻ đứng ngoài, chờ các bác rơi vãi cái gì thì nhặt đem về nhà dùng vậy.

Be be be!!
 
Mr Okebab đã viết:
Em cũng muốn thử nhào vô, tuy nhiên vì các bác đã gần chạm đích rồi, mà mình bây giờ mới bắt đầu thì . . . còn lâu mới kịp. Vì thế lại thôi.
Không biết đến khi nào mới chạm được đích???!$@!! !$@!!


Tôi nhận thấy nếu trong cột có nhiều dữ liệu trùng nhau thì sẽ phải chạy nhiều vòng lặp. Chính vì vậy trước khi chạy vòng lặp cần phải lọc ra các cột danh sách duy nhất (dùng Advanced Filter). Sau đó mới so sánh 2 cột danh sách duy nhất này với nhau để tìm ra kết quả. Tuy nhiên tời gian thực hiện lệnh lại lâu hơn 1 chút (khoảng vài phần chục giây).
To: bác viendo
Nếu trong file của bác ít bị trùng dữ liệu trong cột thì không nên dùng cách này.
--------
Như vậy cũng chẳng cần phải Sort cột.
 

File đính kèm

Lần chỉnh sửa cuối:
minhlev đã viết:
Không biết đến khi nào mới chạm được đích???!$@!! !$@!!
Đệ tử đã báo tới rồi tới rồi lúc đạt 3 phút mà các Sư phụ có để ý đâu, đến khi nhìn lại thì các Sư phụ đã cho đếm bằng "giây", lúc mở topic không nghĩ đến kết quả lại có thể đạt được như hiện nay. Chỉ tiếc rằng mình kém quá không hiểu được các góp ý bàn luận của các Sư phụ cũng như các tinh hoa của các code.
Tôi nhận thấy nếu trong cột có nhiều dữ liệu trùng nhau thì sẽ phải chạy nhiều vòng lặp. Chính vì vậy trước khi chạy vòng lặp cần phải lọc ra các cột danh sách duy nhất (dùng Advanced Filter). Sau đó mới so sánh 2 cột danh sách duy nhất này với nhau để tìm ra kết quả.
Danh sách so sánh là danh sách duy nhất nên không cần dùng Adv. Filter đâu, dữ liệu đệ tử đưa lên #24 do sai sót nên có trùng 1 mã mà AnhTuan đã báo thôi.
Đã sử dụng file trong công việc hiện tại và kết quả là rất tuyệt.

Xin cám ơn tất cả.
 
Lúc mở topic không nghĩ đến kết quả lại có thể đạt được như hiện nay. . . . Đã sử dụng file trong công việc hiện tại và kết quả là rất tuyệt. Xin cám ơn tất cả.
To VienDo : Nếu cột 'E' hay 2 cột 'C' & 'D' không cần chép ra mà cần tô màu tại chổ ('A' hay 'B') thì có cản trở gì đến công việc không vậy?
Mình thử không chép cột 'D', mà thay vô đó, ta tô màu các ô cột 'A' thỏa thì cũng nhanh hơn chút đó nha!
VD:
PHP:
    Else
         Cells(jZ, 1).Interior.ColorIndex = 5
' '       Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        If jZ > jW + SoGiam Then jW = jZ - SoGiam
 
SA_DQ đã viết:
To VienDo : Nếu cột 'E' hay 2 cột 'C' & 'D' không cần chép ra mà cần tô màu tại chổ ('A' hay 'B') thì có cản trở gì đến công việc không vậy?
Mình thử không chép cột 'D', mà thay vô đó, ta tô màu các ô cột 'A' thỏa thì cũng nhanh hơn chút đó nha!
Không được đâu Sư phụ ơi, trong công việc phải lọc danh sách ra mới được. Sư phụ tận tình quá -\\/. Thanks

Chúc Sư phụ mạnh khỏe công tác tốt.
 
BAP này khởi sự cuộc chạy đua tốc độ, rồi đứng ngoài hưởng lợi nha!

Mr Okebab đã viết:
Em cũng muốn thử nhào vô, tuy nhiên vì các bác đã gần chạm đích rồi, mà mình bây giờ mới bắt đầu thì . . . còn lâu mới kịp. Vì thế lại thôi. Tuy nhiên . . . các bác như vậy thì học được nhiều rồi. Thôi, đành làm kẻ đứng ngoài, chờ các bác rơi vãi cái gì thì nhặt đem về nhà dùng vậy.
Be be be!!
Bằng chứng ư, đây thôi:
Dùng Countif quả thật nhanh hơn For (đã có bài về vấn đề này), tuy nhiên hàm MATCH sẽ nhanh hơn nhiều. Đơn giản bởi Countif luôn luôn phải quét hết mảng, còn MATCH thì không, đặc biệt là với mảng được sắp xếp.
Thân!
Dù sao cũng rất cảm ơn BAP ta nhiều, trong chuyển ra mồ hôi này!
(Nó lọc sạch tâm tư - như 1 nhà thơ đã nêu!)
Xin chào & hẹn gặp BAP sớm trong kỳ gần đây!)
Tạm biệt Topic luôn nha!
imagesCAHTB5FL.jpg
 
Lần chỉnh sửa cuối:
Xin cho hỏi, vấn đề này sao các anh không sử dụng vlookup???
 
Bọn này để giành cho bạn í chứ!!
Zui nha & đừng zận!
Bạn thử sức mình với í tưởng VLOOKUP() xem sao!
/)/hờ các MOD/SMOD ngang qua đây xóa giúp bài này!​
. . . . . . . .

Các bác xem thử file của em xem và góp ý nhé.
Việc sau đó là sắp xếp lại dữ liệu cho dễ nhìn (động tác này chẳng qua là advance filter và sort dữ liệu lại thôi, cái này các bác ràng hơn em là cái chắc) Em có tạo một cái nút để cho nó tự động làm cái việc này. Thanks các bác trước nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Các bác xem thử file của em xem và góp ý nhé.
Việc sau đó là sắp xếp lại dữ liệu cho dễ nhìn (động tác này chẳng qua là advance filter và sort dữ liệu lại thôi, cái này các bác ràng hơn em là cái chắc) Em có tạo một cái nút để cho nó tự động làm cái việc này. Thanks các bác trước nhé.
Bạn hảy thử với dử liệu lớn khoảng 10.000 dòng trở lên rồi mới nói chuyện tiếp nhé! Ở đây người ta đang quan tâm đến thuật toán về tốc độ đấy! Bạn nghiên cứu xem!
ANH TUẤN
 
Bạn hảy thử với dử liệu lớn khoảng 10.000 dòng trở lên rồi mới nói chuyện tiếp nhé! Ở đây người ta đang quan tâm đến thuật toán về tốc độ đấy! Bạn nghiên cứu xem!
ANH TUẤN

Em cũng không rành về việc đo thời gian. Tuy nhiên em thử với dữ liệu 30.000 dòng, sau khi copy công thức xuống và click nút thì mất khoản 10 giây. cấu hình máy em là Core2Duo 1.6Ghz ram 1Gb.
 
To: Bác SA,
Em đã test file của Bác với cấu hình
CauHinhMay.jpg


Và kết quả sẽ là:
BacSA1.jpg


Nếu Bác thêm vào
Mã:
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
ở đầu thủ tục, và cuối thủ tục
Mã:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Thì kết quả là:
BacSA2.jpg


LVD
 
Lọc tìm số liệu theo điều kiện tương ứng

Chào cả nhà. Mình có hai sheep muốn tìm số liệu của sheep này đưa sang sheep khác với điều kiện lấy tương ứng đúng theo 2 cột số liệu cho trước.
Kèm theo file nhờ mọi người giúp đỡ
Cám ơn rất nhiều!.
 
Chào cả nhà. Mình có hai sheep muốn tìm số liệu của sheep này đưa sang sheep khác với điều kiện lấy tương ứng đúng theo 2 cột số liệu cho trước.
Kèm theo file nhờ mọi người giúp đỡ
Cám ơn rất nhiều!.
Bài này ta dùng VLOOKUP thôi (lý nào bạn chưa biết)
Gõ vào cell G6 công thức:
=VLOOKUP($A6,A201S!$A$6:$G$161,7,0)
 
Từ VD của bác viendo, tôi viết code theo suy luận của bác dmtdmtbb và dùng hàm match như gợi ý của bác OkeBab, thấy thời gian để cho ra kết quả là chưa đầy 1 phút (cấu hình máy của tôi: Intel Pentium 3.0GHz x 2, Ram 1.0GB).
PHP:
Sub LocDs()
Dim i As Integer
Dim Rnum1 As Integer, Rnum2 As Integer, m, n, Ti
On Error Resume Next
Rnum1 = Cells(Rows.Count, 1).End(xlUp).Row
Rnum2 = Cells(Rows.Count, 2).End(xlUp).Row
m = 1
n = 1
Ti = Timer
For i = 1 To Rnum1
    If WorksheetFunction.Match(Cells(i, 1), Range("B1:B" & Rnum2), 0) = 0 Then
        Cells(m, 3) = Cells(i, 1)
        m = m + 1
    Else
        Cells(n, 5) = Cells(i, 1)
        n = n + 1
    End If
Next
m = 0
For i = 1 To Rnum2
    If WorksheetFunction.Match(Cells(i, 2), Range("A1:A" & Rnum1), 0) = 0 Then
        Cells(m, 4) = Cells(i, 2)
        m = m + 1
    End If
Next
Cells(1, 7) = Timer - Ti
End Sub

Sửa chút xíu thế này sẽ cải thiện tốc độ đáng kể (đã test 20 000 dòng trong file đính kèm)
PHP:
Option Explicit

Sub GPE()
Dim Tmp, List1 As Range, List2 As Range, clls As Range
Dim Tg, i As Long, j As Long, t As Long
    Set List1 = Range([a3], [a3].End(xlDown))
    Set List2 = Range([b3], [b3].End(xlDown))
Tg = Timer
For i = 3 To 5
    Range(Cells(3, i), Cells(3, i).End(xlDown)).ClearContents
Next
Tmp = [c3].Resize(60000, 3).Value
i = 0: j = 0: t = 0
For Each clls In List1
    If Application.IsNA(Application.Match(clls, List2, 0)) Then
        i = i + 1: Tmp(i, 1) = clls
    End If
Next
For Each clls In List2
    If Application.IsNA(Application.Match(clls, List1, 0)) Then
        j = j + 1: Tmp(j, 2) = clls
    Else
        t = t + 1: Tmp(t, 3) = clls
    End If
Next
    [c3].Resize(Application.Max(i, j, t), 3) = Tmp
    [g1] = Timer - Tg
End Sub
 

File đính kèm

CÓ bác nào có file êxcel chuẩn của cái trên chưa cho em xin với, hoặc chỉ cần Lọc dữ liệu trùng cột A và B cũng đc, em cảm ơn rất nhiều !
 
Theo em câu lệnh : =IF(ISERROR(MATCH(E2,$A$2:$A$22601,0)),"","Có ở vị trí "&MATCH(E2,$A$2:$A$22601,0))

Là nhanh nhất, chính xác.

Tuy nhiên chỉ áp dụng cho so sánh 2 cột, dữ liệu trùng thì báo.
 
Những người ở bài viết này còn sống ko nhỉ ? Thấy tên Phạm Duy Long ( Thành Viên đã mất ) ko biết ý nghĩa này là gì , hiểu sao cho đúng nữa . Tính hỏi mà thấy vậy ... quỳ lạy luôn .
Trường hợp các bạn đang đề cập ở chủ đề này dường như chỉ nói đến 2 list = nhau thì fai . Khác nhau thì sao ???
Mãi mới kiếm được bài viết giống giống . Tiếc là đã sinh ra mười mấy năm trời . Ko biết lôi đầu lên có bị la mắng ko nữa .
Bài đã được tự động gộp:

CÓ bác nào có file êxcel chuẩn của cái trên chưa cho em xin với, hoặc chỉ cần Lọc dữ liệu trùng cột A và B cũng đc, em cảm ơn rất nhiều !
Bạn này hỏi từ năm đó tới năm nay vẫn chưa có ai hồi đáp . Tới mình chắc xanh cỏ luôn rồi quá . Bởi mới nói cái câu hỏi tưởng chừng đơn giản mà chưa đâu vào đâu
 
Lần chỉnh sửa cuối:
Những người ở bài viết này còn sống ko nhỉ ? Thấy tên Phạm Duy Long ( Thành Viên đã mất ) ko biết ý nghĩa này là gì , hiểu sao cho đúng nữa . Tính hỏi mà thấy vậy ... quỳ lạy luôn .
Trường hợp các bạn đang đề cập ở chủ đề này dường như chỉ nói đến 2 list = nhau thì fai . Khác nhau thì sao ???
Mãi mới kiếm được bài viết giống giống . Tiếc là đã sinh ra mười mấy năm trời . Ko biết lôi đầu lên có bị la mắng ko nữa .
Bài đã được tự động gộp:


Bạn này hỏi từ năm đó tới năm nay vẫn chưa có ai hồi đáp . Tới mình chắc xanh cỏ luôn rồi quá . Bởi mới nói cái câu hỏi tưởng chừng đơn giản mà chưa đâu vào đâu
Hỏi gì gửi file lên coi.
 
Hỏi gì gửi file lên coi.
có ngay . Ở đâu mà dậy sớm vậy bạn ?
Với mình , chỉ cần chọn những dữ liệu của B ko có ở A . Nghĩa là lấy dữ liệu của A mà ko có ở B . Vậy thôi , ko lấy trùng , vì dữ liệu của B đã có trong A rồi , nên chỉ lấy cái ở A ko có ở B . Hy vọng gặp cao nhân chỉ giáo . Thanks . Ko cần nhanh hay chậm . Cứ đúng là đc :D
 

File đính kèm

có ngay . Ở đâu mà dậy sớm vậy bạn ?
Với mình , chỉ cần chọn những dữ liệu của B ko có ở A . Nghĩa là lấy dữ liệu của A mà ko có ở B . Vậy thôi , ko lấy trùng , vì dữ liệu của B đã có trong A rồi , nên chỉ lấy cái ở A ko có ở B . Hy vọng gặp cao nhân chỉ giáo . Cảm ơn . Ko cần nhanh hay chậm . Cứ đúng là đc :D
Ban dung code nay xem nhe.
Mã:
Sub laygiatri()
Dim arr, arr1
Dim lr As Long, a As Long, i As Long
Dim dic As Object, dk As String
Set dic = CreateObject("scripting.dictionary")
With Sheets(1)
    lr = .Range("B" & Rows.Count).End(xlUp).Row
    arr = .Range("b2:b" & lr).Value
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
            dic.Add dk, ""
        End If
    Next i
    lr = .Range("a" & Rows.Count).End(xlUp).Row
    arr = .Range("a2:a" & lr).Value
    ReDim arr1(1 To UBound(arr, 1), 1 To 1)
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
           dic.Add dk, ""    'cai nay la lay duy nhat neu khong can thi bo di
           a = a + 1
           arr1(a, 1) = arr(i, 1)
        End If
    Next i
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 1 Then .Range("C1:C" & lr).ClearContents
    If a Then .Range("C2").Resize(a, 1).Value = arr1
End With
End Sub
 

File đính kèm

Ban dung code nay xem nhe.
Mã:
Sub laygiatri()
Dim arr, arr1
Dim lr As Long, a As Long, i As Long
Dim dic As Object, dk As String
Set dic = CreateObject("scripting.dictionary")
With Sheets(1)
    lr = .Range("B" & Rows.Count).End(xlUp).Row
    arr = .Range("b2:b" & lr).Value
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
            dic.Add dk, ""
        End If
    Next i
    lr = .Range("a" & Rows.Count).End(xlUp).Row
    arr = .Range("a2:a" & lr).Value
    ReDim arr1(1 To UBound(arr, 1), 1 To 1)
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
           dic.Add dk, ""    'cai nay la lay duy nhat neu khong can thi bo di
           a = a + 1
           arr1(a, 1) = arr(i, 1)
        End If
    Next i
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 1 Then .Range("C1:C" & lr).ClearContents
    If a Then .Range("C2").Resize(a, 1).Value = arr1
End With
End Sub
Cảm ơn bạn nhiều lắm . Lâu nay tìm mãi cách làm nhưng dường như dùng mấy công thức so sánh không được . Có lẽ chỉ có thế này mới ra được kết quả đúng .
 
Trường hợp này mình làm thế nào vậy bạn ? Vừa rồi lấy ví dụ , dẫn đến việc có lời giải của bạn , sau đó áp dụng ko được . Tôi cũng có thấy trong này có người hỏi về nội dung này . Tiếc là câu trả lời của Ndu96081631 chỉ đúng với trường hợp chuyển sheet và nó có định dạng tương đương nhau. Trường hợp của mình nó khác nhau về số lượng của 2 cột và khác cả số " LEN " ( Lần đầu thấy chữ này ) . Vậy nên hy vọng có được đáp án đúng để vận dụng vào công việc . Cảm ơn bạn nhiều .
 

File đính kèm

Lần chỉnh sửa cuối:
Trường hợp này mình làm thế nào vậy bạn ? Vừa rồi lấy ví dụ , dẫn đến việc có lời giải của bạn , sau đó áp dụng ko được . Tôi cũng có thấy trong này có người hỏi về nội dung này . Tiếc là câu trả lời của Ndu96081631 chỉ đúng với trường hợp chuyển sheet và nó có định dạng tương đương nhau. Trường hợp của mình nó khác nhau về số lượng của 2 cột và khác cả số " LEN " ( Lần đầu thấy chữ này ) . Vậy nên hy vọng có được đáp án đúng để vận dụng vào công việc . Cảm ơn bạn nhiều .
Bạn nói chi tiết xem nào.Mình đọc không hiểu lắm.Cái nào là dữ liệu cái nào bạn cần trả về kết quả như thế nào.
 
Bạn nói chi tiết xem nào.Mình đọc không hiểu lắm.Cái nào là dữ liệu cái nào bạn cần trả về kết quả như thế nào.
Ý của mình là muốn lọc dữ liệu trùng nhau của 2 cột B và D . Sau đó mình thay vào bằng dữ liệu cho trước . Ví dụ : Ở hàng đầu tiên bạn thấy ô B4 trùng với ô D4 , nên kết quả sẽ là Nguyễn Anh Vu : 1 . Tiếp theo ô B6 trùng với ô D5 , nên kết quả sẽ là Đào Văn Tân : 2 ... Theo mình hiểu cái này là lọc dữ liệu trùng nhau , sau đó thay thế nó với dữ liệu có ở ban đầu . Tương tự như cách làm trước đó của bạn , nhưng ở đây là lấy dữ liệu trùng nhau , sau đó thay thế nó .
 
Ý của mình là muốn lọc dữ liệu trùng nhau của 2 cột B và D . Sau đó mình thay vào bằng dữ liệu cho trước . Ví dụ : Ở hàng đầu tiên bạn thấy ô B4 trùng với ô D4 , nên kết quả sẽ là Nguyễn Anh Vu : 1 . Tiếp theo ô B6 trùng với ô D5 , nên kết quả sẽ là Đào Văn Tân : 2 ... Theo mình hiểu cái này là lọc dữ liệu trùng nhau , sau đó thay thế nó với dữ liệu có ở ban đầu . Tương tự như cách làm trước đó của bạn , nhưng ở đây là lấy dữ liệu trùng nhau , sau đó thay thế nó .
Bạn chạy thử code này xem đúng không nhé.Nếu không đúng thì bạn ghi dõ dữ liệu có và kết quả cần có nhé.
Mã:
Sub thaydoi()
Dim arr
Dim dic As Object
Dim a As Long, lr As Long, i As Long
Dim dk As String
Set dic = CreateObject("scripting.dictionary")
With Sheet1
     lr = .Range("D" & Rows.Count).End(xlUp).Row
     If lr < 4 Then Exit Sub
     arr = .Range("D4:E" & lr).Value
     For i = 1 To UBound(arr, 1)
         dk = Trim(arr(i, 1))
         If Not dic.exists(dk) Then
            dic.Add dk, arr(i, 2)
         End If
     Next i
     lr = .Range("b" & Rows.Count).End(xlUp).Row
     If lr < 4 Then Exit Sub
     arr = .Range("A4:B" & lr).Value
     For i = 1 To UBound(arr, 1)
         dk = Trim(arr(i, 2))
         If dic.exists(dk) Then
            arr(i, 1) = dic.Item(dk)
         End If
     Next i
     .Range("A4:B" & lr).Value = arr
End With
End Sub
 
Hình như chưa được . Ở tệp này , mình có giải thích sẵn trong đó , và có viết kết quả 7 8 dòng. Chắc bạn đã hình dùng được . Mình có sửa lại họ và tên để bạn không bị lỗi font chữ. Cảm ơn bạn nhiều
 

File đính kèm

Những người ở bài viết này còn sống ko nhỉ ? Thấy tên Phạm Duy Long ( Thành Viên đã mất ) ko biết ý nghĩa này là gì , hiểu sao cho đúng nữa . Tính hỏi mà thấy vậy ... quỳ lạy luôn .
[Thành viên đã mất] đúng là những thành viên đã về cõi Vĩnh hằng. Nhưng nhiều người trong họ như OKEBAP, thầy Long mà bạn nhắc tới, . . . . (nhiều người khác nữa). . . đã để lại cho diễn đàn chúng ta những đứa con tinh thần của họ rất đáng giá, vô cùng quí báu & quan trọng hơn cả là rất đáng trân trọng!
Rất nên trân trọng câu từ & thành kính với những người đã khuất!
 
[Thành viên đã mất] đúng là những thành viên đã về cõi Vĩnh hằng. Nhưng nhiều người trong họ như OKEBAP, thầy Long mà bạn nhắc tới, . . . . (nhiều người khác nữa). . . đã để lại cho diễn đàn chúng ta những đứa con tinh thần của họ rất đáng giá, vô cùng quí báu & quan trọng hơn cả là rất đáng trân trọng!
Rất nên trân trọng câu từ & thành kính với những người đã khuất!
Thật sự tôi ko biết ở đây đã từng có 1 diễn đàn đông vui , và tồn tại rất lâu rồi chứ. Cũng có thể do số lượng thành viên càng lúc càng sút giảm nên bây giờ mọi người ko còn hoạt động liên tục như xưa. Có lẽ trong đây có 1 mình tôi duy nhất thuộc dạng dốt nhất . Qủa thật tôi ko biết gì . Và tôi cũng chỉ mới biết đến nó vài hôm. Tôi chỉ muốn tìm hiểu và nghịch phá trên máy vậy thôi . Còn vận dụng về sau này hay ko tôi cũng chưa biết . Dù sao tôi cũng rất cảm ơn các bạn đã hỗ trợ .
Còn về vấn đề viết chữ đã mất đúng như tôi nói nó khó hiểu. Tôi nghĩ để đơn giản vấn đề , rõ ràng hơn thì mình để chữ đã khuất nó tế nhị . Và cũng ko làm bất cứ ai tò mò về họ nữa . Đó là ý kiến riêng của tôi. R.I.P
 
Mình ko ngờ đơn giản chỉ dùng command để có kết quả . Vì xem , tìm hiểu video bài viết nhiều , mình làm theo đều hỏng bét. Cũng có 1 2 lần để ý INDEX , nhưng nếu ko kết hợp đúng là ko ra được . Có lẽ thấy từ đầu topic này mọi ng tập trung vào viết Marco , nên cứ nghĩ Marco dễ hơn . Cảm ơn bạn nhiều lắm. Bây giờ mới thấy được 1 bài Excel vô số cách xử lý và giải quyết . Chỉ có thể là thuộc lệnh , và hiểu rõ chức năng của nó . Cách nào cũng hay và có ưu nhược điểm riêng . 1 lần nữa chân thành cảm ơn bạn .
 
Bạn chạy thử code này xem đúng không nhé.Nếu không đúng thì bạn ghi dõ dữ liệu có và kết quả cần có nhé.
Mã:
Sub thaydoi()
Dim arr
Dim dic As Object
Dim a As Long, lr As Long, i As Long
Dim dk As String
Set dic = CreateObject("scripting.dictionary")
With Sheet1
     lr = .Range("D" & Rows.Count).End(xlUp).Row
     If lr < 4 Then Exit Sub
     arr = .Range("D4:E" & lr).Value
     For i = 1 To UBound(arr, 1)
         dk = Trim(arr(i, 1))
         If Not dic.exists(dk) Then
            dic.Add dk, arr(i, 2)
         End If
     Next i
     lr = .Range("b" & Rows.Count).End(xlUp).Row
     If lr < 4 Then Exit Sub
     arr = .Range("A4:B" & lr).Value
     For i = 1 To UBound(arr, 1)
         dk = Trim(arr(i, 2))
         If dic.exists(dk) Then
            arr(i, 1) = dic.Item(dk)
         End If
     Next i
     .Range("A4:B" & lr).Value = arr
End With
End Sub
Ok cảm ơn bạn nhiều lắm . Lúc đầu cứ nghĩ sẽ đợi lâu dài . Ko ngờ mọi người nhiệt tình quá . ước gì có thể có trình độ như các bạn . Tôi cần học hỏi thật nhiều .
 
Còn về vấn đề viết chữ đã mất đúng như tôi nói nó khó hiểu. Tôi nghĩ để đơn giản vấn đề , rõ ràng hơn thì mình để chữ đã khuất nó tế nhị . Và cũng ko làm bất cứ ai tò mò về họ nữa . Đó là ý kiến riêng của tôi. R.I.P
Chuyện này bạn hoàn toàn có thể gởi bài đến ban điều hành; BĐH có riêng 1 mục để mọi thành viên góp ý mà!
Chúc bạn có nhiều niềm vui khi đến với diễn đàn!
 
R.I.P nghĩa là gì vậy?
Sợ nhất là tiếng Anh lồng trong tiếng Việt. Chả hiểu người dùng muốn nói ngữ cảnh tiếng nào.
 
Bác VetMini, post: 901634, member: 780703 à, đó là Rau Ít Phân
Khá khen cho tài ứng biến , đưa ra đáp án hợp với dữ liệu ban đầu . Muốn té ghế luôn .
R.I.P : Thay cho lời cầu nguyện , hãy yên nghĩ . Chỉ thế thôi . Sâu hơn nữa thì chưa học tới bạn ơi .
 
Ok cảm ơn bạn nhiều lắm . Lúc đầu cứ nghĩ sẽ đợi lâu dài . Ko ngờ mọi người nhiệt tình quá . ước gì có thể có trình độ như các bạn . Tôi cần học hỏi thật nhiều .
Bác này mấy dạo trước còn đăng bài nhờ và mọi người góp ý "Giải thích rõ kết quả mong muốn" mà bác chưa giải thích kết quả.
Vậy bài viết trong link sau https://www.giaiphapexcel.com/diendan/threads/help-me-tìm-kiếm-và-lọc-dữ-liệu.140058/#post-900839
Bác đã tìm ra cách giải quyết chưa?
 
Bác này mấy dạo trước còn đăng bài nhờ và mọi người góp ý "Giải thích rõ kết quả mong muốn" mà bác chưa giải thích kết quả.
Vậy bài viết trong link sau https://www.giaiphapexcel.com/diendan/threads/help-me-tìm-kiếm-và-lọc-dữ-liệu.140058/#post-900839
Bác đã tìm ra cách giải quyết chưa?
Nói thiệt là chưa làm được. Dùng đúng công thức mà nó cứ hiện #N/A hoài. Còn bài bạn nói chỉ là ví dụ thôi . Tính bê luôn cái dữ liệu mà thôi làm phiền mọi ng quá. Ghép từng hàng cũng đc . Dần sẽ quen. Có mấy hàng... ngắn ngủn à . Mang tiếng dấu dốt vậy .
 
Tại sao 2 chuỗi của tôi y chang nhau , lại có số LEN khác nhau vậy mọi người ? Giai thích cho tôi hiểu khúc này với . Tôi sai ở chỗ này thì fai~ . Ngồi đếm mãi thấy 32 kí tự . Nhưng 1 bên là 32 , 1 bên 33 . Vậy thì sao mà dùng công thức hay gì gì đc
 
Tại sao 2 chuỗi của tôi y chang nhau , lại có số LEN khác nhau vậy mọi người ? Giai thích cho tôi hiểu khúc này với . Tôi sai ở chỗ này thì fai~ . Ngồi đếm mãi thấy 32 kí tự . Nhưng 1 bên là 32 , 1 bên 33 . Vậy thì sao mà dùng công thức hay gì gì đc
Hôm trước mình làm cái hàm Trim đó.Nó bị thừa 1 dấu cách ở cuối dòng len 33.
 
Ban oi trường hợp này thì sao vậy ? Qủa thực mỏi tay quá . Xin lỗi chịu ko nổi
Bài đã được tự động gộp:

Hôm trước mình làm cái hàm Trim đó.Nó bị thừa 1 dấu cách ở cuối dòng len 33.
Nếu trường hợp đó mà thay vào cái kia thì công thức ... sai rồi . Tôi đến bó tay cái cảnh này . Đúng là mình đã dốt còn chơi khó . Yên lành như ng khác ko được thì fai
 

File đính kèm

Hình như được rồi . Mình loại khoảng thừa rồi . Mình làm đc rồi hihi
Bài đã được tự động gộp:

Thay thế khoảng thừa = 0 . Thế là chúng = nhau. Phải chi lúc đầu bạn làm cách này ... mình sẽ rõ hơn . Thấy 32 33 ... chẳng hiểu gì cả . Thông cảm tôi mới vào nghề . Chưa biết Len hay gì gì cả :P
 
Hình như được rồi . Mình loại khoảng thừa rồi . Mình làm đc rồi hihi
Bài đã được tự động gộp:

Thay thế khoảng thừa = 0 . Thế là chúng = nhau. Phải chi lúc đầu bạn làm cách này ... mình sẽ rõ hơn . Thấy 32 33 ... chẳng hiểu gì cả . Thông cảm tôi mới vào nghề . Chưa biết Len hay gì gì cả :P
1 công thức khác để bạn sử dụng
 

File đính kèm

Bạn thử Sub SoSanh này:

Mã:
Sub SoSanh()
Dim List1 As Range, List2 As Range, List12 As Range
Sheets("Check").Select
Range(Cells(3, 3), Cells(65536, 5)).ClearContents
rc = Cells(3, 1).End(xlDown).Row
Set List1 = Range(Cells(3, 1), Cells(rc, 1))
Set List2 = Range(Cells(3, 2), Cells(rc, 2))
Set List12 = Range(Cells(3, 5), Cells(rc, 5))
r1 = 3
r2 = 3
r12 = 3
For r = 3 To rc
[COLOR=blue]  'So sanh list1 voi list2[/COLOR]
  kiemtra = Application.WorksheetFunction.CountIf(List2, Cells(r, 1))
  If kiemtra = 0 Then 'list1<>list2
    Cells(r1, 3) = Cells(r, 1)
    r1 = r1 + 1
  Else                  [COLOR=blue] 'list1=list2
[/COLOR]    kiemtra = Application.WorksheetFunction.CountIf(List12, Cells(r, 1))
    If kiemtra = 0 Then
      Cells(r12, 5) = Cells(r, 1)
      r12 = r12 + 1
    End If
  End If
 
[COLOR=blue] 'So sanh list1 voi list2[/COLOR]
  kiemtra = Application.WorksheetFunction.CountIf(List1, Cells(r, 2))
  If kiemtra = 0 Then 'list2<>list1
    Cells(r2, 4) = Cells(r, 2)
    r2 = r2 + 1
  Else                  [COLOR=blue] 'list1=list2
[/COLOR]    kiemtra = Application.WorksheetFunction.CountIf(List12, Cells(r, 2))
    If kiemtra = 0 Then
      Cells(r12, 5) = Cells(r, 2)
      r12 = r12 + 1
    End If
  End If
Next
End Sub


Bạn ơi file bạn sai sao ấy. Mình test thử ko đúng. :(
 

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

Back
Top Bottom