kiểm tra giá trị có nằm trong mảng

Liên hệ QC

dragonboy

Thành viên chính thức
Tham gia
3/9/07
Bài viết
98
Được thích
21
Mình có câu hỏi thế này nhờ các bạn giải đáp giúp mình
Cầu hỏi nằm trong file luôn, các bạn download về rồi giúp mình nhé
 

File đính kèm

Mình có câu hỏi thế này nhờ các bạn giải đáp giúp mình
Cầu hỏi nằm trong file luôn, các bạn download về rồi giúp mình nhé
Bài này có thể dùng phương thức FIND để xác định (giống như bạn bấm Ctrl + F để tìm ấy)
Code tham khảo
PHP:
Sub KiemTra()
  Dim FRng As Range
  With Range("A1:A100")
    Set FRng = .Find(Range("E1").Value, , xlValues, xlWhole)
    If Not FRng Is Nothing Then
      MsgBox "Tim thay"
    Else
      MsgBox "Khong tim thay"
    End If
  End With
End Sub
Ngoài ra còn nhiều cách khác như dùng COUNTIF, MATCH...
 
Upvote 0
Mình có câu hỏi thế này nhờ các bạn giải đáp giúp mình
Cầu hỏi nằm trong file luôn, các bạn download về rồi giúp mình nhé
Một cách dùng countif
Mã:
Public Function tim(vung, dk As Range) As String
 If Application.WorksheetFunction.CountIf(vung, dk) > 0 Then
    tim = "Co"
    Else
    tim = "khong"
 End If
End Function
 
Upvote 0
Ndu à, Ndu lại quên tuyệt chiêu của mình à

Mã:
Function Str_Ex(Rg As Range, ch As String) As Boolean
With WorksheetFunction
str_Ex = InStr(1, Join(.Transpose(Rg), ";"), ch) > 0
End With
End Function

Cú pháp = Str_Ex(A1:A5,E1)
 
Upvote 0
Ndu à, Ndu lại quên tuyệt chiêu của mình à

Mã:
Function Str_Ex(Rg As Range, ch As String) As Boolean
With WorksheetFunction
str_Ex = InStr(1, Join(.Transpose(Rg), ";"), ch) > 0
End With
End Function
Cú pháp = Str_Ex(A1:A5,E1)
Em lo rằng cách dùng InStr sẽ dể có nguy cơ... nhầm
Ví dụ:
- Cell A1 chứa chuổi: Nguyễn Huỳnh Bảo Tâm
- Ta gõ vào E1 từ khóa: Huỳnh Bảo Tâm
- Hàm của anh nó ra kết quả = TRUE
-----------------------------------
Trong trường hợp yêu cầu tìm không chính xác (như tra từ điển) thì cách này chấp nhận được, ngược lại, để tìm chính xác thì em nghĩ nên dùng Find method hoặc hàm MATCH hay COUNTIF sẽ tốt hơn
 
Lần chỉnh sửa cuối:
Upvote 0
Em lo rằng cách dùng InStr sẽ dể có nguy cơ... nhầm
Ví dụ:
- Cell A1 chứa chuổi: Nguyễn Huỳnh Bảo Tâm
- Ta gõ vào E1 từ khóa: Huỳnh Bảo Tâm
- Hàm của anh nó ra kết quả = TRUE
-----------------------------------
Trong trường hợp yêu cầu tìm không chính xác (như tra từ điển) thì cách này chấp nhận được, ngược lại, để tìm chính xác thì em nghĩ nên dùng Find method hoặc hàm MATCH hay COUNTIF sẽ tốt hơn

Mình thích nó khác 1 chút để tham khảo, vậy thì ta chơi chiêu anh Duyệt mới giới thiệu xem sao (Cái này mình chưa xác định cách so sánh nên chưa phân biệt chữ thường và chữ hoa)

Mã:
Function Str_In(Rg As Range, ch As String)
    Dim Clls As Range
    Dim colUniqueNumbers As New Collection
    Dim i, sl As Integer
    On Error Resume Next
    For Each Clls In Rg
        colUniqueNumbers.Add Clls.Value, CStr(Clls.Value)
    Next Clls
    sl = colUniqueNumbers.Count
        colUniqueNumbers.Add ch, ch
    Str_In = sl = colUniqueNumbers.Count
End Function
Cú pháp: =Str_In(A1:A10,E1)

Nói thật, cái này với dictionary là mình khá tin đấy nha.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thích nó khác 1 chút để tham khảo, vậy thì ta chơi chiêu anh Duyệt mới giới thiệu xem sao (Cái này mình chưa xác định cách so sánh nên chưa phân biệt chữ thường và chữ hoa)

Mã:
Function Str_In(Rg As Range, ch As String)
    Dim Clls As Range
    Dim colUniqueNumbers As New Collection
    Dim i, sl As Integer
    On Error Resume Next
    For Each Clls In Rg
        colUniqueNumbers.Add Clls.Value, CStr(Clls.Value)
    Next Clls
    sl = colUniqueNumbers.Count
        colUniqueNumbers.Add ch, ch
    Str_In = sl = colUniqueNumbers.Count
End Function
Cú pháp: =Str_In(A1:A10,E1)

Nói thật, cái này với dictionary là mình khá tin đấy nha.
Collection Dictionary nhìn chung là khá giống nhau! Trước đây em đã từng xài, tuy nhiên, kể từ khi biết đến Dictionary thì em không còn xài đến Collection nữa, đơn giản vì em thấy Dictionary cho ta nhiều phương thức và thuộc tính để ta thoải mái lựa chọn hơn
Nói thêm: Với cách khai báo biến thế này thì ta phải vào Tools\References và check vào mục Microsoft Scripting Runtime trước nhé
 
