Công thức lọc trùng 2 điều kiện

Liên hệ QC

Montagne

Thành viên mới
Tham gia
9/2/09
Bài viết
7
Được thích
2
Chào các anh/chị!!
Hiện tai e có 1 CSDL rất lớn tuy nhiên trong đó em muốn lọc ra trùng 2 điều kiện :
VD: trong bảng tính của e có các mã số 258,259,260 cạnh cột mã số sẽ có số tiền mà họ nhận được, tuy nhiên không có 1 mã số mà nhận được thêm lần tiền giống nhau như mã số 258 đã nhận 1 lần 50k rồi thì sẽ không nhận thêm lần 50k nữa. Nên em muốn lọc ra những lần mà mã số 258 nhận trùng với lần trước đó thì em sẽ làm như thế nào?
Nhưng khi dùng tính năng Filter em kiểm tra rất lâu vì CSDL của em rất nhiều, có anh chị nào có công thức hoặc cách làm nào nhanh hơn giúp em được không ạ! Em cảm ơn rất nhiều.
 

File đính kèm

  • Cong thuc trung 2 dieu kien.xls
    13.5 KB · Đọc: 68
Chào các anh/chị!!
Hiện tai e có 1 CSDL rất lớn tuy nhiên trong đó em muốn lọc ra trùng 2 điều kiện :
VD: trong bảng tính của e có các mã số 258,259,260 cạnh cột mã số sẽ có số tiền mà họ nhận được, tuy nhiên không có 1 mã số mà nhận được thêm lần tiền giống nhau như mã số 258 đã nhận 1 lần 50k rồi thì sẽ không nhận thêm lần 50k nữa. Nên em muốn lọc ra những lần mà mã số 258 nhận trùng với lần trước đó thì em sẽ làm như thế nào?
Nhưng khi dùng tính năng Filter em kiểm tra rất lâu vì CSDL của em rất nhiều, có anh chị nào có công thức hoặc cách làm nào nhanh hơn giúp em được không ạ! Em cảm ơn rất nhiều.
Kiểm tra trùng mấy lần - cho tại Ô D3: =SUMPRODUCT(($B$3:$B$14=B3)*($C$3:$C$14=C3))
Thông báo - cho tại ô E3 =IF(SUMPRODUCT(($B$3:$B3=B3)*($C$3:$C3=C3))=1,"","đã nhận rồi")

Rồi fill xuống
 
Kiểm tra trùng mấy lần - cho tại Ô D3: =SUMPRODUCT(($B$3:$B$14=B3)*($C$3:$C$14=C3))
Thông báo - cho tại ô E3 =IF(SUMPRODUCT(($B$3:$B3=B3)*($C$3:$C3=C3))=1,"","đã nhận rồi")

Rồi fill xuống


Anh ơi em cũng đang cần công thức lọc. Mong anh xem trong file đính kèm và giúp đỡ!
Em cảm ơn rất nhiều.
 

File đính kèm

  • loc so lieu.xls
    16 KB · Đọc: 36
Anh ơi em cũng đang cần công thức lọc. Mong anh xem trong file đính kèm và giúp đỡ!
Em cảm ơn rất nhiều.
Số người đi đủ các tuần là như thế nào vậy? Bạn cần giải thích rõ hơn yêu cầu của bài toán. Bạn Có thể điền kết quả mong muốn vào để rễ hiểu hơn.
 
Bạn dùng Filter như thế nào vậy

Nhưng khi dùng tính năng Filter em kiểm tra rất lâu vì CSDL của em rất nhiều, có anh chị nào có công thức hoặc cách làm nào nhanh hơn giúp em được không ạ!

Tuy nhiên theo mình võ đoán thì dùng filter đã chậm, thì xài công thức cũng chậm; Mà có khi còn chậm hơn.

Theo mình nghĩ, nếu ta Sort được theo trường mã thì sẽ có cách cải thiện tình hình hơn.

