2013-04-23 24 views
5

Tôi đang sử dụng hàm kết hợp trong chương trình excel của mình nhưng tôi gặp vấn đề với nó là nó chỉ chọn các kết quả trùng khớp. Ví dụ: nếu bạn so sánh ô có "Chuối" với ô khác có "Chuối", ô đó sẽ hoạt động và trả về giá trị dương.
Nhưng nếu bạn so sánh "Chuối" với ô có nội dung là "Chuối choco", thì sẽ không nhận ra rằng từ chuối nằm trong ô.Excel - VBA: làm cho phương thức Đối sánh ít hạn chế hơn (bằng cách tìm một từ trong câu)

Trong trường hợp của tôi, tôi muốn trả về giá trị TRUE bất cứ khi nào một từ được phát hiện trong một câu.

Đây là mã của tôi:

Worksheets("sBldgMakati").Activate 

For i = 2 To 605 
    Range("B" & i).Activate 
    myResult = IsNumeric(Application.Match(ActiveCell.Value, elementsListRange, 0)) 

    If myResult Then 
    Range("K" & i).Value = Range("K" & i).Value + 10 
    Else 
    Range("K" & i).Value = Range("K" & i).Value + 0 
End If 

Next i 

tôi phải xác định rằng trong mã này, elementsListRange tương ứng với một dãy các ô có nội dung là chỉ một từ ("Chuối" chẳng hạn) và ActiveCell.value thường một biểu thức dài hơn (ví dụ: "Banana choco").

Cảm ơn trước sự giúp đỡ của bạn!

+0

Bạn đã thử sử dụng các chức năng 'Tìm' hoặc' Tìm kiếm' chưa? Và là 'elementsListRange' một dải ô, của danh sách VBA/tập hợp các giá trị ô? – user2140261

+0

có thể bạn có thể chọn câu trả lời cho tất cả các câu hỏi của mình, đó là lý do chúng tôi thực hiện! –

Trả lời

2

Sử dụng chức năng dưới đây, nó phù hợp với một chuỗi con trong vòng một chuỗi:

Function match(searchStr As Variant, matchStr As Variant) As Boolean 
    match = False 
    If (IsNull(searchStr) Or IsNull(matchStr)) Then Exit Function 
    If (matchStr = "") Or (searchStr = "") Then Exit Function 
    Dim f As Variant 
    f = InStr(1, CStr(searchStr), CStr(matchStr), vbTextCompare) 
    If IsNull(f) Then Exit Function 
    match = f > 0 
End Function 

Để sử dụng nó với một loạt:

Dim searchstr="A Banana found" 
Dim isFound as boolean 
IsFound=false 
For each c in range 
    If match(searchstr, c.value) 
     IsFound=true 
     Exit for 
    End if 
End for 

Note rằng searchStrmatchStr là biến thể để bạn có thể vượt qua các giá trị từ các tế bào Excel để nó.

+0

Giải pháp này thực sự hoạt động tốt hơn nhiều, cảm ơn Matt! – Phalanx

5

Từ tài liệu trợ giúp trong Excel (nếu bạn nhấn F1 và tìm kiếm match):

Nếu match_type là 0 và lookup_value là một chuỗi văn bản, bạn có thể sử dụng ký tự đại diện - những dấu hỏi (?) và dấu hoa thị (*) - trong đối số lookup_value . Dấu chấm hỏi khớp với bất kỳ ký tự đơn nào; một dấu hoa thị khớp với bất kỳ chuỗi ký tự nào.

Như vậy, lợi nhuận =MATCH("*Banana*",C8,0)1 nếu C8 chứa "Banana choco".

Trong VBA, nếu mục để được xuất hiện là trong một ô, bạn có thể bao gồm các dấu sao đại diện với nối chuỗi, ví dụ:

myResult = IsNumeric(Application.Match("*" & ActiveCell.Value & "*", elementsListRange, 0)) 

Nếu có nhiều câu trong khoảng B2:B605 rằng phải kiểm tra đối với tất cả các từ trong elementListRange, như dường như là trường hợp trong tình huống này, tôi nghĩ bạn có thể cần phải làm một cái gì đó như thế này (chưa được kiểm tra):

For Each cell in elementsListRange.Cells 
    myResult = Application.Match("*" & cell.Value & "*", B2:B605, 0) 
    if (IsNumeric(myResult)) then 
     Range("K" & myResult).Value = Range("K" & myResult).Value + 10 
    end if 
next 
+0

Cảm ơn thông tin này @Simon, nó rất hữu ích. Tuy nhiên, tôi đã không cố gắng để làm cho nó hoạt động trong trường hợp của tôi vì tôi không trực tiếp đối phó với các nội dung của các tế bào của tôi nhưng với Range. Tôi đã cố gắng thêm dấu hoa thị trong mã của mình nhưng rõ ràng là không đúng cách.Bạn có biết những gì sẽ là đúng cách để đặt dấu hoa thị xung quanh "elementsListRange" (nơi "chuối" sẽ được lưu trữ trong trường hợp của tôi), nhưng trong một cách mã hóa? – Phalanx

+1

Tôi đã chỉnh sửa câu trả lời của mình để cho biết cách bạn có thể nối các dấu hoa thị ở cuối đầu của giá trị ô. – Simon

+0

Oh cảm ơn, thực sự thú vị. Tuy nhiên, tôi xin lỗi để thu hút bạn một lần nữa nhưng khi các ô có các từ đơn được lưu trữ trong "elementsListRange", do đó, nó không hoạt động để làm điều này cho ActiveCelle.Value. Và addind "*" & trước và sau "elementsListRange" đang trả về một thông báo lỗi (không tương thích của loại). Tôi cũng đã thử trực tiếp trên nội dung của elementsListRange nhưng nó không hoạt động: Set elementsListRange = .Range ("D2: D" & lRowD) – Phalanx

Các vấn đề liên quan