Apakah ada rumus Excel untuk mengidentifikasi karakter khusus dalam sel?

13

Kami memiliki sekitar 3500 dokumen yang nama filenya harus digosok secara manual untuk menghapus karakter khusus seperti tanda kurung, titik dua, titik koma, koma, dll.

Saya memiliki file teks yang telah saya buang ke excel, dan saya mencoba membuat kolom yang menandai nama file untuk modifikasi jika menyertakan karakter khusus. Formula pseudocode akan menjadi

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

untuk menandai baris jika berisi karakter selain AZ, 0-9, - atau _, terlepas dari huruf besar atau kecil.

Adakah yang tahu sesuatu yang mungkin berhasil untuk saya? Saya ragu untuk kode dan ifpernyataan besar jika ada sesuatu yang cepat dan mudah.

dwwilson66
sumber
Apakah ada alasan khusus Anda melakukan tugas pemrosesan teks ini di Excel? Bahkan membatasi diri pada alat Microsoft Office, ini adalah pencarian & penggantian yang cukup sederhana di Word. Tabel dengan dua kolom, nama file asli dan nama file yang diproses.
mpez0
Ini adalah entri indeks dari perangkat lunak pihak ke-3. Perangkat lunak ini menampilkan nama file yang mencakup titik dua, tanda kurung, tanda bintang, dll., Menyebabkan pengecualian dalam program konversi. Kami perlu menggosok data dalam perangkat lunak pihak ke-3 sebelum mengonversi; vendor tidak menyediakan API untuk mengotomatisasi tugas itu. Saya memiliki daftar nama file dalam file teks. Saya menggunakan Excel untuk membuat bendera berdasarkan keberadaan karakter khusus dalam nama file. Powershell, c # dan Java mengembalikan hasil yang tidak akurat karena karakter khusus ditafsirkan sebagai operator.
dwwilson66
1
Saya ingin menunjukkan bahwa Anda mungkin menggunakan alat yang salah untuk ini. Saya dapat memikirkan beberapa cara untuk melakukan ini dengan cukup cepat di Notepad ++, misalnya. Anda bahkan dapat mengimpor hasilnya ke Excel di bagian akhir dan memiliki kolom 1s dan 0s.
Dane
@Dane Ingin tahu tentang NP ++. Saya harus menjelajahinya. Saya memiliki alat yang diinstal, tetapi tidak banyak pengalaman dengannya. Terima kasih atas tipnya.
dwwilson66

Jawaban:

19

Tidak ada kode? Tapi ini sangat singkat dan mudah dan indah dan ... :(

Pola RegEx Anda [^A-Za-z0-9_-]digunakan untuk menghapus semua karakter khusus di semua sel.

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

Edit

Ini sedekat mungkin dengan pertanyaan awal Anda.

masukkan deskripsi gambar di sini

Kode kedua adalah fungsi yang ditentukan pengguna =RegExCheck(A1,"[^A-Za-z0-9_-]") dengan 2 argumen. Yang pertama adalah sel untuk diperiksa. Yang kedua adalah pola RegEx untuk memeriksa. Jika pola cocok dengan salah satu karakter di sel Anda, itu akan mengembalikan 1 jika tidak 0.

Anda dapat menggunakannya seperti rumus Excel normal lainnya jika Anda pertama kali membuka VBA editor dengan ALT+ F11, masukkan modul baru (!) Dan rekatkan kode di bawah ini.

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

Untuk pengguna baru di RegEx, saya akan menjelaskan pola Anda: [^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)
nixda
sumber
Masalahnya adalah saya tidak ingin MENGGANTI karakter, cukup beri tanda pada daftar sehingga saya dapat memberikannya kepada orang lain. Nama file dibuat oleh perangkat lunak pihak ketiga & perlu diubah secara manual dalam program itu ... Saya hanya perlu menandai ya atau tidak. Yang sedang berkata, saya pikir saya bisa memodifikasi kode Ganti Anda untuk menandai kolom sebagai gantinya. :)
dwwilson66
untuk mengimplementasikan ini ... itu hanya masalah memotong dan menempel ke modul baru & hemat, kan? atau apakah saya perlu melakukan sesuatu yang lain? rumus =RegExReplace(cell)tidak dikenali .... dan saya agak berkarat untuk membuat fungsi baru.
dwwilson66
@ dwwilson66 Diperbarui!
nixda
Penekanan pada tanda hubung di dalam RegEx (Tanda ini merusak pola Anda jika berada di posisi yang salah)
The Red Pea
7

Menggunakan sesuatu yang mirip dengan kode nixda, berikut adalah fungsi yang ditentukan pengguna yang akan mengembalikan 1 jika sel memiliki karakter khusus.

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

User Defined Functions (UDFs) sangat mudah dipasang dan digunakan:

  1. ALT-F11 menampilkan jendela VBE
  2. ALT-I ALT-M membuka modul baru
  3. rekatkan barang-barang di dan tutup jendela VBE

Jika Anda menyimpan buku kerja, UDF akan disimpan bersamanya. Jika Anda menggunakan versi Excel di atas 2003, Anda harus menyimpan file sebagai .xlsm daripada .xlsx

Untuk menghapus UDF:

  1. buka jendela VBE seperti di atas
  2. hapus kode
  3. tutup jendela VBE

Untuk menggunakan UDF dari Excel:

= IsSpecial (A1)

Untuk mempelajari lebih lanjut tentang makro secara umum, lihat:

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

dan

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

dan

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

untuk spesifik tentang UDF

Makro harus diaktifkan agar ini berfungsi !

Pelajar Gary
sumber
Mengapa Anda menggunakan "_" sebagai item Atau terpisah? Ini dapat dimasukkan dalam grup [] yang sama
jstuardo
@ jstuardo Hanya untuk memperjelas bahwa garis bawah adalah karakter yang valid.
Siswa Gary
Bukankah kode harus diperbarui If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thensehingga makro menganggap bahwa spasi adalah karakter yang valid?
Ovaryraptor
@ Petugas Anda benar! Saya akan memperbarui ini besok.
Siswa Gary
2

Berikut solusi pemformatan bersyarat yang akan menandai rekaman dengan karakter khusus.

Cukup terapkan aturan pemformatan bersyarat baru ke data Anda yang menggunakan rumus (sangat panjang) di bawah ini, di mana A1 adalah catatan pertama di kolom nama file:

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

Rumus ini memeriksa setiap karakter dari setiap nama file dan menentukan apakah kode ASCII-nya berada di luar nilai karakter yang diperbolehkan. Sayangnya, kode karakter yang diperbolehkan tidak semuanya bersebelahan, jadi itu sebabnya rumus harus menggunakan jumlahSUMPRODUCT s. Rumus mengembalikan jumlah karakter buruk yang ada. Setiap sel yang mengembalikan nilai lebih besar dari 0 ditandai.

Contoh: masukkan deskripsi gambar di sini

Excellll
sumber
1

Saya menggunakan pendekatan berbeda untuk menemukan karakter khusus. Saya membuat kolom baru untuk masing-masing karakter yang diizinkan, dan kemudian menggunakan rumus seperti ini untuk menghitung berapa kali karakter yang diizinkan ada di setiap entri baris (Z2):

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

Kemudian saya menjumlahkan jumlah karakter yang diperbolehkan di setiap baris, dan kemudian membandingkannya dengan total panjang entri baris.

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

Dan akhirnya, saya mengurutkan pada kolom terakhir (BF2) untuk menemukan nilai negatif, yang membawa saya ke kolom yang perlu diperbaiki.

Lampe di InfoSec Institute
sumber