2013-06-11 22 views
18

Tôi đang làm việc trên một chương trình VBA cho phép người dùng nhập địa chỉ và tìm vị trí bằng cách so khớp các phần tử của địa chỉ với cơ sở dữ liệu.Trong VBA loại bỏ sự nhạy cảm khi so sánh các từ?

Thật không may, tôi gặp sự cố thường xuyên với độ nhạy của chữ hoa chữ thường.

Ví dụ, khi tôi đang sử dụng mã này:

For i = 11 To lRowB 
Range("B" & i).Activate 
myResult = IsNumeric(Application.Match(ActiveCell.Value, manilaListRange, 0)) 

Người ta sẽ so sánh giá trị của ô hiện hành vào một danh sách các từ từ cơ sở dữ liệu của tôi. Vấn đề là, nếu trong tế bào hoạt động của tôi từ là "miami" hoặc "MIAMI" và chỉ "Miami" là trong cơ sở dữ liệu, nó sẽ không làm việc ...

dụ khác:

If Range("J6").Value = "tawi" Then 
Range("J6").Value = "Tawi-Tawi" 
End If 

Cùng một vấn đề, chỉ có chữ viết với cùng một trường hợp là sẽ làm việc.

Làm cách nào để loại bỏ điều này? Nó đặc biệt khó chịu và tôi không thể viết lại cơ sở dữ liệu của mình trong mọi trường hợp kết hợp có thể!

Cảm ơn trước!

+1

ứng dụng .match là _not_ phân biệt chữ hoa chữ thường vì vậy tôi nghĩ bạn có một vấn đề khác nhau – JosieP

Trả lời

38

Có một tuyên bố bạn có thể phát hành ở cấp mô-đun:

Option Compare Text 

Điều này làm cho tất cả "so sánh văn bản" trường hợp nhạy cảm. Điều này có nghĩa là mã sau sẽ hiển thị thông báo "điều này là đúng":

Option Compare Text 

Sub testCase() 
    If "UPPERcase" = "upperCASE" Then 
    MsgBox "this is true: option Compare Text has been set!" 
    End If 
End Sub 

Xem ví dụ http://www.ozgrid.com/VBA/vba-case-sensitive.htm. Tôi không chắc chắn nó sẽ hoàn toàn giải quyết vấn đề cho tất cả các trường hợp (chẳng hạn như các chức năng Application.Match) nhưng nó sẽ chăm sóc của tất cả các báo cáo if a=b. Đối với Application.Match - bạn có thể muốn chuyển đổi các đối số thành chữ hoa hoặc viết thường bằng hàm LCase.

+0

Như một cảnh báo, điều này không hiệu quả đối với tôi khi cố gắng xem hai chuỗi có giống nhau không. Tôi nhận được ý nghĩa từ bài viết này rằng điều này hoạt động tốt hơn cho ít hơn hoặc lớn hơn so sánh văn bản: http://msdn.microsoft.com/en-us/library/8t3khw5f.aspx. Tôi đang làm việc với ID Salesforce có phân biệt chữ hoa chữ thường và thậm chí với bộ Soạn thảo Văn bản Tùy chọn, VBA vẫn tìm thấy i3vz bằng i3vZ. – rryanp

+2

@rryanp 'Tùy chọn So sánh Văn bản' là _supposed_ là trường hợp ** không nhạy cảm ** - vì vậy những gì bạn thấy là những gì bạn mong đợi.Nếu bạn muốn nó được ** nhạy cảm ** (vì vậy mà "i3vz" <> "i3vZ" 'bạn có thể sử dụng' Tùy chọn So sánh nhị phân' thay thế. – Floris

+1

Ah, bây giờ tôi thấy tôi đã đọc bài đăng của mình về phía sau. Tôi sẽ đi thử Tùy chọn So sánh nhị phân - cảm ơn rất nhiều thông tin! – rryanp

12

Bạn có thể chuyển đổi cả giá trị thành chữ thường và so sánh.

Dưới đây là một ví dụ:

If LCase(Range("J6").Value) = LCase("Tawi") Then 
    Range("J6").Value = "Tawi-Tawi" 
End If 
3

Nếu danh sách để so sánh với số lượng lớn, (ví dụ: phạm vi manilaListRange trong ví dụ trên), đó là một bước di chuyển thông minh để sử dụng hàm so khớp. Nó tránh việc sử dụng một vòng lặp mà có thể làm chậm thủ tục. Nếu bạn có thể đảm bảo rằng manilaListRange là tất cả các trường hợp trên hoặc dưới thì điều này có vẻ là lựa chọn tốt nhất cho tôi. Nhanh chóng áp dụng 'UCase' hoặc 'LCase' khi bạn làm khớp.

Nếu bạn không có quyền kiểm soát ManilaListRange sau đó bạn có thể phải nghỉ mát để lặp qua phạm vi này trong trường hợp này có rất nhiều cách để so sánh 'tìm kiếm', 'Instr', 'thay thế' vv

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