Có một công thức Excel để xác định các ký tự đặc biệt trong một ô không?


13

Chúng tôi có khoảng 3500 tài liệu có tên tệp cần được xóa thủ công để xóa các ký tự đặc biệt như dấu ngoặc, dấu hai chấm, dấu chấm phẩy, dấu phẩy, v.v.

Tôi có một tệp văn bản mà tôi đã chuyển vào excel và tôi đang cố gắng tạo một cột gắn cờ tên tệp để sửa đổi nếu nó bao gồm các ký tự đặc biệt. Công thức mã giả sẽ là

=IF (cellname contains [^a-zA-z_-0-9], then "1", else "0")

để gắn cờ hàng nếu nó chứa bất kỳ ký tự nào ngoài AZ, 0-9, - hoặc _, bất kể trường hợp nào.

Bất cứ ai biết một cái gì đó có thể làm việc cho tôi? Tôi ngần ngại viết mã và iftuyên bố lớn nếu có gì đó nhanh chóng và dễ dàng.


Có một lý do cụ thể nào đó khi bạn thực hiện tác vụ xử lý văn bản này trong Excel không? Ngay cả giới hạn bản thân với các công cụ Microsoft Office, đó là một tìm kiếm & thay thế khá đơn giản trong Word. Bảng có hai cột, tên tệp gốc và tên tệp được xử lý.
mpez0

Đây là các mục chỉ mục từ một phần mềm bên thứ 3. Phần mềm này xuất ra tên tệp bao gồm dấu hai chấm, dấu ngoặc, ký hiệu, v.v., gây ra ngoại lệ trong các chương trình chuyển đổi. Chúng ta cần xóa dữ liệu trong phần mềm của bên thứ 3 trước khi chuyển đổi; nhà cung cấp không cung cấp API để tự động hóa tác vụ đó. Tôi có một danh sách tên tệp trong một tệp văn bản. Tôi đang sử dụng Excel để tạo cờ dựa trên sự hiện diện của các ký tự đặc biệt trong tên tệp. Powershell, c # và Java trả về kết quả không chính xác vì các ký tự đặc biệt được hiểu là toán tử.
dwwilson66

1
Tôi muốn chỉ ra rằng có lẽ bạn đang sử dụng công cụ sai cho việc này. Tôi có thể nghĩ ra một vài cách để thực hiện việc này khá nhanh trong Notepad ++. Bạn thậm chí có thể nhập kết quả vào Excel ở cuối và có cột 1 và 0.
Dane

@Dane Tốt để biết về NP ++. Tôi sẽ phải khám phá điều đó. Tôi đã cài đặt công cụ, nhưng không có nhiều kinh nghiệm với nó. Cảm ơn vì tiền hỗ trợ.
dwwilson66

Câu trả lời:


19

