Özellik ikonu

RegExp

İndirme izni yok

Genel Bakış

RegExp (Regular Expression), VBA'da düzenli ifade (desen) kullanarak metin içinde arama, doğrulama, ayıklama ve değiştirme yapmanızı sağlayan nesnedir. Telefon, kod ya da e-posta gibi biçimi belli metinleri tek bir desenle denetlemek için kullanılır. Excel'in kendi işlevleriyle yazması zor olan karmaşık metin işlemlerini kısa bir kodla çözer.

Nesneyi oluşturma​

RegExp nesnesi VBA'nın kendi nesnelerinden biri değildir; Windows'ta VBScript kitaplığı ile gelir. İki yolla kullanılır: CreateObject ile geç bağlama ya da Araçlar > Başvurular (Tools > References) penceresinden Microsoft VBScript Regular Expressions 5.5 kitaplığını işaretleyerek erken bağlama.
VBA 7 satır
' Geç bağlama (başvuru eklemek gerekmez)
Dim rg As Object
Set rg = CreateObject("VBScript.RegExp")

' Erken bağlama (kitaplık başvurusu eklendikten sonra)
Dim rg2 As RegExp
Set rg2 = New RegExp
Geç bağlama farklı bilgisayarlarda başvuru sorunu çıkarmaz; erken bağlama ise kod yazarken IntelliSense desteği verir.

Önemli özellikler​

Desenin nasıl çalışacağı şu özelliklerle belirlenir:
  • Pattern: Aranacak deseni belirten metindir. Arama yapılmadan önce mutlaka atanmalıdır.
  • Global: True ise tüm eşleşmeler bulunur ya da değiştirilir; False ise yalnız ilk eşleşme işlenir. Varsayılan değer False'tur.
  • IgnoreCase: True ise büyük/küçük harf ayrımı yapılmaz. Varsayılan değer False'tur.
  • MultiLine: True ise ^ ve $ işaretleri her satırın başını ve sonunu da eşleştirir. Varsayılan değer False'tur.

Önemli yöntemler ve olaylar​

RegExp nesnesinin olayı yoktur; üç yöntemle çalışılır:
VBA 3 satır
Nesne.Test(kaynakMetin) As Boolean
Nesne.Execute(kaynakMetin) As MatchCollection
Nesne.Replace(kaynakMetin, yeniMetin) As String
  • Test: Metinde desene uyan bir parça varsa True, yoksa False döndürür. Doğrulama için en kısa yoldur.
  • Execute: Eşleşmeleri bir MatchCollection olarak verir. Her Match nesnesinin Value (bulunan metin), FirstIndex (başlangıç konumu, sıfırdan başlar), Length (uzunluk) ve SubMatches (parantezli grupların içeriği) özellikleri vardır.
  • Replace: Eşleşen parçaları yeniMetin ile değiştirip sonucu döndürür. Yeni metinde $1, $2 gibi ifadelerle parantezli gruplara başvurulabilir.

Sık kullanılan desen öğeleri​

Pattern özelliğine yazılan desenlerde şu öğeler çok kullanılır. Aşağıdaki kod bloğu, örnek desenleri yorum satırlarıyla gösterir:
VBA 6 satır
rg.Pattern = "^\d{3}$"        ' Tam olarak 3 rakam
rg.Pattern = "\D"              ' Rakam olmayan her karakter
rg.Pattern = "^[A-Z]{2}-\d+$"  ' İki büyük harf, tire, en az bir rakam
rg.Pattern = "(\d+)-(\d+)"    ' İki ayrı grup yakalar
rg.Pattern = "kalem|silgi"     ' Kalem ya da silgi
rg.Pattern = "\s+"             ' Bir ya da daha fazla boşluk
  • ^ ve $: Metnin başı ve sonu; desenin tüm metne uymasını sağlar.
  • \d, \w, \s: Sırasıyla rakam, harf-rakam-alt çizgi ve boşluk karakterleri. Büyük harfli karşılıkları (\D, \W, \S) tersini ifade eder.
  • Nicelik belirteçleri: * sıfır ya da daha fazla, + bir ya da daha fazla, ? sıfır ya da bir, süslü parantez ise tam sayıyı belirtir.
  • Parantez: Grup oluşturur; Execute ile SubMatches üzerinden ya da Replace içinde $1 ile kullanılır.

1. Ürün kodlarını Test ile doğrulama​

A sütununda ürün kodları var. Kod, iki büyük harf, tire ve üç rakamdan oluşmalıdır. Kodu standart bir modüle yapıştırın; makro her kodu denetleyip B sütununa Geçerli ya da Hatalı yazar.
VBA 23 satır
Option Explicit

Sub KodlariDenetle()
    Dim rg As Object
    Dim ws As Worksheet
    Dim i As Long, son As Long

    ' Düzenli ifade nesnesini oluştur
    Set rg = CreateObject("VBScript.RegExp")
    rg.Pattern = "^[A-Z]{2}-\d{3}$"
    rg.IgnoreCase = False

    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To son
        If rg.Test(CStr(ws.Cells(i, 1).Value)) Then
            ws.Cells(i, 2).Value = "Geçerli"
        Else
            ws.Cells(i, 2).Value = "Hatalı"
        End If
    Next i
End Sub
RegExp
Formülünü incelemek için bir hücre seçin.
AB
1Ürün KoduDurum
2TR-123
3KA-907
4ist-45
5ANK-100
6BU-12A
Kod DenetimiExcelDepo v1.0.0
Bu örnek CreateObject kullandığı için örnek ortamda çalıştırılmaz; kendi bilgisayarınızda deneyin. TR-123 ve KA-907 desene uyduğu için Geçerli, küçük harfli ist-45, üç harfli ANK-100 ve sonunda harf bulunan BU-12A ise Hatalı olarak işaretlenir. Desendeki ^ ve $ işaretleri kodun tamamının desene uymasını zorunlu kılar.