Upvote 0
Mình có câu hỏi thế này nhờ các bạn giải đáp giúp mình
Cầu hỏi nằm trong file luôn, các bạn download về rồi giúp mình nhé

Không biết cái này có đúng ý bạn không ? (Tôi viết cho cả trường hợp cột E có thể là một danh sách)

PHP:
Sub Tim()
On Error Resume Next
[f1:f100].ClearContents
For Each cls In [e1:e100].SpecialCells(2)
    tmp = [a1:a100].Find(cls, LookAt:=1).Address
    If tmp > 0 Then
        cls(1, 2) = " co tai " & tmp
    End If
    tmp = Nothing
Next
End Sub
 

File đính kèm

Upvote 0
Em nhớ anh cũng có 1 tuyệt chiêu về hàm FILTER, sao anh không xuất chiêu nhỉ?
Em nghĩ là áp dụng vào bài này cũng hay đây!
Hàm Filter có cũng dính trường hợp tìm kiếm lỏng lẻo như hàm Instr thôi. Mình Thấy hợp lý hơn cả là Collection và Dictionary. Thậm chí, Dictionary còn hỗ trợ phương thức kiểm tra quá hoàn hảo là Exist.
Vậy là ngoài cách kiểm tra của Excel ta tham khảo thêm được Collection và Dictionary. Hai cách này, ta còn sử dụng được trong Access hay VB.
 
Upvote 0
Em lo rằng cách dùng InStr sẽ dể có nguy cơ... nhầm
Ví dụ:
- Cell A1 chứa chuổi: Nguyễn Huỳnh Bảo Tâm
- Ta gõ vào E1 từ khóa: Huỳnh Bảo Tâm
- Hàm của anh nó ra kết quả = TRUE
-----------------------------------
Trong trường hợp yêu cầu tìm không chính xác (như tra từ điển) thì cách này chấp nhận được, ngược lại, để tìm chính xác thì em nghĩ nên dùng Find method hoặc hàm MATCH hay COUNTIF sẽ tốt hơn

Ta có thể sửa đôi chút và sử dụng tốt hàm này:

Mã:
Function Str_Ex(rg As Range, ch As String) As Boolean
Str_Ex = InStr(1, ";" & _
Join(WorksheetFunction.Transpose(rg), _
";") & ";", ";" & ch & ";") > 0
End Function
 
Upvote 0
Không biết cái này có đúng ý bạn không ? (Tôi viết cho cả trường hợp cột E có thể là một danh sách)

PHP:
Sub Tim()
On Error Resume Next
[f1:f100].ClearContents
For Each cls In [e1:e100].SpecialCells(2)
    tmp = [a1:a100].Find(cls, LookAt:=1).Address
    If tmp > 0 Then
        cls(1, 2) = " co tai " & tmp
    End If
    tmp = Nothing
Next
End Sub

Cho mình hỏi thêm chút
Mình thử đặt vùng kiểm tra ở sheet khác, nhưng không được
ví dụ: mình không đặt vùng kiểm tra ở [a1:a100] trong sheet đó mà mình đặt trong sheet2 chẵng hạn
nhưng mình dùng câu lệnh này mà ko chạy
không bít sai chổ nào
bạn coi lai mình với.
Mình dùng code này:
tmp = [sheet2.cells(1,1):sheet2.cells(100,1)].Find(cls, LookAt:=1).Address
 
Upvote 0
Cho mình hỏi thêm chút
Mình thử đặt vùng kiểm tra ở sheet khác, nhưng không được
ví dụ: mình không đặt vùng kiểm tra ở [a1:a100] trong sheet đó mà mình đặt trong sheet2 chẵng hạn
nhưng mình dùng câu lệnh này mà ko chạy
không bít sai chổ nào
bạn coi lai mình với.
Mình dùng code này:
tmp = [sheet2.cells(1,1):sheet2.cells(100,1)].Find(cls, LookAt:=1).Address
Thử ghi thế này xem sao nhé:
tmp = Sheet2.Range("A1:A100").Find(cls, LookAt:=1).Address
 
Upvote 0
Cho mình hỏi thêm chút
Mình thử đặt vùng kiểm tra ở sheet khác, nhưng không được
ví dụ: mình không đặt vùng kiểm tra ở [a1:a100] trong sheet đó mà mình đặt trong sheet2 chẵng hạn
nhưng mình dùng câu lệnh này mà ko chạy
không bít sai chổ nào
bạn coi lai mình với.
Mình dùng code này:
tmp = [sheet2.cells(1,1):sheet2.cells(100,1)].Find(cls, LookAt:=1).Address

1. Nếu vùng tìm kiếm nằm ở Sheet nào thì bạn thêm tên Sheet đó vào địa chỉ vùng tìm kiếm. Vd: tmp = Sheet2. [a1:a100].Find(cls, LookAt:=1).Address
2. Vì tìm trên Excel thì địa chỉ phải là những ô cụ thể vd: A1:A100 vì vậy bạn không nên dùng Cells để khỏi phải mất công lấy địa chỉ của Cells để đưa về địa chỉ của ô trên bảng tính vd: Cells(1,1).Address = A1
 
Upvote 0
Web KT

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

Back
Top Bottom