Xin chờ fản hồi từ tác giả.

Chúc cuối tuần vui vẽ!
 
Số người đi đủ các tuần là như thế nào vậy? Bạn cần giải thích rõ hơn yêu cầu của bài toán. Bạn Có thể điền kết quả mong muốn vào để rễ hiểu hơn.

Vâng em đã điền kết quả, đây em chỉ lấy ví dụ vì tên người và số tuần họ đi công tác người đi còn lặp rất nhiều lần.
Mong các anh chị giúp đỡ!
 

File đính kèm

  • loc so lieu.xls
    17.5 KB · Đọc: 30
Lần chỉnh sửa cuối:
Vâng em đã điền kết quả, đây em chỉ lấy ví dụ vì tên người và số tuần họ đi công tác người đi còn lặp rất nhiều lần.
Mong các anh chị giúp đỡ!
Đọc file cần nhờ giúp của Bạn lần trước "chả hiểu", lần này thì "chẳng hiểu". Bạn muốn giúp đặt công thức như thế nào thì diễn giải rõ trong bảng tính chứ ghi kết quả không không thế ai mà hiểu nỗi.
 
Đọc file cần nhờ giúp của Bạn lần trước "chả hiểu", lần này thì "chẳng hiểu". Bạn muốn giúp đặt công thức như thế nào thì diễn giải rõ trong bảng tính chứ ghi kết quả không không thế ai mà hiểu nỗi.

Em cũng khó diễn tả quả! ý của em là tìm
ô H3 em muốn tìm xem có mấy người đi đủ cả 4 tuần 1, 5, 13, 17;
Ô I3, J3, K3 em muốn thống kê tên của những người đi đủ trong 4 tuần đó.
Cảm ơn các anh..
 
Mình hiểu rồi đây, & chỉ thực hiện được bằng macro thôi

