มีสูตร Excel เพื่อระบุอักขระพิเศษในเซลล์หรือไม่


13

เรามีเอกสารประมาณ 3,500 ฉบับที่ชื่อไฟล์ต้องถูกขัดด้วยตนเองเพื่อลบอักขระพิเศษเช่นวงเล็บเหลี่ยมโคลอนอัฒภาคเครื่องหมายจุลภาค ฯลฯ

ฉันมีไฟล์ข้อความที่ฉันทิ้งลงใน excel และฉันพยายามสร้างคอลัมน์ที่ตั้งค่าสถานะชื่อไฟล์สำหรับการแก้ไขหากมีอักขระพิเศษ สูตร pseudocode จะเป็น

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

เพื่อตั้งค่าสถานะแถวหากมีอักขระอื่น ๆ นอกเหนือจาก AZ, 0-9, - หรือ _ โดยไม่คำนึงถึงกรณี

มีใครรู้บ้างเกี่ยวกับบางสิ่งที่อาจเหมาะกับฉัน ฉันลังเลที่จะใช้รหัสและifคำสั่งจำนวนมากหากมีบางสิ่งที่ง่ายและรวดเร็ว


มีเหตุผลบางประการที่คุณกำลังทำงานการประมวลผลข้อความนี้ใน Excel แม้จะ จำกัด ตัวเองเป็นเครื่องมือของ Microsoft Office มันเป็นการค้นหาและแทนที่ที่ง่ายใน Word ตารางที่มีสองคอลัมน์ชื่อไฟล์ดั้งเดิมและชื่อไฟล์ที่ประมวลผล
mpez0

นี่คือรายการดัชนีจากซอฟต์แวร์บุคคลที่สาม ซอฟต์แวร์นี้ให้ชื่อไฟล์ที่มีเครื่องหมายโคลอนวงเล็บเครื่องหมายแอมเปอร์แซนด์ ฯลฯ ทำให้เกิดข้อยกเว้นในโปรแกรมแปลงไฟล์ เราจำเป็นต้องขัดข้อมูลในซอฟต์แวร์ของ บริษัท อื่นก่อนทำการแปลง ผู้ขายไม่ได้จัดเตรียม API สำหรับการทำภารกิจนั้นโดยอัตโนมัติ ฉันมีรายการชื่อไฟล์ในไฟล์ข้อความ ฉันใช้ Excel เพื่อสร้างการตั้งค่าสถานะตามการมีอักขระพิเศษในชื่อไฟล์ Powershell, c # และ Java แสดงผลลัพธ์ที่ไม่ถูกต้องเนื่องจากอักขระพิเศษถูกตีความว่าเป็นโอเปอเรเตอร์
dwwilson66

1
ฉันต้องการชี้ให้เห็นว่าคุณอาจใช้เครื่องมือที่ผิดสำหรับเรื่องนี้ ฉันสามารถคิดถึงวิธีการทำสิ่งนี้ได้อย่างรวดเร็วใน Notepad ++ ตัวอย่างเช่น คุณสามารถนำเข้าผลลัพธ์ไปยัง Excel ในตอนท้ายและมีคอลัมน์ 1s และ 0s
ชาวเดนมาร์ก

@Dane รู้ดีเกี่ยวกับ NP ++ ฉันจะต้องสำรวจสิ่งนั้น ฉันติดตั้งเครื่องมือแล้ว แต่ไม่ได้มีประสบการณ์มากนัก ขอบคุณสำหรับทิป.
dwwilson66

คำตอบ:


19

ไม่มีรหัส? แต่มันสั้นและง่ายและสวยงามและ ... :(

รูปแบบ RegEx ของคุณ[^A-Za-z0-9_-]ใช้เพื่อลบอักขระพิเศษทั้งหมดในเซลล์ทั้งหมด

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

แก้ไข

นี่ใกล้เคียงกับที่ฉันจะได้รับกับคำถามดั้งเดิมของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

รหัสที่สองคือฟังก์ชั่นที่ผู้ใช้กำหนด=RegExCheck(A1,"[^A-Za-z0-9_-]")ด้วย 2 อาร์กิวเมนต์ คนแรกคือเซลล์ที่จะตรวจสอบ ส่วนที่สองคือรูปแบบ RegEx เพื่อตรวจสอบ หากรูปแบบตรงกับอักขระใด ๆ ในเซลล์ของคุณรูปแบบนั้นจะคืนค่าเป็น 1 มิฉะนั้น 0

คุณสามารถใช้งานได้เหมือนสูตร Excel ทั่วไปอื่น ๆ หากคุณเปิดโปรแกรมแก้ไข VBA ด้วยALT+ F11ใส่โมดูลใหม่(!) แล้ววางรหัสด้านล่าง

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

สำหรับผู้ใช้ใหม่ที่ RegEx ฉันจะอธิบายรูปแบบของคุณ: [^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)

ปัญหาคือฉันไม่ต้องการแทนที่ตัวละครเพียงแค่ตั้งค่าสถานะไว้ในรายการเพื่อที่ฉันจะได้มอบให้กับคนอื่น ชื่อไฟล์ถูกสร้างขึ้นโดยซอฟต์แวร์ของบุคคลที่สามและจำเป็นต้องเปลี่ยนด้วยตนเองภายในโปรแกรมนั้น ... ฉันแค่ต้องการตั้งค่าสถานะใช่หรือไม่ ที่ถูกกล่าวว่าฉันคิดว่าฉันสามารถแก้ไขรหัสแทนที่ของคุณเพื่อตั้งค่าสถานะคอลัมน์แทน :)
dwwilson66

