Hàm Instr

Euler

Administrator
Thành viên BQT
Cấu trúc:
Instr
(vị_trí_bắt_đầu_tìm,string1, string2, kiểu_so_sánh)

Tham số:
vị_trí_bắt_đầu_tìm : Tham số này có thể giản lược. Nếu bị giản lược nó sẽ bắt đầu tìm từ vị trí đầu tiên (=1) trong chuỗi ký tự string1 xem có xuất hiện string2 trong đó hay không.
string1: là chuỗi ký tự nguồn.
string2: là chuỗi ký tự mà ta muốn tìm kiếm xem nó có xuất hiện trong chuỗi ký tự string1 hay không.
kiểu_so_sánh: Có thể giản lược. Khi giản lược thì mặc định phân biệt chữ hoa hay chữ thường. Sẽ bàn tới ở cuối bài viết này.

Ta ví dụ:
Instr("ABDC","D") sẽ cho kết quả là 4. Ký tự "D" nằm ở vị trí thứ 4 trong chuỗi "ABCD".
Nội dungGiá trị trả về
Tham số string1 là rỗng ""
0​
Tham số string1 là NullNull
Tham số string2 là rỗng ""Là vị trí mà ta chỉ định bắt đầu tìm kiếm
Tham số string2 là NullNull
Không tìm thấy string2 xuất hiện trong string1
0​
Giá trị tìm kiếm vượt quá độ dài của chuỗi string1
0​
Thông thường thì đối với VBA, kiểu chuỗi ký tự ít khi có giá trị là Null. Do đó bạn cũng không cần quan tâm các trường hợp Null được mô tả ở trên.
Mã:
Sub Sample1()
    Dim String1 As String, String2 As String
    String1 = "ABCDE"
    String2 = "D"
    MsgBox InStr(String1, String2)
End Sub
Hàm Instr rất tiện lợi vì khả năng sử dụng nhanh gọn.
Mã:
Sub Sample4()
    MsgBox InStr("ABCDE", "CD")     ''Giá trị trả về là 3
End Sub
Mã:
Sub Sample7()
    MsgBox InStr("abcd", "C")       ''giá trị trả về là 0 vì phân biệt chữ hoa và chữ thường.
End Sub
Mã:
Sub Sample7()
    MsgBox InStr(1, "abcd", "C", vbTextCompare) 'Giá trị trả về là 3, không phân biệt in hoa hay thường
End Sub
Chúng ta chú ý, chúng ta có hàm Ucase(string) sẽ chuyển toàn bộ chữ cái có trong string thành chữ in hoa.
Ucase("abC") = "ABC"
Và Lcase("abC") = "abc" : Lcase thì ngược lại, sẽ chuyển toàn bộ chữ cái có trong string thành chữ in thường.
Vì vậy để khỏi phải nhớ kiểu so sánh, ta sử dụng:
Instr(Ucase(string1),Ucase(string2)) thì cũng tương tự như việc tìm string2 có xuất hiện trong string1 hay không mà không phân biệt in hoa hay in thường. Là vì dù in hoa hay in thường, thì chúng ta cũng đã biến đổi cả string1 và string2 thành kiểu in hoa và thực hiện tìm kiếm.

Tham khảo và dịch từ:
 

giaiphapvba

Administrator
Thành viên BQT
Bạn cần đăng nhập để thấy đính kèm


Giá trị trả về của hàm Instr là kiểu Variant.
Ở ví dụ trên ta thấy ký tự "C" nằm ở vị trí thứ 3 trong chuỗi "ABCDEFG" cho nên kết quả của hàm trên sẽ cho ra giá trị là 3.

Point: Nếu chúng ta tìm kiếm nhiều hơn 1 ký tự thì nếu tìm thấy, nó sẽ trả về vị trí của ký tự đầu tiên.
Ta ví dụ:
Instr("ABCDEF","CD") sẽ cho ra kết quả là 3 chứ không phải là 4.
Đầu tiên, nó tìm thấy "CD" có trong "ABCDEF" và ký tự đầu tiên của "CD" là "C", và vị trí của "C" khi tìm thấy là ở vị trí số 3.