Không có mã? Nhưng nó quá ngắn, dễ dàng và đẹp và ... :(

Mẫu RegEx của bạn [^A-Za-z0-9_-]được sử dụng để xóa tất cả các ký tự đặc biệt trong tất cả các ô.

Sub RegExReplace()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True

    RegEx.Pattern = "[^A-Za-z0-9_-]"
    For Each objCell In ActiveSheet.UsedRange.Cells
        objCell.Value = RegEx.Replace(objCell.Value, "")
    Next

End Sub

Biên tập

Điều này gần đến mức tôi có thể nhận được câu hỏi ban đầu của bạn.

nhập mô tả hình ảnh ở đây

Mã thứ hai là một hàm do người dùng định nghĩa =RegExCheck(A1,"[^A-Za-z0-9_-]")với 2 đối số. Đầu tiên là tế bào để kiểm tra. Cái thứ hai là mẫu RegEx để kiểm tra. Nếu mẫu khớp với bất kỳ ký tự nào trong ô của bạn, nó sẽ trả về 1 nếu không là 0.

Bạn có thể sử dụng nó giống như bất kỳ công thức Excel bình thường nào khác nếu lần đầu tiên bạn mở trình soạn thảo VBA bằng ALT+ F11, chèn một mô-đun mới (!) Và dán mã bên dưới.

Function RegExCheck(objCell As Range, strPattern As String)

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True
    RegEx.Pattern = strPattern

    If RegEx.Replace(objCell.Value, "") = objCell.Value Then
        RegExCheck = 0
    Else
        RegExCheck = 1
    End If

End Function

Đối với người dùng mới sử dụng RegEx, tôi sẽ giải thích mô hình của bạn: [^A-Za-z0-9_-]

[] stands for a group of expressions
^ is a logical NOT
[^ ] Combine them to get a group of signs which should not be included
A-Z matches every character from A to Z (upper case)
a-z matches every character from a to z (lower case)
0-9 matches every digit
_ matches a _
- matches a - (This sign breaks your pattern if it's at the wrong position)

Vấn đề là tôi không muốn THAY THẾ các ký tự, chỉ gắn cờ chúng trong danh sách để tôi có thể đưa nó cho người khác. Tên tệp được tạo bởi phần mềm của bên thứ ba và cần được thay đổi thủ công trong chương trình đó ... Tôi chỉ cần gắn cờ có hoặc không. Điều đó đang được nói, tôi nghĩ rằng tôi có thể sửa đổi mã Thay thế của bạn để gắn cờ cột thay thế. :)
dwwilson66

để thực hiện điều này ... đó chỉ là vấn đề cắt và dán vào một mô-đun mới và tiết kiệm, phải không? hoặc tôi cần phải làm gì khác? công thức =RegExReplace(cell)không được công nhận .... và tôi hơi khó tính khi tạo các hàm mới.
dwwilson66

@ dwwilson66 Cập nhật!
nixda

Nhấn mạnh vào dấu gạch nối bên trong RegEx (Dấu hiệu này phá vỡ mô hình của bạn nếu nó ở sai vị trí)
Red Pea

7

Sử dụng một cái gì đó tương tự như mã của nixda, đây là hàm do người dùng xác định sẽ trả về 1 nếu ô có các ký tự đặc biệt.

Public Function IsSpecial(s As String) As Long
    Dim L As Long, LL As Long
    Dim sCh As String
    IsSpecial = 0
    For L = 1 To Len(s)
        sCh = Mid(s, L, 1)
        If sCh Like "[0-9a-zA-Z]" Or sCh = "_" Then
        Else
            IsSpecial = 1
            Exit Function
        End If
    Next L
End Function

Hàm do người dùng xác định (UDF) rất dễ cài đặt và sử dụng:

  1. ALT-F11 xuất hiện cửa sổ VBE
  2. ALT-I ALT-M mở ra một mô-đun mới
  3. dán nội dung vào và đóng cửa sổ VBE

Nếu bạn lưu sổ làm việc, UDF sẽ được lưu cùng với nó. Nếu bạn đang sử dụng phiên bản Excel sau đó sau 2003, bạn phải lưu tệp dưới dạng .xlsm chứ không phải .xlsx

Để xóa UDF:

  1. đưa lên cửa sổ VBE như trên
  2. xóa mã ra
  3. đóng cửa sổ VBE

Để sử dụng UDF từ Excel:

= Đặc biệt (A1)

Để tìm hiểu thêm về macro nói chung, xem:

http://www.mvps.org/dmcritchie/excel/getstarted.htmlm

http://msdn.microsoft.com/en-us/l Library / e814735 (v = office.14) .aspx

http://www.cpearson.com/excel/WritingFiancesInVBA.aspx

để biết chi tiết về UDF

Macro phải được kích hoạt để làm việc này !


Tại sao bạn sử dụng "_" làm vật phẩm Hoặc riêng biệt? Nó có thể được bao gồm trong cùng một nhóm []
jstuardo

@jstuardo Chỉ để làm rõ rằng dấu gạch dưới là một ký tự hợp lệ.
Học sinh của Gary

Không nên cập nhật mã để If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenmacro cho rằng khoảng trắng là ký tự hợp lệ?
Buồng trứng

@Ovaryraptor Bạn đúng rồi! Tôi sẽ cập nhật vào ngày mai.
Học sinh của Gary

2

Đây là một giải pháp định dạng có điều kiện sẽ gắn cờ các bản ghi với các ký tự đặc biệt.

Chỉ cần áp dụng quy tắc định dạng có điều kiện mới cho dữ liệu của bạn sử dụng công thức (cực kỳ dài) bên dưới, đây A1là bản ghi đầu tiên trong cột tên tệp:

=SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<48)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>45))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>57)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>95))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122)*1)

Công thức này kiểm tra từng ký tự của từng tên tệp và xác định xem mã ASCII của nó có nằm ngoài các giá trị ký tự được phép hay không. Thật không may, các mã ký tự được phép không phải là tất cả liền kề nhau, vì vậy đó là lý do tại sao công thức phải sử dụng tổng của SUMPRODUCTs. Công thức trả về số lượng ký tự xấu có. Bất kỳ ô nào trả về giá trị lớn hơn 0 đều được gắn cờ.

Thí dụ: nhập mô tả hình ảnh ở đây


1

Tôi đã sử dụng một cách tiếp cận khác nhau để tìm các nhân vật đặc biệt. Tôi đã tạo các cột mới cho mỗi ký tự được phép và sau đó sử dụng một công thức như thế này để đếm số lần ký tự được phép trong mỗi mục nhập hàng (Z2):

AA2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AA$1,""))
AB2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AB$1,""))
...

Sau đó, tôi tổng hợp số lượng ký tự được phép trong mỗi hàng và sau đó so sánh nó với tổng độ dài của mục hàng.

BE2=LEN(Z2)
BF2=SUM(AA2:BC2)-BE2

Và cuối cùng, tôi đã sắp xếp trên cột cuối cùng (BF2) để tìm các giá trị âm, điều này dẫn tôi đến các cột cần điều chỉnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.