Bir hücredeki özel karakterleri tanımlamak için bir Excel formülü var mı?


13

Köşeli parantez, iki nokta üst üste, noktalı virgül, virgül vb. Özel karakterleri kaldırmak için dosya adları el ile silinmesi gereken yaklaşık 3500 belgemiz var.

Ben excel döktüm bir metin dosyası var ve özel karakterler içeriyorsa değişiklik için dosya adını bayraklar içeren bir sütun oluşturmaya çalışıyorum. Sahte kod formülü

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

duruma göre AZ, 0-9, - veya _ dışında karakterler içeriyorsa satırı işaretlemek için.

Benim için işe yarayabilecek bir şey bilen var mı? ifHızlı ve kolay bir şey varsa kodlamak ve büyük ifade tereddüt ediyorum .


Bu metin işleme görevini Excel'de yapmanın belirli bir nedeni var mı? Kendisini Microsoft Office araçlarıyla sınırlasa bile, Word'de oldukça basit bir arama ve değiştirme. İki sütun, orijinal dosya adı ve işlenmiş dosya adı içeren tablo.
mpez0

Bunlar üçüncü taraf bir yazılımın dizin girişleridir. Bu yazılım, iki nokta üst üste, köşeli ayraç, ve işareti vb. İçeren dosya adları verir ve dönüştürme programlarında istisnalara neden olur. Dönüştürmeden önce 3. taraf yazılımındaki verileri temizlememiz gerekir; satıcı bu görevi otomatikleştirmek için bir API sağlamaz. Bir metin dosyasındaki dosya adlarının bir listesi var. Bir dosya adındaki özel karakterlerin varlığına dayalı bir bayrak oluşturmak için Excel kullanıyorum. Özel karakterler işleç olarak yorumlandığından Powershell, c # ve Java yanlış sonuçlar verir.
dwwilson66

1
Bunun için muhtemelen yanlış aracı kullandığınızı belirtmek istiyorum. Örneğin, Notepad ++ ile bunu hızlı bir şekilde yapmanın birkaç yolunu düşünebilirim. Sonuçları sonunda Excel'e bile aktarabilir ve 1 ve 0'lık bir sütuna sahip olabilirsiniz.
Dane

@Dane NP ++ hakkında bilmek güzel. Bunu keşfetmem gerekecek. Aracı yükledim, ancak onunla çok fazla deneyimim yok. Bahşiş için teşekkürler.
dwwilson66

Yanıtlar:


19

Kod yok? Ama çok kısa, kolay ve güzel ve ... :(

RegEx deseniniz [^A-Za-z0-9_-]tüm hücrelerdeki tüm özel karakterleri kaldırmak için kullanılır.

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

Düzenle

Bu, orijinal sorunuza ulaşabildiğim kadar yakın.

resim açıklamasını buraya girin

İkinci kod, =RegExCheck(A1,"[^A-Za-z0-9_-]")2 bağımsız değişkeni olan kullanıcı tanımlı bir işlevdir . İlki kontrol edilecek hücredir. İkincisi kontrol edilecek RegEx modelidir. Desen hücrenizdeki karakterlerden herhangi biriyle eşleşirse, 1 aksi takdirde 0 değerini döndürür.

VBA düzenleyicisini ilk önce ALT+ ile açarsanız F11, yeni bir modül (!) Ekleyip aşağıdaki kodu yapıştırırsanız, bunu diğer normal Excel formülleri gibi kullanabilirsiniz .

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'te yeni olan kullanıcılar için kalıbınızı açıklayacağım: [^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)

Sorun şu ki, karakterleri DEĞİŞTİRMEK istemiyorum, sadece listede işaretleyin, böylece başka birine verebilirim. Dosya adları üçüncü taraf yazılımlar tarafından oluşturulur ve bu programda manuel olarak değiştirilmesi gerekir ... Sadece evet veya hayır olarak işaretlemem gerekiyor. Olduğu söyleniyor, ben yerine sütun işaretlemek için Kodunuzu değiştirin değiştirebilirsiniz. :)
dwwilson66

bunu uygulamak için ... bu sadece yeni bir modüle kesme ve yapıştırma meselesi, değil mi? ya da başka bir şey yapmam gerekiyor mu? formül =RegExReplace(cell)tanınmıyor .... ve yeni işlevler oluşturma konusunda biraz paslıyım.
dwwilson66

@ dwwilson66 Güncellendi!
nixda

RegEx içindeki tireye vurgu (Bu işaret, yanlış konumda ise deseninizi kırar)
Kızıl Bezelye

7

Nixda'nın koduna benzer bir şey kullanarak, hücrenin özel karakterleri varsa 1 döndürecek olan kullanıcı tanımlı bir işlev.

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

Kullanıcı Tanımlı İşlevlerin (UDF) kurulumu ve kullanımı çok kolaydır:

  1. ALT-F11, VBE penceresini açar
  2. ALT-I ALT-M yeni bir modül açar
  3. maddeleri yapıştırın ve VBE penceresini kapatın

Çalışma kitabını kaydederseniz, UDF onunla birlikte kaydedilir. 2003'ten sonraki bir Excel sürümünü kullanıyorsanız, dosyayı .xlsx yerine .xlsm olarak kaydetmeniz gerekir

UDF'yi kaldırmak için:

  1. yukarıdaki gibi VBE penceresini açın
  2. kodu temizle
  3. VBE penceresini kapat

Excel'den UDF'yi kullanmak için:

= IsSpecial (A1)

Genel olarak makrolar hakkında daha fazla bilgi edinmek için bkz:

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

ve

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

ve

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

UDF'lerle ilgili ayrıntılar için

Bunun çalışması için makroların etkinleştirilmesi gerekir !


Neden ayrı bir Or öğesi olarak "_" kullandınız? Aynı [] grubuna dahil edilebilir
jstuardo

@jstuardo Yalnızca alt çizginin geçerli bir karakter olduğunu açıkça belirtmek için .
Gary'nin Öğrencisi

If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" ThenMakro, boşlukların geçerli karakterler olduğunu varsayacak şekilde kodun güncelleştirilmemesi gerekir mi?
Ovaryraptor

@Ovaryraptor Doğru! Bunu yarın güncelleyeceğim.
Gary'nin Öğrencisi

2

İşte kayıtları özel karakterlerle işaretleyecek koşullu bir biçimlendirme çözümü.

A1Dosya adları sütununda ilk kayıt olan aşağıdaki (son derece uzun) formülü kullanan verilerinize yeni bir koşullu biçimlendirme kuralı uygulamanız yeterlidir:

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

Bu formül, her dosya adının her karakterini kontrol eder ve ASCII kodunun izin verilen karakter değerlerinin dışında olup olmadığını belirler. Ne yazık ki, izin verilen karakter kodlarının hepsi bitişik değildir, bu yüzden formülün toplamlarını SUMPRODUCTs kullanmak zorundadır . Formül, var olan kötü karakter sayısını döndürür. 0'dan büyük bir değer döndüren hücreler işaretlenir.

Misal: resim açıklamasını buraya girin


1

Özel karakterler bulmak için farklı bir yaklaşım kullandım. İzin verilen karakterlerin her biri için yeni sütunlar oluşturdum ve sonra her satır girişinde (Z2) izin verilen karakterin kaç kez olduğunu saymak için böyle bir formül kullandım:

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

Sonra her satırdaki izin verilen karakter sayısını topladım ve satır girişinin toplam uzunluğu ile karşılaştırdım.

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

Ve son olarak, negatif değerleri bulmak için son sütuna (BF2) sıraladım, bu da beni düzeltilmesi gereken sütunlara götürdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.