Plaka harici girilen bilgileri sorgulama

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Çok pardon ben TC olayını atlamışım. Sanırım aşağıdaki şekilde işinizi görebilir.

C++:
=EĞER(YADA(H2="TEST";H2="TRANSFER";VE(ESAYIYSA(SOLDAN(H2;2)*1);UZUNLUK(H2)>=7;UZUNLUK(H2)<=8));"";1)
 
Katılım
11 Nisan 2020
Mesajlar
18
Excel Vers. ve Dili
365
Çok pardon ben TC olayını atlamışım. Sanırım aşağıdaki şekilde işinizi görebilir.

C++:
=EĞER(YADA(H2="TEST";H2="TRANSFER";VE(ESAYIYSA(SOLDAN(H2;2)*1);UZUNLUK(H2)>=7;UZUNLUK(H2)<=8));"";1)
Korhan bey,
Örnek olarak,
99815669 girilen 7 haneli değeri de sorgu plaka olarak kabul etmektedir.
sanırım 7-8 haneli sayısal değerleri plaka olarak algılıyor.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Peki plakalarınız hep aşağıdaki yapıda mı?

ilk iki karakter sayı (İl kodu)
Sonraki 1-3 karaktere kadar harf (min 1 / max 3)
Son karakterler sayı (min 2 / max 4)
 
Katılım
11 Nisan 2020
Mesajlar
18
Excel Vers. ve Dili
365
Peki plakalarınız hep aşağıdaki yapıda mı?

ilk iki karakter sayı (İl kodu)
Sonraki 1-3 karaktere kadar harf (min 1 / max 3)
Son karakterler sayı (min 2 / max 4)
Genel anlamda evet ama tabi canlı bir data olacagından bu satış yapan akaryakıt görevlisi ne girerse diyebilirim. Çok büyük bir data olacak bu 1 sutun bile azaltsam bana yararı olacaktır.
L Sutununda TTS yazanları dikkate almayabiliriz.
hepsine ek olarak da M süununa da =>1000 olanlara da 1 yazılacak
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Veri sayınız çoksa makro kullanmanız daha mantıklı olacaktır.

Alternatif olarak aşağıdaki kodu deneyiniz.

C++:
Option Explicit

Sub Plaka_Kontrol()
    Dim VB_Regex As Object, Veri As Variant, Son As Long
    Dim X As Long, Say As Long, Zaman As Double
    
    Zaman = Timer
    
    Set VB_Regex = CreateObject("Vbscript.Regexp")
        
    VB_Regex.Pattern = "([0-9]{2,3})([A-Z]{1,3})([0-9]{2,4})"
    VB_Regex.Global = True
    
    On Error Resume Next
    ActiveSheet.ListObjects(1).AutoFilter.ShowAllData
    On Error GoTo 0
    
    Son = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    
    Veri = Range("A2:N" & Son).Value2
        
    Range("O2:O" & Son).ClearContents
    
    ReDim Liste(1 To Son, 1 To 1)
    
    For X = LBound(Veri) To UBound(Veri)
        Say = Say + 1
        If Veri(X, 11) = "TTS" Then
            Liste(Say, 1) = 0
        ElseIf UCase(Veri(X, 8)) = "TRANSFER" Or UCase(Veri(X, 8)) = "TEST" Then
            Liste(Say, 1) = Empty
        ElseIf Len(Veri(X, 8)) < 6 Or Len(Veri(X, 8)) > 8 Then
            Liste(Say, 1) = 1
        ElseIf Veri(X, 13) >= 1000 And UCase(Veri(X, 8)) <> "TRANSFER" Then
            Liste(Say, 1) = 1
        Else
            If VB_Regex.Test(Veri(X, 8)) Then
                Liste(Say, 1) = Empty
            Else
                Liste(Say, 1) = 1
            End If
        End If
    Next
    
    If Say > 0 Then Range("O2").Resize(Say) = Liste

    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation
End Sub
 
Katılım
11 Nisan 2020
Mesajlar
18
Excel Vers. ve Dili
365
Veri sayınız çoksa makro kullanmanız daha mantıklı olacaktır.

Alternatif olarak aşağıdaki kodu deneyiniz.

C++:
Option Explicit

Sub Plaka_Kontrol()
    Dim VB_Regex As Object, Veri As Variant, Son As Long
    Dim X As Long, Say As Long, Zaman As Double
   
    Zaman = Timer
   
    Set VB_Regex = CreateObject("Vbscript.Regexp")
       
    VB_Regex.Pattern = "([0-9]{2,3})([A-Z]{1,3})([0-9]{2,4})"
    VB_Regex.Global = True
   
    On Error Resume Next
    ActiveSheet.ListObjects(1).AutoFilter.ShowAllData
    On Error GoTo 0
   
    Son = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
   
    Veri = Range("A2:N" & Son).Value2
       
    Range("O2:O" & Son).ClearContents
   
    ReDim Liste(1 To Son, 1 To 1)
   
    For X = LBound(Veri) To UBound(Veri)
        Say = Say + 1
        If Veri(X, 11) = "TTS" Then
            Liste(Say, 1) = 0
        ElseIf Len(Veri(X, 8)) < 6 Or Len(Veri(X, 8)) > 8 Then
            Liste(Say, 1) = 1
        ElseIf Veri(X, 13) >= 1000 And UCase(Veri(X, 8)) <> "TRANSFER" Then
            Liste(Say, 1) = 1
        Else
            If VB_Regex.Test(Veri(X, 8)) And UCase(Veri(X, 8)) <> "TRANSFER" And UCase(Veri(X, 8)) <> "TEST" Then
                Liste(Say, 1) = Empty
            Else
                Liste(Say, 1) = 1
            End If
        End If
    Next
   
    If Say > 0 Then Range("O2").Resize(Say) = Liste

    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation
End Sub
Korcan Bey ,
Yardımlarınız için çok tesekkur ederım öncelikle.

verdiğiniz kodları excelimde denedıgmde Plaka bölümüne test girilenlere de 1 yazdıgını gördüm. acaba benım makroyu eklememde mi problem var .Normalde !000 Litre altı test olanlarda 1 yazmaması gerekiyordu .
Ayrıca TTs satısalrını sanırım 0 olarak kategorilendirdiniz.
data Dosyası
https://we.tl/t-HnILRs3KMr
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
#27 nolu mesajımda ki kodu revize ettim. Tekrar deneyiniz.

Olması gerekenleri özel mesajla bildirmiştiniz.

olması gerekenler
Tüm sorgudan TTS satış tipi onalanlar muaf olucak direk onlarda 0 yazacak
Plaka Test Ve Transfer Harici satışlarda 1 yazması
Ayrıca
1000 Litre üzeri satışlarda Transfer hariclerinde de 1 yazması gerekmektedir.
 
Katılım
11 Nisan 2020
Mesajlar
18
Excel Vers. ve Dili
365
Yardım Eden arkadaslara çok tesekkur ederim Sorunum giderilmiştir.
 
Üst