Cara menggunakan Ekspresi Reguler (Regex) di Microsoft Excel baik di dalam sel dan loop


592

Bagaimana saya bisa menggunakan ekspresi reguler di Excel dan memanfaatkan setup seperti grid Excel yang kuat untuk manipulasi data?

  • Fungsi dalam sel untuk mengembalikan pola yang cocok atau nilai yang diganti dalam string.
  • Sub untuk loop melalui kolom data dan mengekstrak kecocokan ke sel yang berdekatan.
  • Pengaturan apa yang diperlukan?
  • Apa karakter khusus Excel untuk ekspresi reguler?

Saya mengerti Regex tidak ideal untuk banyak situasi ( Untuk penggunaan atau tidak menggunakan kalimat biasa? ) Sejak excel dapat menggunakan Left, Mid, Right, Instrjenis perintah untuk manipulasi serupa.


11
Saya sangat merekomendasikan artikel VB / VBA Regexp ini oleh Patrick Matthews
brettdj

1
Coba add-in gratis ini: seotoolsforexcel.com/regexpfind
Niels Bosma

1
Jangan lupa Like operator , yang menyediakan semacam versi ringan dari fungsionalitas gaya regex. Ini biasanya jauh lebih cepat daripada regex, bahkan jika dibungkus dengan sub atau fungsi prosedur.
Egalth

Jawaban:


955

Ekspresi reguler digunakan untuk Pencocokan Pola.

Untuk digunakan di Excel ikuti langkah-langkah ini:

Langkah 1 : Tambahkan referensi VBA ke "Microsoft VBScript Regular Expressions 5.5"

  • Pilih tab "Pengembang" ( saya tidak memiliki tab ini apa yang harus saya lakukan? )
  • Pilih ikon "Visual Basic" dari bagian pita 'Kode'
  • Di jendela "Microsoft Visual Basic for Applications" pilih "Tools" dari menu atas.
  • Pilih "Referensi"
  • Centang kotak di sebelah "Microsoft VBScript Regular Expressions 5.5" untuk disertakan dalam buku kerja Anda.
  • Klik "OK"

Langkah 2 : Tentukan pola Anda

Definisi dasar:

- Jarak.

  • Misalnya a-zcocok dengan huruf kecil dari a ke z
  • Misalnya 0-5cocok dengan angka dari 0 hingga 5

[] Cocokkan persis salah satu objek di dalam kurung ini.

  • Misalnya [a]cocok dengan huruf a
  • Misalnya [abc]cocok dengan satu huruf yang bisa a, b atau c
  • Misalnya [a-z]cocok dengan huruf tunggal alfabet tunggal.

()Kelompokkan pertandingan yang berbeda untuk tujuan pengembalian. Lihat contoh di bawah ini.

{} Pengganda untuk salinan pola berulang yang ditentukan sebelumnya.

  • Misalnya [a]{2}cocok dengan dua huruf kecil berturut-turut a:aa
  • Misalnya [a]{1,3}pertandingan setidaknya satu dan sampai tiga huruf kecil a, aa,aaa

+ Cocokkan setidaknya satu, atau lebih, dari pola yang ditentukan sebelumnya.

  • Misalnya a+akan cocok berturut-turut yang ini a, aa, aaa, dan sebagainya

? Cocokkan nol atau salah satu pola yang ditentukan sebelumnya.

  • Misalnya Pola mungkin ada atau tidak ada tetapi hanya dapat dicocokkan satu kali.
  • Misalnya [a-z]?cocok dengan string kosong atau huruf kecil apa pun.

* Cocokkan nol atau lebih dari pola yang ditentukan sebelumnya. - Misalnya Wildcard untuk pola yang mungkin ada atau tidak ada. - Misalnya [a-z]*cocok dengan string kosong atau string huruf kecil.

. Cocok dengan karakter apa pun kecuali baris baru \n

  • Misalnya a.Mencocokkan string dua karakter yang dimulai dengan a dan berakhir dengan apa pun kecuali\n

| ATAU operator

  • Misalnya a|bartinya bisa aatau bbisa dicocokkan.
  • Misalnya red|white|orangecocok dengan salah satu warna.

^ BUKAN operator

  • Misal [^0-9]karakter tidak bisa berisi angka
  • Misalnya [^aA]karakter tidak boleh huruf kecil aatau huruf besarA

\ Lolos karakter khusus yang mengikuti (menimpa perilaku di atas)

  • Misalnya \., \\, \(, \?, \$,\^

Pola Penahan:

^ Kecocokan harus terjadi pada awal string

  • Misalnya ^aKarakter pertama harus huruf kecila
  • Misalnya ^[0-9]karakter pertama harus berupa angka.

$ Kecocokan harus terjadi pada akhir string

  • Mis. a$Karakter Terakhir harus huruf kecila

Tabel diutamakan:

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

Singkatan Karakter Predefined:

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

Contoh 1 : Jalankan sebagai makro

Contoh makro berikut ini melihat nilai dalam sel A1untuk melihat apakah 1 atau 2 karakter pertama adalah digit. Jika demikian, mereka dihapus dan sisa string ditampilkan. Jika tidak, maka sebuah kotak muncul yang memberi tahu Anda bahwa tidak ada kecocokan yang ditemukan. A1Nilai sel 12abcakan kembali abc, nilai 1abcakan kembali abc, nilai abc123akan kembali "Tidak Cocok" karena digit tidak pada awal string.

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

Contoh 2 : Jalankan sebagai fungsi dalam sel

Contoh ini sama dengan contoh 1 tetapi diatur untuk dijalankan sebagai fungsi dalam sel. Untuk menggunakan, ubah kode menjadi ini:

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

Tempatkan string Anda ("12abc") di dalam sel A1. Masukkan formula ini =simpleCellRegex(A1)dalam sel B1dan hasilnya akan "abc".

hasil gambar


Contoh 3 : Lingkaran Melalui Lingkaran

Contoh ini sama dengan contoh 1 tetapi loop melalui berbagai sel.

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

Contoh 4 : Membagi pola yang berbeda

Contoh ini loop melalui rentang ( A1, A2& A3) dan mencari string yang dimulai dengan tiga digit diikuti oleh karakter alfa tunggal dan kemudian 4 digit angka. Output memisahkan pola yang cocok dengan sel yang berdekatan dengan menggunakan (). $1mewakili pola pertama yang cocok dalam set pertama ().

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

Hasil:

hasil gambar


Contoh Pola Tambahan

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
Anda tidak boleh lupa Set regEx = Nothing. Anda akan mendapatkan pengecualian Memori Kehabisan, ketika Sub itu dieksekusi cukup sering.
Kiril

1
Saya mengadaptasi contoh 4 dengan SubMatches untuk merawat regex yang lebih kompleks, pada dasarnya saya tidak menggunakan ganti ketika membelah, jika ada yang tertarik: stackoverflow.com/questions/30218413/…
Armfoot

11
Baris pengikat terlambat:Set regEx = CreateObject("VBScript.RegExp")
ZygD

2
Oke, aku cukup yakin itu karena kode ini di ThisWorkbook. Coba pindahkan kodenya ke yang terpisah Module.
Portland Runner

3
@ PortlandRunner di "project explorer" (?) File excel ini tidak memiliki subfolder "Modul", meskipun file lain menunjukkan satu. Klik kanan file dan pilih 'masukkan modul', lalu klik dua kali "Modul 1" dan tempelkan kode. Diselamatkan. Kembali ke buku kerja dan masukkan fungsi lagi - itu berhasil. Mungkin patut diperhatikan dalam jawaban, demi yang kurang berpengalaman seperti saya? Terima kasih untuk bantuannya.
youcantryreachingme

205

Untuk menggunakan ekspresi reguler secara langsung dalam rumus Excel, UDF berikut (fungsi yang ditentukan pengguna) dapat membantu. Ini kurang lebih secara langsung memperlihatkan fungsi ekspresi reguler sebagai fungsi excel.

Bagaimana itu bekerja

Dibutuhkan 2-3 parameter.

  1. Teks untuk menggunakan ekspresi reguler aktif.
  2. Ekspresi reguler.
  3. String format yang menentukan bagaimana hasilnya akan terlihat. Hal ini dapat mengandung $0, $1, $2, dan sebagainya. $0adalah seluruh pertandingan, $1dan naik sesuai dengan grup pertandingan masing-masing dalam ekspresi reguler. Default ke $0.

Beberapa contoh

Mengekstrak alamat email:

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

Hasil dalam: some@email.com

Mengekstraksi beberapa substring:

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

Hasil dalam: E-Mail: some@email.com, Name: Peter Gordon

Untuk memisahkan string gabungan dalam satu sel ke dalam komponennya dalam banyak sel:

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

Hasil dalam: Peter Gordon some@email.com...

Cara Penggunaan

Untuk menggunakan UDF ini lakukan hal berikut (kira-kira berdasarkan halaman Microsoft ini . Mereka memiliki beberapa info tambahan yang bagus di sana!):

  1. Di Excel dalam file berkemampuan Makro ('.xlsm') tekan ALT+F11untuk membuka Microsoft Visual Basic for Applications Editor.
  2. Tambahkan referensi VBA ke perpustakaan Ekspresi Reguler (tanpa malu disalin dari jawaban Portland Runners ++ ):
    1. Klik pada Tools -> Referensi (mohon maaf tangkapan layar jerman) Alat -> Referensi
    2. Temukan Microsoft Regular Expressions 5.5 VBScript dalam daftar dan centang kotak di sebelahnya.
    3. Klik OK .
  3. Klik pada Insert Module . Jika Anda memberi nama yang berbeda pada modul Anda, pastikan Modul tidak memiliki nama yang sama dengan UDF di bawah ini (mis. Menamai Modul Regexdan fungsinya regexmenyebabkan kesalahan #NAME! ).

    Ikon kedua di baris ikon -> Modul

  4. Di jendela teks besar di tengah masukkan yang berikut:

    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. Simpan dan tutup jendela Editor Visual Microsoft untuk Aplikasi .


6
Jawaban ini dikombinasikan dengan langkah-langkah di sini untuk membuat Add-In, sangat membantu. Terima kasih. Pastikan Anda tidak memberikan modul dan fungsi dengan nama yang sama!
Chris Hunt

2
Hanya mengulangi komentar di atas dari Chris Hunt. Jangan panggil Modul Anda 'Regex' juga. Kupikir aku akan menjadi gila untuk sementara waktu karena fungsinya tidak akan berfungsi karena kesalahan #NAME
Chris

Yah, saya sudah gila ketika saya mencoba semuanya (termasuk mengganti modul / nama) dan masih mendapatkan kesalahan #NAME> _> i.imgur.com/UUQ6eCi.png
Enissay

@Enissay: Coba buat Function foo() As Variant \n foo="Hello World" \n End FunctionUDF minimal untuk melihat apakah itu berhasil. Jika ya, lanjutkan dengan cara penuh di atas, jika tidak ada sesuatu yang dasar rusak (makro dinonaktifkan?)
Patrick Böker


64

Memperluas pada patszim 's jawaban bagi mereka terburu-buru.

  1. Buka buku kerja Excel.
  2. Alt+ F11untuk membuka jendela VBA / Macro.
  3. Tambahkan referensi ke regex di bawah Alat lalu Referensi
    ! [Formulir Excel VBA menambahkan referensi
  4. dan memilih Microsoft VBScript Regular Expression 5.5
    ! [Excel VBA menambahkan referensi regex
  5. Masukkan modul baru (kode harus berada di modul jika tidak, tidak akan berfungsi).
    ! [Modul kode sisipan Excel VBA
  6. Dalam modul yang baru dimasukkan,
    ! [Excel VBA memasukkan kode ke dalam modul
  7. tambahkan kode berikut:

    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. Pola regex ditempatkan di salah satu sel dan referensi absolut digunakan di atasnya. ! [Penggunaan fungsi regex Excel dalam sel Fungsi akan diikat ke buku kerja yang dibuat.
    Jika ada kebutuhan untuk digunakan dalam buku kerja yang berbeda, simpan fungsi di Personal.XLSB


1
Terima kasih telah menyebutkan itu harus di Personal.xlsb tersedia di semua dokumen Excel yang Anda kerjakan. Sebagian besar (?) Jawaban lain tidak menjelaskan. Personal.XLSB akan masuk dalam folder (mungkin perlu membuat folder) C: \ Users \ nama pengguna \ AppData \ Local \ Microsoft \ Excel \ XLStart folder
Mark Stewart

26

Ini usaha saya:

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

Saya perlu menggunakan ini sebagai fungsi sel (suka SUMatau VLOOKUP) dan menemukan bahwa itu mudah:

  1. Pastikan Anda berada di File Excel yang Diaktifkan Makro (simpan sebagai xlsm).
  2. Buka alat pengembang Alt+F11
  3. Tambahkan Microsoft VBScript Regular Expressions 5.5 seperti di jawaban lain
  4. Buat fungsi berikut di buku kerja atau di modul sendiri:

    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. Kemudian Anda dapat menggunakan sel dengan =REGPLACE(B1, "(\w) (\d+)", "$1$2")(mis: "A 243" hingga "A243")


Penamaan outputPattern ini membuat saya kecewa. Itu nilai penggantian.
Thor

1
Iya. Saya kira saya meninggalkannya dengan nama pattern jadi jelas itu bukan hanya penggantian string dan Anda bisa menggunakan grup pencocokan regex seperti $ 1 $ 2 dll.
DeezCashews

7

Ini bukan jawaban langsung tetapi dapat memberikan alternatif yang lebih efisien untuk pertimbangan Anda. Google Sheets memiliki beberapa fungsi Regex bawaan, ini bisa sangat nyaman dan membantu menghindari beberapa prosedur teknis di Excel. Jelas ada beberapa keuntungan menggunakan Excel di PC Anda, tetapi untuk sebagian besar pengguna Google Sheets akan menawarkan pengalaman yang sama dan mungkin menawarkan beberapa manfaat dalam portabilitas dan berbagi dokumen.

Mereka menawarkan

REGEXEXTRACT: Ekstrak substring yang cocok sesuai dengan ekspresi reguler.

REGEXREPLACE: Mengganti bagian dari string teks dengan string teks yang berbeda menggunakan ekspresi reguler.

SUBSTITUTE: Mengganti teks yang ada dengan teks baru dalam sebuah string.

REPLACE: Mengganti bagian dari string teks dengan string teks yang berbeda.

Anda dapat mengetik ini langsung ke sel seperti itu dan akan menghasilkan apa pun yang Anda inginkan

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

Mereka juga bekerja sangat baik dalam kombinasi dengan fungsi-fungsi lain seperti pernyataan IF seperti:

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

masukkan deskripsi gambar di sini

Semoga ini memberikan solusi sederhana bagi pengguna yang merasa diejek oleh komponen VBS Excel.


Terima kasih sudah berbagi Alex. Ini berguna bagi mereka yang mencari versi Google. Anda dapat mempertimbangkan untuk menulis & menjawab pertanyaan lain khusus untuk Google Sheets Regex karena memiliki nomenklatur sendiri dan akan sangat berguna bagi orang lain. Apa pun yang terjadi, Anda mendapatkan jawaban saya!
Portland Runner

4

Berikut ini regex_subst()fungsinya. Contoh:

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

Berikut adalah kode yang disederhanakan (toh, lebih sederhana untuk saya). Saya tidak tahu bagaimana membangun pola keluaran yang cocok menggunakan cara di atas untuk bekerja seperti contoh saya:

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

Saya tidak ingin harus mengaktifkan pustaka referensi karena saya perlu skrip saya menjadi portabel. The Dim foo As New VBScript_RegExp_55.RegExpgaris disebabkanUser Defined Type Not Defined kesalahan, tapi saya menemukan solusi yang bekerja untuk saya.

Yang ingin Anda lakukan adalah memasukkan contoh string ke dalam sel A1, lalu menguji strPattern. Setelah itu berfungsi sesuaikan kemudian rngseperti yang diinginkan.

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

Saya tidak ingin harus mengaktifkan pustaka referensi karena saya perlu skrip saya menjadi portabel - VBScript_RegExp_55perpustakaan cukup banyak di mana-mana sehingga membawa risiko yang sangat rendah tidak berada pada mesin target tertentu. Lagi pula, beralih dari Early Bound ke Late Bound tidak menyelesaikan masalah portabilitas (kode masih akan error, hanya pada saat run daripada waktu kompilasi)
chris neilsen

1
Tidak, itu tidak benar sama sekali, skrip ini dapat dibagikan dengan pengguna lain tanpa mereka mengaktifkan apa pun yang portabel. Terima kasih tho
FreeSoftwareServers

1
Tentu, tetapi kode RegEx tidak dapat digunakan . Jika hal-hal RegEx adalah bagian dari buku kerja perpustakaan yang lebih besar, saya kira setelah itu tidak membuat kesalahan kompilasi karena itu memungkinkan bagian lain untuk digunakan dapat dianggap berguna
chris neilsen

1

Untuk menambah konten yang berharga, saya ingin membuat pengingat ini tentang mengapa kadang-kadang RegEx dalam VBA tidak ideal. Tidak semua ekspresi didukung, tetapi sebaliknya dapat melempar Error 5017dan dapat membiarkan tebakan penulis (yang saya korban dari diri saya sendiri).

Meskipun kami dapat menemukan beberapa sumber tentang apa yang didukung, akan sangat membantu untuk mengetahui karakter metak dll yang tidak didukung. Penjelasan yang lebih mendalam dapat ditemukan di sini . Disebutkan dalam sumber ini:

"Meskipun" ekspresi reguler VBScript ... versi 5.5 mengimplementasikan beberapa fitur regex penting yang hilang dalam versi VBScript sebelumnya. ... JavaScript dan VBScript menerapkan ekspresi reguler gaya Perl. Namun, mereka tidak memiliki cukup banyak fitur canggih yang tersedia di Perl dan rasa ekspresi reguler modern lainnya: "


Jadi, yang tidak didukung adalah:

  • Mulai dari String ancor \A, atau gunakan ^tanda sisipan untuk mencocokkan posisi sebelum karakter pertama dalam string
  • Akhir dari String \Z, gunakan $tanda dolar untuk mencocokkan posisi setelah karakter terakhir
  • Positif lookbehind, misalnya: (?<=a)b(sementara LookAhead postive yang didukung)
  • Lookbehind negatif, misalnya: (?<!a)b(sementara LookAhead negatif yang didukung)
  • Pengelompokan Atom
  • Penentu Posesif
  • Unicode misalnya: \{uFFFF}
  • Dinamakan Menangkap Grup . Atau gunakan Grup Pengambilan Angka
  • Pengubah sebaris, misalnya: /i(sensitivitas huruf) atau /g(global) dll. Atur ini melalui RegExpproperti objek> RegExp.Global = Truedan RegExp.IgnoreCase = Truejika tersedia.
  • Persyaratan
  • Komentar Ekspresi Reguler . Tambahkan ini dengan 'komentar reguler dalam skrip

Saya sudah menabrak dinding lebih dari sekali menggunakan ekspresi reguler dalam VBA. Biasanya dengan LookBehindtapi kadang-kadang saya bahkan lupa pengubah. Saya belum mengalami sendiri semua latar belakang yang disebutkan di atas, tetapi saya pikir saya akan mencoba untuk lebih luas merujuk pada beberapa informasi yang lebih mendalam. Jangan ragu untuk berkomentar / memperbaiki / menambah. Teriakan besar untuk regular-expressions.info untuk banyak informasi.

PS Anda telah menyebutkan metode dan fungsi VBA biasa, dan saya dapat mengonfirmasi bahwa mereka (setidaknya untuk diri saya sendiri) telah membantu dengan cara mereka sendiri di mana RegEx akan gagal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.