Đọc file của Bạn lần trước "chả hiểu", lần này thì "chẳng hiểu".
Bạn muốn giúp đặt công thức như thế nào thì diễn giải rõ trong bảng tính chứ ghi kết quả không không thế ai mà hiểu nỗi.
Có nghĩa là ta chọn 1 lúc từ 2 đến 4 ô thuộc các cột 'D:G' của 1 dòng nào đó bất kỳ (Ví dụ ta chọn vùng 'D3:F3'
thì cần tra tại cột 'B' trong bảng giới hạn bỡi 3 cột đầu để chọn tất thẩy các dòng đó;
Từ các dòng tra được đó, ta cần tìm người nào có đủ ở ba dòng có trị bằng với trị trong số ô ta chọn ban đầu thì ghi vô cột 'I' trở đi;
Tổng số người đạt yêu cầu sẽ được ghi tại cột 'H' cùng dòng với các ô đã chọn.

Kỳ công chưa: Đảm bảo bảng dịch không sơ sót!

Còn đây là lời giải kèm theo bảng dịch tiếng Việt ra tiếng Việt nêu trên:

PHP:
Option Explicit
Sub FindAll()
 Dim Cls As Range, Rng As Range, sRng As Range
 Dim Rw As Long, jJ As Byte, Ff As Byte, DemO As Byte
 Const NC As String = "@":                      Dim KhDu As Boolean
  
 Rw = Selection.Row:                            DemO = Selection.Count
 If DemO < 2 Or DemO > 4 Then
   Cells(Rw, "H").Resize(, 2).Value = "GPE":    Exit Sub
 End If
 ReDim Mang(1 To DemO - 1):                     Dim MyAdd As String
 
 Selection.Interior.ColorIndex = 35 + Rw Mod 9
 Cells(Rw, "H").Resize(, 5).Value = ""
 For Each Cls In Selection
   jJ = jJ + 1
   Set Rng = Range([B1], [B65500].End(xlUp))
   Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      MyAdd = sRng.Address
      Do
         If jJ < DemO Then
            Mang(jJ) = Mang(jJ) & NC & sRng.Offset(, 1).Value
         Else
            KhDu = False
            For Ff = 1 To jJ - 1
               If InStr(Mang(Ff), NC & sRng.Offset(, 1).Value) < 1 Then
                  KhDu = True:                     Exit For
               End If
            Next Ff
            If KhDu = False Then
               Cells(Rw, "H") = Cells(Rw, "H") + 1
               Cells(Rw, "O").End(xlToLeft).Offset(, 1).Value = sRng.Offset(, 1).Value
            End If
         End If
         Set sRng = Rng.FindNext(sRng)
      Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
   End If
 Next Cls
End Sub

Lưu í khi dùng: Cần chọn các ô trước khi cho chạy macro; Macro mình đã cài tổ hợp fím tắc: {CTRL}+{SHIFT}+F

Chúc thành công & vui vẽ!

 

File đính kèm

  • GPE.rar
    12.5 KB · Đọc: 28
Có nghĩa là ta chọn 1 lúc từ 2 đến 4 ô thuộc các cột 'D:G' của 1 dòng nào đó bất kỳ (Ví dụ ta chọn vùng 'D3:F3'
thì cần tra tại cột 'B' trong bảng giới hạn bỡi 3 cột đầu để chọn tất thẩy các dòng đó;
Từ các dòng tra được đó, ta cần tìm người nào có đủ ở ba dòng có trị bằng với trị trong số ô ta chọn ban đầu thì ghi vô cột 'I' trở đi;
Tổng số người đạt yêu cầu sẽ được ghi tại cột 'H' cùng dòng với các ô đã chọn.

Kỳ công chưa: Đảm bảo bảng dịch không sơ sót!

Còn đây là lời giải kèm theo bảng dịch tiếng Việt ra tiếng Việt nêu trên:

PHP:
Option Explicit
Sub FindAll()
Dim Cls As Range, Rng As Range, sRng As Range
Dim Rw As Long, jJ As Byte, Ff As Byte, DemO As Byte
Const NC As String = "@": Dim KhDu As Boolean

Rw = Selection.Row: DemO = Selection.Count
If DemO < 2 Or DemO > 4 Then
Cells(Rw, "H").Resize(, 2).Value = "GPE": Exit Sub
End If
ReDim Mang(1 To DemO - 1): Dim MyAdd As String

Selection.Interior.ColorIndex = 35 + Rw Mod 9
Cells(Rw, "H").Resize(, 5).Value = ""
For Each Cls In Selection
jJ = jJ + 1
Set Rng = Range([B1], [B65500].End(xlUp))
Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
If jJ < DemO Then
Mang(jJ) = Mang(jJ) & NC & sRng.Offset(, 1).Value
Else
KhDu = False
For Ff = 1 To jJ - 1
If InStr(Mang(Ff), NC & sRng.Offset(, 1).Value) < 1 Then
KhDu = True: Exit For
End If
Next Ff
If KhDu = False Then
Cells(Rw, "H") = Cells(Rw, "H") + 1
Cells(Rw, "O").End(xlToLeft).Offset(, 1).Value = sRng.Offset(, 1).Value
End If
End If
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
Next Cls
End Sub

Lưu í khi dùng: Cần chọn các ô trước khi cho chạy macro; Macro mình đã cài tổ hợp fím tắc: {CTRL}+{SHIFT}+F

Chúc thành công & vui vẽ!


Em cảm ơn bác đã diễn giải đúng ý bài của em. Bác có thể làm bằng công thức không?
 
Hàm tự tạo, nha!

Bác có thể làm bằng công thức không?

PHP:
Option Explicit:              Option Base 1

Function TimKiem(Tuan As Range, LookUp As Range, Optional SoNguoi As Boolean = True)
 Dim Cls As Range, Rng As Range, Clls As Range
 Dim Rw As Long, jJ As Byte, Ff As Byte, DemO As Byte, Dem As Byte
 Const NC As String = "@":                         Dim KhDu As Boolean
  
 Rw = Tuan.Row:                                    DemO = Tuan.Count
 If DemO < 2 Or DemO > 4 Then
   TimKiem = "GPE.COM":                            Exit Function
 End If
 ReDim Mang(1 To DemO - 1):                        ReDim Ten(1, 5) As String
 Set Rng = LookUp.Cells(1, 1).Resize(LookUp.Rows.Count)
 For Each Cls In Tuan
   jJ = jJ + 1:                                    Ten(1, 6 - jJ) = ""
   For Each Clls In Rng
      If Clls.Value = Cls.Value Then
         If jJ < DemO Then
            Mang(jJ) = Mang(jJ) & NC & Clls.Offset(, 1).Value
         Else
            KhDu = False
            For Ff = 1 To jJ - 1
               If InStr(Mang(Ff), NC & Clls.Offset(, 1).Value) < 1 Then
                  KhDu = True:                     Exit For
               End If
            Next Ff
            If KhDu = False Then
               Dem = Dem + 1
               Ten(1, Dem) = Clls.Offset(, 1).Value
            End If
         End If
      End If
   Next Clls
 Next Cls
 If SoNguoi = False Then TimKiem = Ten Else TimKiem = Dem
End Function

Xem cú fáp hàm mảng tự tạo trong file
 

File đính kèm

  • GPE.rar
    11.9 KB · Đọc: 46
PHP:
Option Explicit: Option Base 1

Function TimKiem(Tuan As Range, LookUp As Range, Optional SoNguoi As Boolean = True)
Dim Cls As Range, Rng As Range, Clls As Range
Dim Rw As Long, jJ As Byte, Ff As Byte, DemO As Byte, Dem As Byte
Const NC As String = "@": Dim KhDu As Boolean

Rw = Tuan.Row: DemO = Tuan.Count
If DemO < 2 Or DemO > 4 Then
TimKiem = "GPE.COM": Exit Function
End If
ReDim Mang(1 To DemO - 1): ReDim Ten(1, 5) As String
Set Rng = LookUp.Cells(1, 1).Resize(LookUp.Rows.Count)
For Each Cls In Tuan
jJ = jJ + 1: Ten(1, 6 - jJ) = ""
For Each Clls In Rng
If Clls.Value = Cls.Value Then
If jJ < DemO Then
Mang(jJ) = Mang(jJ) & NC & Clls.Offset(, 1).Value
Else
KhDu = False
For Ff = 1 To jJ - 1
If InStr(Mang(Ff), NC & Clls.Offset(, 1).Value) < 1 Then
KhDu = True: Exit For
End If
Next Ff
If KhDu = False Then
Dem = Dem + 1
Ten(1, Dem) = Clls.Offset(, 1).Value
End If
End If
End If
Next Clls
Next Cls
If SoNguoi = False Then TimKiem = Ten Else TimKiem = Dem
End Function

Xem cú fáp hàm mảng tự tạo trong file


Cảm ơn Bác. Em xem cú pháp mà không hiểu. Mong bác tạo hộ em công thức ở ô L2.
 
Bạn xem cú fáp hàm thường ờ vùng 'L2:L6' & hàm mảng tại 'M2:N5' đó thôi

Nhưng chú í khi xài hàm mảng, ví dụ : để hiễn thị kết quả những người trực đủ các ngày tại vùng 'D2:G2' ta dùng chuột tô chọn 2 ô 'M2:N2'
Bước tiếp sau là nhấn chuột lên thanh công thức & nhập cú fáp: =TimKiem(D2:G2,BgTra,FALSE)
Kết thúc bằng cách bấm tổ hợp fím dành cho hàm mảng đó nha!

Chúc thành công với các ô tương tự hàng bên dưới đến khi chán thì nghỉ!--=0
 
Web KT
Back
Top Bottom