Về kiểu so sánh: Có ba kiểu như sau: vbUseCompareOption ,vbBinaryCompare ,vbTextCompare , và bạn chỉ cần nhớ rằng nếu không đề cập gì tới kiểu so sánh, thì mặc định phân biệt chữ hoa và chữ thường. Nếu không muốn phân biệt, thì bạn phải chỉ định kiểu so sánh là vbTextCompare . Hoặc, bạn chuyển hết string1 và string2 thành in hoa như ở bài viết 1 đã đề cập.

Ta thử ví dụ dưới đây nhé:
Mã:
Sub timkiem()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCABCABCABC"
    String2 = "C"
 
    MsgBox InStr(String1, String2) 'Kết quả sẽ cho ra là 3
End Sub
Ký tự C đầu tiên mà nó tìm thấy là ở vị trí số 3, cho nên kết quả là 3.
Bây giờ nếu ta chỉ định vị trí bắt đầu tìm kiếm từ vị trí số 4 thì sẽ ra sao nhỉ?
Mã:
Sub timkiem2()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCABCABCABC"
    String2 = "C"
 
    MsgBox InStr(4, String1, String2) 'Kết quả sẽ cho ra là 6
End Sub
Nó bắt đầu tìm kiếm từ vị trí số 4, cho tới khi tìm thấy "C". Và vị trí gần nhất nó tìm thấy là ở vị trí số 6: "ABCABCABCABC"
Mã:
Sub timkiem_full()
    Dim N As Long
    Dim cnt As Long
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCABCABCABC"
    String2 = "C"
    
    N = InStr(N + 1, String1, String2)
    Do While N > 0
        cnt = cnt + 1
        N = InStr(N + 1, String1, String2)
    Loop
        MsgBox String1 & " tim thay " & String2 & " xuat hien " & cnt & " lan"
End Sub
Bạn cần đăng nhập để thấy đính kèm


Mã:
Sub timkiem_1b()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "abcdefg"
    String2 = "C"
 
    'Phan biet chu thuong va chu viet hoa
    MsgBox InStr(String1, String2)
    
    'Khong phan biet chu thuong va chu viet hoa
    MsgBox InStr(UCase(String1), UCase(String2))
End Sub
Bạn cần đăng nhập để thấy đính kèm


Nguồn tham khảo:
 

tuhocvba

Administrator
Thành viên BQT
Hàm InstrRev: Hàm này giống hàm Instr, tuy nhiên cách tìm kiếm của nó thì ngược lại, thay vì tìm từ bên trái, nó sẽ tìm từ bên phải.



Giả sử tôi có chuỗi ký tự sau:

s = “ABCDCE

Nếu như ta tìm ký tự C thì sẽ có hai tình huống: Bạn muốn lấy vị trí C ở bên trái, hay bạn muốn lấy vị trí C ở bên phải?

Đối với hàm instr thì nó sẽ tìm kiếm từ bên trái. Vì vậy nếu chúng ta tìm kiếm như sau:

Instr(1,s,”C”) thì nó sẽ cho ta kết quả là 3, là vị trí của ký tự C đầu tiên ở bên trái.

Tuy nhiên nếu chúng ta muốn lấy vị trí C đầu tiên ở bên phải thì khi đó ta sẽ sử dụng hàm InstrRev.

Ta viết InstrRev(s,”C”) ta sẽ có kết quả là 5. Đối với hàm InstrRev tìm kiếm từ bên phải, thì bạn sẽ không chỉ định vị trí bắt đầu tìm kiếm, mặc định nó sẽ tìm kiếm từ đầu mút bên phải chạy về bên trái.

Bạn hãy chạy thử đoạn code sau nhé:

Mã:
Sub test()

    Dim i   As Integer, j As Integer

    Const s As String = "ABCDCE"

    i = InStr(1, s, "C")

    j = InStrRev(s, "C")


    MsgBox "Vi tri C dau tien tu ben trai la " & i & Chr(10) & _

    "Vi tri C dau tien o ben tay phai la " & j


End Sub
Bạn cần đăng nhập để thấy đính kèm
 
Top