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.
Geç bağlama farklı bilgisayarlarda başvuru sorunu çıkarmaz; erken bağlama ise kod yazarken IntelliSense desteği verir.
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.
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.
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.
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
Ö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.| A | B | |
|---|---|---|
| 1 | Ürün Kodu | Durum |
| 2 | TR-123 | |
| 3 | KA-907 | |
| 4 | ist-45 | |
| 5 | ANK-100 | |
| 6 | BU-12A |
Kod DenetimiExcelDepo v1.0.0
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.| A | B | |
|---|---|---|
| 1 | Telefon | Temiz Telefon |
| 2 | 0532 123 45 67 | |
| 3 | (0212) 555-01-23 | |
| 4 | +90 505 111 22 33 | |
| 5 | 0312-444 66 77 |
Telefon ListesiExcelDepo v1.0.0
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.| A | B | |
|---|---|---|
| 1 | Ürün Kodu | Sonuç |
| 2 | TR-123 | DOĞRU |
| 3 | ab-123 | YANLIŞ |
| 4 | IST-45 | YANLIŞ |
| 5 | KA-907 | DOĞRU |
| 6 | XY-12A | YANLIŞ |
Like KıyasExcelDepo v1.0.0
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.