Microsoft Excel'de Düzenli İfadeler (Regex) hem hücre içi hem de döngüler nasıl kullanılır


592

Excel'de normal ifadeleri nasıl kullanabilirim ve veri işleme için Excel'in güçlü ızgara benzeri kurulumundan nasıl yararlanabilirim?

  • Bir dizede eşleşen deseni veya değiştirilen değeri döndürmek için hücre içi işlevi.
  • Sub bir veri sütununda döngü ve bitişik hücrelerle eşleşmeleri ayıklayın.
  • Hangi kurulum gerekli?
  • Excel'in Normal ifadeler için özel karakterleri nelerdir?

Ben Regex birçok durum (için ideal değildir anlaşılması kullanım için ya da değil normal ifadeler kullanmak? ) Excel kullanabilirsiniz beri Left, Mid, Right, Instrbenzer manipülasyonlara ilişkin tip komutları.


11
Patrick Matthews tarafından yazılan bu VB / VBA
Regexp

1
Bu ücretsiz eklentiyi deneyin: seotoolsforexcel.com/regexpfind
Niels Bosma

1
Normal ifade tarzı işlevselliğin bir çeşit hafif sürümünü sağlayan Like operatörü unutmayalım . Bir alt veya işlev yordamına sarılmış olsa bile normalde normal ifadeden çok daha hızlıdır.
Egalth

Yanıtlar:


955

Desen Eşleme için normal ifadeler kullanılır.

Excel'de kullanmak için şu adımları izleyin:

Adım 1 : VBA başvurusunu "Microsoft VBScript Regular Expressions 5.5" dosyasına ekleyin

  • "Geliştirici" sekmesini seçin ( Bu sekmem yok ne yapmalıyım? )
  • 'Kod' şerit bölümünden "Visual Basic" simgesini seçin
  • "Uygulamalar için Microsoft Visual Basic" penceresinde, üst menüden "Araçlar" ı seçin.
  • "Referanslar" ı seçin
  • Çalışma kitabınıza eklemek için "Microsoft VBScript Regular Expressions 5.5" yanındaki kutuyu işaretleyin.
  • "Tamam" ı tıklayın

Adım 2 : Deseninizi tanımlayın

Temel tanımlar:

- Aralık.

  • Örneğin a-z , a ile z arasındaki küçük harflerle eşleşir
  • Örneğin 0-50 ile 5 arasında herhangi bir sayı ile eşleşir

[] Bu parantez içindeki nesnelerden birini tam olarak eşleştirin.

  • Örneğin [a]a harfi ile eşleşir
  • Örneğin [abc], a, b veya c olabilen tek bir harfle eşleşir
  • Örneğin [a-z], alfabenin küçük harfleriyle eşleşir.

()Dönüş amaçları için farklı eşleşmeleri gruplandırır. Aşağıdaki örneklere bakın.

{} Önceden tanımlanan desenin tekrarlanan kopyaları için çarpan.

  • Örneğin, [a]{2}iki ardışık küçük a harfi ile eşleşir:aa
  • Örneğin [a]{1,3}en az birini ve en fazla üç küçük harf maçları a, aa,aaa

+ Kendisinden önce tanımlanan desenin en az bir veya daha fazlasını eşleştirin.

  • Örneğin a+maç olacak ardışık bir en a, aa, aaave benzeri

? Sıfır ya da kendisinden önce tanımlanan modellerden birini eşleştirin.

  • Örneğin, Desen mevcut olabilir veya olmayabilir, ancak yalnızca bir kez eşleştirilebilir.
  • Örneğin, [a-z]?boş dizeyle veya herhangi bir küçük harfle eşleşir.

* Önceden tanımlanan desenin sıfırını veya daha fazlasını eşleştirin. - Örneğin, mevcut olan veya olmayan desen için joker karakter. - Örneğin, [a-z]*boş dizeyle veya küçük harflerle dizeyle eşleşir.

. Yeni satır dışındaki herhangi bir karakterle eşleşir \n

  • Örn. İle a.başlayan ve dışındaki herhangi bir şeyle biten iki karakter dizesiyle eşleşir\n

| VEYA operatör

  • Örneğin, a|baracı ya da aya dab eşleştirilebilir eşleştirilebilir.
  • Örn red|white|orange, renklerden biriyle tam olarak eşleşir.

^ Operatör

  • Örneğin [^0-9] karakter bir sayı içeremez
  • Örneğin [^aA]karakter küçük aveya büyük harf olamazA

\ Aşağıdaki özel karakterden kaçar (yukarıdaki davranışı geçersiz kılar)

  • Örneğin \., \\, \(, \?, \$,\^

Ankraj Kalıpları:

^ Eşleşme dizenin başında gerçekleşmelidir

  • Örneğin ^aBirinci karakter küçük harf harf olmalıa
  • Örneğin ^[0-9]Birinci karakter bir sayı olmalıdır.

$ Eşleşme dizenin sonunda gerçekleşmelidir

  • Örneğin, a$son karakter küçük harf olmalıdıra

Öncelik tablosu:

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

Önceden Tanımlanmış Karakter Kısaltmaları:

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

Örnek 1 : Makro olarak çalıştır

Aşağıdaki örnek makro A1, ilk 1 veya 2 karakterin basamak olup olmadığını görmek için hücredeki değere bakar . Öyleyse, kaldırılır ve dizenin geri kalanı görüntülenir. Değilse, hiçbir eşleşme bulunmadığını bildiren bir kutu görünür. Hücre A1değerleri 12abcdöndürülecek abc, değeri döndürülecek , değeri 1abcdöndürülmeyecektir abc, abc123çünkü rakamlar dizenin başında değildi.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1")

    If strPattern <> "" Then
        strInput = Myrange.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

Örnek 2 : Hücre içi işlev olarak çalıştırma

Bu örnek, örnek 1 ile aynıdır, ancak hücre içi işlev olarak çalışacak şekilde ayarlanmıştır. Kullanmak için kodu şu şekilde değiştirin:

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String


    strPattern = "^[0-9]{1,3}"

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

Dizelerinizi ("12abc") hücreye yerleştirin A1. Bu formülü =simpleCellRegex(A1)hücreye B1girdiğinizde sonuç "abc" olur.

sonuç resmi


Örnek 3 : Döngü Aralığı

Bu örnek, örnek 1 ile aynıdır, ancak bir hücre aralığında dolaşır.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A5")

    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

Örnek 4 : Farklı kalıpları ayırma

Bu örnek, bir aralık ( A1, A2& A3) içinde dolaşır ve üç basamaktan sonra tek bir alfa karakteri ve ardından 4 sayısal basamaktan başlayan bir dize arar. Çıktı, model eşleşmelerini kullanarak bitişik hücrelere böler (). $1ifadesi, ilk kümesinde eşleşen ilk deseni temsil eder ().

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A3")

    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"

        If strPattern <> "" Then
            strInput = C.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

Sonuçlar:

sonuç resmi


Ek Kalıp Örnekleri

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit

22
Unutmamalısın Set regEx = Nothing. Bu Sub sık sık yürütüldüğünde, Yetersiz Bellek özel durumları elde edersiniz.
Kiril

1
Örnek 4'ü daha karmaşık regex tedavisi için SubMatches ile uyarladım , temelde bölme yaparken değiştirme kullanmıyorum, eğer ilgilenirse: stackoverflow.com/questions/30218413/…
Armfoot 13:15

11
Geç bağlama çizgisi:Set regEx = CreateObject("VBScript.RegExp")
ZygD

2
Tamam, çünkü kodun girildiđinden eminim ThisWorkbook. Kodu ayrı bir yere taşımayı deneyin Module.
Portland Koşucusu

3
@PortlandRunner "proje gezgini" (?) Bu excel dosya bir "Modüller" alt klasörü yoktu, ancak başka bir dosya bir gösterdi. Dosyayı sağ tıklayın ve 'modül ekle' seçeneğini seçin, ardından "Modül 1" i çift tıklayın ve kodu yapıştırın. Kaydedilen. Çalışma kitabına geri dönün ve işlevi tekrar tuşlayın - işe yaradı. Benim gibi tecrübesizler uğruna cevapta dikkate değer olabilir mi? Yardım için teşekkürler.
youcantryreachingme

205

Normal ifadeleri doğrudan Excel formüllerinde kullanmak için aşağıdaki UDF (kullanıcı tanımlı işlev) yardımcı olabilir. Bir excel işlevi olarak düzenli ifade işlevini az çok doğrudan ortaya koyar.

Nasıl çalışır

2-3 parametre alır.

  1. Normal ifadeyi kullanmak için bir metin.
  2. Düzenli bir ifade.
  3. Sonucun nasıl görünmesi gerektiğini belirten bir biçim dizesi. Bu içerebilir $0, $1, $2, ve bu kadar. $0eşleşmenin tamamıdır $1ve yukarı normal ifadedeki ilgili eşleme gruplarına karşılık gelir. Varsayılan olarak $0.

Bazı örnekler

Bir e-posta adresini ayıklama:

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

Sonuçlar: some@email.com

Birkaç alt dizeyi ayıklama:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

Sonuçlar: E-Mail: some@email.com, Name: Peter Gordon

Tek bir hücredeki birleştirilmiş bir dizeyi birden çok hücredeki bileşenlerine ayırmak için:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

Sonuçlar: Peter Gordon some@email.com...

Nasıl kullanılır

Bu UDF'yi kullanmak için aşağıdakileri yapın (kabaca bu Microsoft sayfasına dayanırlar . Orada iyi ek bilgiler var!):

  1. Excel'de Makro özellikli bir dosyada ('.xlsm') Microsoft Visual Basic for Applications'ıALT+F11 açmak için basın Editor'ı .
  2. Düzenli İfadeler kütüphanesine VBA referansı ekleyin ( Portland Runners ++ yanıtından utanmadan kopyalandı ):
    1. Araçlar -> Referanslar'ı tıklayın (lütfen alman ekran görüntüsünü bahane edin) Araçlar -> Referanslar
    2. Listede Microsoft VBScript Regular Expressions 5.5'i bulun ve yanındaki onay kutusunu işaretleyin.
    3. Tıklayın Tamam .
  3. Modül Ekle'ye tıklayın . Modülünüze farklı bir ad verirseniz, Modülün aşağıdaki UDF ile aynı ada sahip olmadığından emin olun (örn. Modülü adlandırmak Regexve işlev #NAME! Hatalarına regexneden olur ).

    Simge satırındaki ikinci simge -> Modül

  4. Ortadaki büyük metin penceresinde aşağıdakileri ekleyin:

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
  5. Kaydedin ve Microsoft Visual Basic for Applications Editor penceresini kapatın.


6
Bu yanıt , Eklenti oluşturmak için buradaki adımlarla birleştirildiğinde çok yardımcı oldu. Teşekkür ederim. Modülünüzü vermediğinizden ve aynı adı kullandığınızdan emin olun!
Chris Hunt

2
Yukarıdaki yorumu Chris Hunt'tan yineliyorum. Modülünüzü 'Regex' de aramayın. #NAME hatası nedeniyle işlev çalışmadığı için bir süre çıldığımı sanıyordum
Chris

Her şeyi denediğimde (modülleri / adları değiştirme dahil) ve #NAME hatasını almaya devam ederken deli oldum
Enissay

@Enissay: İşe yarayıp yaramadığını Function foo() As Variant \n foo="Hello World" \n End Functiongörmek için minimal bir UDF oluşturmayı deneyin . Evet ise, temel bir şey kırılmazsa (makrolar devre dışı bırakılmış mı?).
Patrick Böker


64

Üzerine Genişleyen patszim 'ın cevabı acele olanlar için.

  1. Excel çalışma kitabını açın.
  2. Alt+ F11VBA / Makrolar penceresini açın.
  3. Araçlar'ın ardından Referanslar'ın altındaki regex'e referans ekleyin
    ! [Excel VBA Form referans ekleyin
  4. ve Microsoft VBScript Düzenli İfade 5.5'i seçme
    ! [Excel VBA normal ifade referansı ekle
  5. Yeni bir modül takın (kodun modülde bulunması gerekir, aksi takdirde çalışmaz).
    ! [Excel VBA ekleme kod modülü
  6. Yeni takılan modülde,
    ! [Excel VBA modüle kod ekleme
  7. aşağıdaki kodu ekleyin:

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "not matched"
        End If
    End Function
  8. Normal ifade deseni hücrelerden birine yerleştirilir ve üzerinde mutlak referanslama kullanılır. ! [Excel normal ifade işlevi hücre içi kullanımı İşlev, oluşturulduğu çalışma kitabına bağlı olacaktır.
    Farklı çalışma kitaplarında kullanılması gerekiyorsa, işlevi Personal.XLSB'de saklayın


1
Üzerinde çalıştığınız tüm Excel belgelerinde bulunması için Personal.xlsb dosyasında olması gerektiğini belirttiğiniz için teşekkür ederiz. Diğer cevapların çoğu (?) Bunu netleştirmiyor. Personal.XLSB klasöre gider (klasörü oluşturmanız gerekebilir) C: \ Users \ kullanıcı adı \ AppData \ Local \ Microsoft \ Excel \ XLStart klasörü
Mark Stewart

26

İşte benim girişimim:

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp

    With regex
        .IgnoreCase = True  'ignoring cases while regex engine performs the search.
        .pattern = pattern  'declaring regex pattern.
        .Global = False     'restricting regex to find only first match.

        If .Test(html) Then         'Testing if the pattern matches or not
            mStr = .Execute(html)(0)        '.Execute(html)(0) will provide the String which matches with Regex
            RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
        Else
            RegParse = "#N/A"
        End If

    End With
End Function

9

Bunu bir hücre fonksiyonu ( SUMveya gibi VLOOKUP) olarak kullanmak gerekiyordu ve kolay olduğunu buldum:

  1. Makro Etkin bir Excel Dosyasında olduğunuzdan emin olun (xlsm olarak kaydedin).
  2. Geliştirici araçlarını aç Alt+F11
  3. Microsoft VBScript Regular Expressions 5.5'i diğer yanıtlarda olduğu gibi ekleyin
  4. Aşağıdaki işlevi çalışma kitabında veya kendi modülünde oluşturun:

    Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
        Dim regex As New VBScript_RegExp_55.RegExp
        Dim strInput As String
    
        strInput = myRange.Value
    
        With regex
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
    
        REGPLACE = regex.Replace(strInput, outputPattern)
    
    End Function
  5. Ardından =REGPLACE(B1, "(\w) (\d+)", "$1$2")(örn: "A 243" ila "A243") arasındaki hücrede kullanabilirsiniz


Bu outputPattern adlandırması beni attı. Değiştirilen değerdir.
Thor

1
Evet. Bunun temizlemek oldu bu yüzden sadece dize ikame değildi adlı model bıraktı varsayalım ve vb $ 1 $ 2 gibi regex eşleştirme grupları kullanabilirsiniz
DeezCashews

7

Bu doğrudan bir cevap değildir, ancak değerlendirmeniz için daha etkili bir alternatif sağlayabilir. Google E-Tablolar'da yerleşik Regex İşlevleri sahip olması bunlar çok uygun olabilir ve Excel'deki bazı teknik prosedürleri atlatmaya yardımcı olabilir. Açıkçası, Excel'in PC'nizde kullanılmasının bazı avantajları vardır, ancak kullanıcıların büyük çoğunluğu için Google E-Tablolar aynı deneyimi sunacak ve belgelerin taşınabilirliği ve paylaşılmasında bazı avantajlar sunabilir.

Onların teklifi

REGEXEXTRACT: Normal bir ifadeye göre eşleşen alt dizeleri ayıklar.

REGEXREPLACE: Metin dizesinin bir kısmını normal ifadeler kullanarak farklı bir metin dizesiyle değiştirir.

YERİNEKO: Mevcut metni bir dizedeki yeni metinle değiştirir.

DEĞİŞTİR: Metin dizesinin bir kısmını farklı bir metin dizesiyle değiştirir.

Bunları doğrudan böyle bir hücreye yazabilirsiniz ve istediğinizi üretebilirsiniz

=REGEXMATCH(A2, "[0-9]+")

Ayrıca, IF ifadeleri gibi diğer işlevlerle kombinasyon halinde oldukça iyi çalışırlar :

=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")

resim açıklamasını buraya girin

Umarım bu, Excel'in VBS bileşeni tarafından alay konusu olan kullanıcılar için basit bir geçici çözüm sağlar.


Alex'i paylaştığın için teşekkürler. Bu, Google sürümünü arayanlar için kullanışlıdır. Kendi isimlendirmesine sahip olduğu ve başkaları için çok yararlı olacağı için Google E-Tablolar Regex'e özgü başka bir soru yazmayı ve yanıtlamayı düşünebilirsiniz. Ne olursa olsun, benim oy var!
Portland Runner

4

İşte bir regex_subst()işlev. Örnekler:

=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo

İşte basitleştirilmiş kod (zaten benim için daha basit). Örneklerim gibi çalışmak için yukarıdakileri kullanarak uygun bir çıktı modelinin nasıl oluşturulacağını anlayamadım:

Function regex_subst( _
     strInput As String _
   , matchPattern As String _
   , Optional ByVal replacePattern As String = "" _
) As Variant
    Dim inputRegexObj As New VBScript_RegExp_55.RegExp

    With inputRegexObj
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = matchPattern
    End With

    regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function

1

Betiklerimin taşınabilir olması gerektiğinden bir referans kitaplığını etkinleştirmek istemiyorum. Sebep olan Dim foo As New VBScript_RegExp_55.RegExpçizgiUser Defined Type Not Defined hataları, ama benim için çalışan bir çözüm buldu.

Yapmak isteyeceğiniz şey hücreye örnek bir dize koymak A1, sonra test etmek strPattern. Bu çalıştıktan sonra rngistediğiniz gibi ayarlayın .

Public Sub RegExSearch()
'/programming/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
'https://www.vitoshacademy.com/vba-regex-in-excel/
    Dim regexp As Object
    'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
    Dim rng As Range, rcell As Range
    Dim strInput As String, strPattern As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = ActiveSheet.Range("A1:A1")

    strPattern = "([a-z]{2})([0-9]{8})"
    'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched

    With regexp
        .Global = False
        .MultiLine = False
        .ignoreCase = True
        .Pattern = strPattern
    End With

    For Each rcell In rng.Cells

        If strPattern <> "" Then
            strInput = rcell.Value

            If regexp.test(strInput) Then
                MsgBox rcell & " Matched in Cell " & rcell.Address
            Else
                MsgBox "No Matches!"
            End If
        End If
    Next
End Sub

Betiklerimin taşınabilir olması gerektiğinden bir referans kütüphanesini etkinleştirmek istemiyorum - VBScript_RegExp_55kütüphane hemen hemen her yerde var, bu yüzden belirli bir hedef makinede olmama riski çok düşük. Her neyse, Erken
Bağlama'dan Geç Bağlama'ya

1
Hayır, bu hiç doğru değil, bu komut dosyası taşınabilir bir şey etkinleştirmeden başka bir kullanıcıyla paylaşılabilir. Thanks tho
FreeSoftwareServers

1
Elbette, ancak RegEx kodu kullanılamaz . RegEx şeyler daha büyük bir kütüphane çalışma kitabının bir parçası ise, sanırım bu derleme hatası atmak zorunda değilsiniz, bu nedenle diğer parçaların kullanılmasına izin yararlı kabul edilebilir
chris neilsen

1

Değerli içeriğe eklemek için, bazen VBA içindeki RegEx'in neden ideal olmadığına dair bu hatırlatıcıyı oluşturmak istiyorum. Tüm ifadeler desteklenmez, ancak bunun yerine Error 5017yazarın tahminini bırakabilir (ki kendimin kurbanıyım).

Bazı bulabilirsiniz iken kaynaklar ne olduğu desteklenen, bu yararlı hangi vb meta bilmek olurdu değil destekledi. Daha ayrıntılı bir açıklama burada bulunabilir . Bu kaynakta bahsedildi:

"Her ne kadar" VBScript'in düzenli ifadesi ... sürüm 5.5, VBScript'in önceki sürümlerinde eksik olan birkaç temel regex özelliğini uygular. ... JavaScript ve VBScript Perl tarzı düzenli ifadeler uygular. Ancak, Perl'de ve diğer modern düzenli ifade lezzetlerinde oldukça fazla sayıda gelişmiş özelliğe sahip değiller: "


Yani, değil desteklenir:

  • String ancor'un başlangıcında \A, alternatif ^olarak dize 1. karakterden önce konumu eşleştirmek için düzeltme işaretini kullanın
  • Dize Sonu ancor \Z, alternatif olarak $dolar işaretini kullanarak dizedeki son karakterden sonraki konumu eşleştirin
  • Pozitif Geriye İlerleme, örneğin: (?<=a)b(pozitif LookAhead iken edilir desteklenir)
  • Negatif Geriye İlerleme, örneğin: (?<!a)b(negatif LookAhead iken edilir desteklenir)
  • Atomik Gruplama
  • İyelik Niceleyicileri
  • Unicode örn .: \{uFFFF}
  • İsimli Yakalama Grupları . Alternatif olarak Numaralı Yakalama Gruplarını kullanın
  • Satır içi değiştiriciler, örneğin: /i(büyük / küçük harf duyarlılığı) veya /g(global) vb. Bunları RegExpnesne özellikleri> RegExp.Global = Trueve RegExp.IgnoreCase = Truevarsa ayarlayın .
  • Şartlılar
  • Düzenli İfade Yorumları . Bunları 'komut dosyasına düzenli yorumlarla ekleyin

VBA içinde düzenli ifadeler kullanarak bir kereden fazla bir duvara çarptım. Genellikle LookBehinddeğiştiricileri bile unutuyorum. Yukarıda belirtilen tüm bu fonları kendim yaşamadım, ancak daha derinlemesine bilgilere atıfta bulunarak kapsamlı olmaya çalışacağımı düşündüm. Yorum yapmaktan / düzeltmekten / eklemekten çekinmeyin. Büyük bir bilgi zenginliği için düzenli ifadelere .

PS Düzenli VBA yöntemlerinden ve işlevlerinden bahsettiniz ve (en azından kendime) RegEx'in başarısız olacağı kendi yollarında yardımcı olduklarını onaylayabilirim.

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.