เพื่อนำสิ่งนี้ไปใช้ ... มันเป็นเรื่องของการตัดและวางลงในโมดูล & การบันทึกใหม่ใช่ไหม? หรือฉันต้องทำอย่างอื่น? สูตร=RegExReplace(cell)ไม่ได้รับการยอมรับ .... และฉันก็ค่อนข้างเป็นสนิมในการสร้างฟังก์ชั่นใหม่
dwwilson66

@ dwwilson66 อัพเดทแล้ว!
nixda

เน้นยัติภังค์ที่อยู่ภายใน RegEx (สัญลักษณ์นี้จะแบ่งรูปแบบของคุณถ้ามันอยู่ในตำแหน่งที่ไม่ถูกต้อง)
The Red Pea

7

ใช้สิ่งที่คล้ายกับรหัสของ nixda ต่อไปนี้เป็นฟังก์ชันที่ผู้ใช้กำหนดซึ่งจะส่งคืน 1 หากเซลล์มีอักขระพิเศษ

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

ฟังก์ชั่นที่ผู้ใช้กำหนด (UDF) นั้นง่ายต่อการติดตั้งและใช้งาน:

  1. ALT-F11 เปิดหน้าต่าง VBE ขึ้นมา
  2. ALT-I ALT-M เปิดโมดูลใหม่
  3. วางสิ่งต่างๆลงในและปิดหน้าต่าง VBE

หากคุณบันทึกเวิร์กบุ๊ก UDF จะถูกบันทึกด้วย หากคุณกำลังใช้ Excel รุ่นหนึ่งในภายหลังจากนั้นคุณต้องบันทึกไฟล์เป็น. xlsm แทนที่จะเป็น. xlsx

ในการลบ UDF:

  1. เปิดหน้าต่าง VBE ขึ้นด้านบน
  2. ล้างรหัสออก
  3. ปิดหน้าต่าง VBE

วิธีใช้ UDF จาก Excel:

= IsSpecial (A1)

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับมาโครโดยทั่วไปโปรดดู:

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

และ

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

และ

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

สำหรับข้อมูลเฉพาะเกี่ยวกับ UDF

ต้องเปิดใช้งานแมโครเพื่อให้ใช้งานได้ !


ทำไมคุณถึงใช้ "_" เป็นรายการแยกต่างหากหรือ สามารถรวมอยู่ในกลุ่ม [] เดียวกัน
jstuardo

@jstuardo เฉพาะเพื่อให้ชัดเจนว่าขีดเส้นใต้เป็นอักขระที่ถูกต้อง
นักเรียนของ Gary

ไม่ควรอัปเดตรหัสเป็นIf sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenแมโครจะถือว่ามีช่องว่างเป็นอักขระที่ถูกต้องหรือไม่
Ovaryraptor

@Ovaryraptor คุณถูกต้อง! ฉันจะอัปเดตในวันพรุ่งนี้
แกรี่ของนักเรียน

2

ต่อไปนี้เป็นวิธีการจัดรูปแบบตามเงื่อนไขที่จะตั้งค่าสถานะระเบียนด้วยอักขระพิเศษ

เพียงใช้กฎการจัดรูปแบบตามเงื่อนไขใหม่กับข้อมูลของคุณที่ใช้สูตร (ยาวมาก) ด้านล่างซึ่งA1เป็นระเบียนแรกในคอลัมน์ชื่อไฟล์:

=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)

สูตรนี้ตรวจสอบอักขระแต่ละตัวของชื่อไฟล์แต่ละชื่อและพิจารณาว่ารหัส ASCII อยู่นอกค่าอักขระที่อนุญาตหรือไม่ น่าเสียดายที่รหัสตัวอักษรที่ใช้ได้นั้นไม่ได้อยู่ติดกันทั้งหมดนั่นคือสาเหตุที่สูตรต้องใช้ผลรวมของSUMPRODUCTs สูตรจะคืนค่าจำนวนอักขระที่ไม่ดีที่มีอยู่ เซลล์ใด ๆ ที่ส่งคืนค่าที่มากกว่า 0 จะถูกแฟล็ก

ตัวอย่าง: ป้อนคำอธิบายรูปภาพที่นี่


1

ฉันใช้วิธีการต่าง ๆ เพื่อค้นหาตัวละครพิเศษ ฉันสร้างคอลัมน์ใหม่สำหรับตัวละครที่ได้รับอนุญาตแต่ละตัวจากนั้นใช้สูตรเช่นนี้เพื่อนับจำนวนตัวอักษรที่อนุญาตในแต่ละแถว (Z2):

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

จากนั้นฉันรวมจำนวนอักขระที่อนุญาตในแต่ละแถวแล้วเปรียบเทียบกับความยาวทั้งหมดของรายการแถว

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

และสุดท้ายฉันก็เรียงลำดับในคอลัมน์สุดท้าย (BF2) เพื่อค้นหาค่าลบซึ่งทำให้ฉันไปยังคอลัมน์ที่ต้องการการแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.