RegExp / Farklı Formatlardaki Plakalar için tek fonksiyon

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
823
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Merhaba,

Farklı formatlarda , yani veri girişi olarak formatları farklı plakalar mevcut. Aşağıda görünen 3 KTF bende çalışan ve işime yarayan fonksiyonlar. Bunları tek bir fonksiyon haline getirmem mümkün mü? Yani fonksiyona şunu diyebilir miyim!!! Bu formatın sonucu boş ise şu formatı dene gibi.


Bu standart plaka formatı
Kod:
Function Plaka_1(hcr As Range) As String
    Dim reg As Object, m As Object
  
    Set reg = CreateObject("VBScript.RegExp")
    reg.Pattern = "\b\d{2}\s?[A-Za-z]{1,3}\s?\d{2,4}\b"
    Set m = reg.Execute(hcr.Value)
    If m.Count > 0 Then Plaka_1 = m(0)
End Function
Aşağıdakiler farklılık arzeden plaka formatları için

Örneğin 34 00 55 66666 gibi bir plaka olabiliyor ve aralara boşluk yerine - (tire) işareti ya da . (nokta) kullanılabiliyor.
34 00 55 66666
34-00-55-66666
34.00.55.66666

gibi gibi,



Kod:
Function Plaka_2(hcr As Range) As String
    Dim reg As Object, m As Object
  
    Set reg = CreateObject("VBScript.RegExp")
    'reg.Pattern = "\b\d{2}\S?[A-Za-z0-9]{1,3}\S?\d{2,5}\b"
    reg.Pattern = "\b\d{2}\S?\b\d{2}\S?\b\d{2}\S?\d{2,5}\b"
    Set m = reg.Execute(hcr.Value)
    If m.Count > 0 Then Plaka_2 = m(0)
End Function

Ayrıca bazı plakalar ( iş makinaları plakaları gibi ), içinde harf içerirken, bazıları sayı içeriyor, aşağıdaki örneğin standart olarak tek harf içermekte.

Kod:
Function Plaka_3(hcr As Range) As String
    Dim reg As Object, m As Object
  
    Set reg = CreateObject("VBScript.RegExp")
    reg.Pattern = "\b\d{2} \s?[A-Za-z]{1,1}\s?\d{2,5}\b"
    Set m = reg.Execute(hcr.Value)
    If m.Count > 0 Then Plaka_3 = m(0)
End Function
 
Son düzenleme:

muhasebeciyiz

Altın Üye
Katılım
10 Şubat 2006
Mesajlar
698
Excel Vers. ve Dili
Office 2016
64 Bit
Altın Üyelik Bitiş Tarihi
21-12-2027
Evet, farklı plaka formatlarını tek bir fonksiyon içinde birleştirebilirsiniz. Bu fonksiyon, sırayla farklı formatları deneyerek, ilk eşleşen formatı döndürebilir

Kod:
Function Plaka(hcr As Range) As String
    Dim reg As Object, m As Object
    Dim patterns As Variant
    Dim i As Integer   
    
    patterns = Array( _
        "\b\d{2}\s?[A-Za-z]{1,3}\s?\d{2,4}\b", _  ' Plaka_1 formatı
        "\b\d{2}\S?\d{2}\S?\d{2}\S?\d{2,5}\b", _  ' Plaka_2 formatı
        "\b\d{2} \s?[A-Za-z]{1,1}\s?\d{2,5}\b"    ' Plaka_3 formatı
    )
    
    Set reg = CreateObject("VBScript.RegExp")   
    
    For i = LBound(patterns) To UBound(patterns)
        reg.Pattern = patterns(i)
        Set m = reg.Execute(hcr.Value)
        If m.Count > 0 Then
            Plaka = m(0)
            Exit Function
        End If
    Next i       
    Plaka = ""
End Function
Bu fonksiyonu kullanırken, Plaka fonksiyonunu çağırarak farklı formatlardaki plakaları tek bir fonksiyonla kontrol edebilirsiniz

Kod:
Sub TestPlaka()
    Dim plaka1 As String
    Dim plaka2 As String
    Dim plaka3 As String
    
    plaka1 = Plaka(Range("A1")) 
    plaka2 = Plaka(Range("A2")) 
    plaka3 = Plaka(Range("A3"))
    
    MsgBox "Plaka 1: " & plaka1 & vbCrLf & _
           "Plaka 2: " & plaka2 & vbCrLf & _
           "Plaka 3: " & plaka3
End Sub
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
823
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025

muhasebeciyiz

Altın Üye
Katılım
10 Şubat 2006
Mesajlar
698
Excel Vers. ve Dili
Office 2016
64 Bit
Altın Üyelik Bitiş Tarihi
21-12-2027
Kırmızı renkte görünen hata, muhtemelen sözdizimi (syntax) hatası veya eksik/yanlış karakter kullanımı nedeniyle oluşmuştur.

Kod:
Function Plaka(hcr As Range) As String
    Dim reg As Object, m As Object
    Dim patterns As Variant
    Dim i As Integer  
   
    patterns = Array( _
        "\b\d{2}\s?[A-Za-z]{1,3}\s?\d{2,4}\b", _
        "\b\d{2}\S?\d{2}\S?\d{2}\S?\d{2,5}\b", _
        "\b\d{2} \s?[A-Za-z]{1}\s?\d{2,5}\b"    
    )
   
    Set reg = CreateObject("VBScript.RegExp")  
   
    For i = LBound(patterns) To UBound(patterns)
        reg.Pattern = patterns(i)
        Set m = reg.Execute(hcr.Value)
        If m.Count > 0 Then
            Plaka = m(0)
            Exit Function
        End If
    Next i      
    Plaka = ""
End Function
Denermisiniz.Hala kırmızı renkte hata görüyorsanız, VBA'da debug kullanarak hatanın tam yerini bulabilirsiniz
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
823
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Kırmızı renkte görünen hata, muhtemelen sözdizimi (syntax) hatası veya eksik/yanlış karakter kullanımı nedeniyle oluşmuştur.

Kod:
Function Plaka(hcr As Range) As String
    Dim reg As Object, m As Object
    Dim patterns As Variant
    Dim i As Integer 
  
    patterns = Array( _
        "\b\d{2}\s?[A-Za-z]{1,3}\s?\d{2,4}\b", _
        "\b\d{2}\S?\d{2}\S?\d{2}\S?\d{2,5}\b", _
        "\b\d{2} \s?[A-Za-z]{1}\s?\d{2,5}\b"   
    )
  
    Set reg = CreateObject("VBScript.RegExp") 
  
    For i = LBound(patterns) To UBound(patterns)
        reg.Pattern = patterns(i)
        Set m = reg.Execute(hcr.Value)
        If m.Count > 0 Then
            Plaka = m(0)
            Exit Function
        End If
    Next i     
    Plaka = ""
End Function
Denermisiniz.Hala kırmızı renkte hata görüyorsanız, VBA'da debug kullanarak hatanın tam yerini bulabilirsiniz
şu şekilde yaptığımda problem çözülüyor, bende sonradan farkettim. Alt tire eksikti.
Kod:
        "\b\d{2} \s?[A-Za-z]{1}\s?\d{2,5}\b")
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
823
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Çalışan hali bu şekilde,

Kod:
Function Plaka(hcr As Range) As String
    Dim reg As Object, m As Object
    Dim patterns As Variant
    Dim i As Integer
  
    patterns = Array( _
        "\b\d{2}\s?[A-Za-z]{1,3}\s?\d{2,4}\b", _
        "\b\d{2}\S?\d{2}\S?\d{2}\S?\d{2,5}\b", _
        "\b\d{2} \s?[A-Za-z]{1}\s?\d{2,5}\b" _
        )
  
    Set reg = CreateObject("VBScript.RegExp")
  
    For i = LBound(patterns) To UBound(patterns)
        reg.Pattern = patterns(i)
        Set m = reg.Execute(hcr.Value)
        If m.Count > 0 Then
            Plaka = m(0)
            Exit Function
        End If
    Next i
    Plaka = ""
End Function
 

muhasebeciyiz

Altın Üye
Katılım
10 Şubat 2006
Mesajlar
698
Excel Vers. ve Dili
Office 2016
64 Bit
Altın Üyelik Bitiş Tarihi
21-12-2027
Evet, VBA'da _ (alt çizgi) karakteri, bir satırın devam ettiğini belirtmek için kullanılır. Ancak, bu karakterin doğru kullanıldığından emin olmak önemlidir. _ karakteri, yalnızca satır sonunda ve bir boşlukla ayrılmış şekilde kullanılmalıdır. Aksi takdirde VBA derleyicisi hata verecektir.

Eğer _ karakteri kullanmak istemiyorsanız, tüm pattern'leri tek bir satıra yazabilirsiniz.
patterns = Array("\b\d{2}\s?[A-Za-z]{1,3}\s?\d{2,4}\b", "\b\d{2}\S?\d{2}\S?\d{2}\S?\d{2,5}\b", "\b\d{2} \s?[A-Za-z]{1}\s?\d{2,5}\b")

örnek sonuç şu şekilde olacaktır.

"\b\d{2}\s?[A-Za-z]{1,3}\s?\d{2,4}\b": İlk plaka formatı (örneğin, 34 ABC 123).
"\b\d{2}\S?\d{2}\S?\d{2}\S?\d{2,5}\b": İkinci plaka formatı (örneğin, 34-00-55-66666).
"\b\d{2} \s?[A-Za-z]{1}\s?\d{2,5}\b": Üçüncü plaka formatı (örneğin, 34 A 12345).
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
823
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Teşekkürler cevaplar için.
 
Üst