2. Telefon numarasını Replace ile temizleme​

A sütunundaki telefon numaraları boşluk, parantez, tire ve artı işareti içeriyor. Kodu standart bir modüle yapıştırın; makro rakam dışındaki her karakteri silip temiz numarayı B sütununa yazar.
VBA 20 satır
Option Explicit

Sub TelefonTemizle()
    Dim rg As Object
    Dim ws As Worksheet
    Dim i As Long, son As Long

    Set rg = CreateObject("VBScript.RegExp")
    rg.Pattern = "\D"      ' Rakam olmayan her karakter
    rg.Global = True        ' Tüm eşleşmeleri değiştir

    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To son
        ' Başındaki sıfırın kaybolmaması için metin biçimi ver
        ws.Cells(i, 2).NumberFormat = "@"
        ws.Cells(i, 2).Value = rg.Replace(CStr(ws.Cells(i, 1).Value), "")
    Next i
End Sub
RegExp
Formülünü incelemek için bir hücre seçin.
AB
1TelefonTemiz Telefon
20532 123 45 67
3(0212) 555-01-23
4+90 505 111 22 33
50312-444 66 77
Telefon ListesiExcelDepo v1.0.0
Bu örnek de CreateObject kullandığı için örnek ortamda çalıştırılmaz. Makroyu kendi dosyanızda çalıştırdığınızda B sütununda yalnız rakamlar kalır; örneğin artı işaretiyle başlayan numara 90 ile başlayan, boşluksuz bir rakam dizisine dönüşür. Global özelliği True olmasaydı her hücrede yalnız ilk rakam dışı karakter silinirdi.

3. RegExp'e basit alternatif: Like işleci​

Desen çok basitse RegExp yerine VBA'nın Like işleci yeterli olabilir; kitaplık ya da CreateObject gerekmez. Kodu standart bir modüle yapıştırın; makro A sütunundaki kodların iki büyük harf, tire ve üç rakam desenine uyup uymadığını B sütununa yazar.
VBA 14 satır
Option Explicit

Sub LikeKontrol()
    Dim ws As Worksheet
    Dim i As Long, son As Long

    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To son
        ' Like: ? tek karakter, # tek rakam, köşeli parantez karakter aralığı
        ws.Cells(i, 2).Value = (CStr(ws.Cells(i, 1).Value) Like "[A-Z][A-Z]-###")
    Next i
End Sub
RegExp
Formülünü incelemek için bir hücre seçin.
AB
1Ürün KoduSonuç
2TR-123DOĞRU
3ab-123YANLIŞ
4IST-45YANLIŞ
5KA-907DOĞRU
6XY-12AYANLIŞ
Like KıyasExcelDepo v1.0.0
TR-123 için sonuç DOĞRU, küçük harfli ab-123 için YANLIŞ, IST-45 için YANLIŞ, KA-907 için DOĞRU ve XY-12A için YANLIŞ olur. Like işleci varsayılan olarak büyük/küçük harfe duyarlıdır. Ancak nicelik belirteci, grup ve ayıklama desteği olmadığı için bu tür ihtiyaçlarda RegExp nesnesi gerekir.

Kullanırken dikkat edin​

  • Mac sürümünde kullanılamaz: VBScript.RegExp kitaplığı Windows'a özgüdür. Mac için Excel'de CreateObject çağrısı hata verir; bu nedenle dosyanızı Mac kullanıcılarıyla paylaşacaksanız Like işleci ya da Instr gibi alternatifleri düşünün.
  • Pattern boşken Test her zaman True döner: Pattern özelliğine değer atamadan Test ya da Execute çağırırsanız boş desen her metinde eşleşir. Deseni her zaman Global ve IgnoreCase ayarlarıyla birlikte, aramadan önce belirleyin.
  • Global varsayılan olarak False'tur: Tüm eşleşmeleri bulmak ya da değiştirmek istiyorsanız Global özelliğini açıkça True yapın. Yapmazsanız Execute yalnız ilk eşleşmeyi, Replace yalnız ilk değişikliği yapar.
  • Hücre değerini metne çevirin: Hücrede sayı ya da tarih varsa Test ve Replace beklenmedik sonuç verebilir. Hücre değerini CStr ile metne çevirerek göndermek güvenlidir. Telefon gibi başında sıfır bulunan sonuçları yazarken hücreye önce metin biçimi verin.
  • Büyük/küçük harf ve Türkçe karakterler: IgnoreCase True olsa bile i, İ, ı ve I harfleri Türkçe kurallarına göre eşleşmeyebilir. Türkçe karakter içeren aramalarda deseni bu harfleri açıkça içerecek biçimde yazın.
  • İlgili konular:
    • Like işleci: Basit desen karşılaştırması için yerleşik alternatif.
    • CreateObject: Nesneyi geç bağlamayla oluşturur.
    • InStr, Replace, Mid, Left, Right: Düzenli ifade gerektirmeyen metin işlemleri.
    • MatchCollection ve Match: Execute yönteminin döndürdüğü nesneler.
    • Araçlar > Başvurular: Erken bağlama için kitaplık ekleme penceresi.
    • BUL, MBUL, SOLDAN, PARÇAAL, YERİNEKOY: Çalışma sayfasında desen gerektirmeyen metin işlevleri.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
8
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst