Makro revize

Katılım
1 Ağustos 2019
Mesajlar
839
Excel Vers. ve Dili
Türkçe excel 2016
İngilizce excel 2016
Altın Üyelik Bitiş Tarihi
19-10-2021
Kod:
Dim tcno As String

 

Sub dosyakontrol()

With Application

.Calculation = xlManual

.ScreenUpdating = False

.EnableEvents = False

End With

 

sonsatir = Cells(Rows.Count, "A").End(3).Row

For i = 2 To sonsatir

tcno = Cells(i, "A").Value

Cells(i, "B").Value = ""

Cells(i, "C").Value = ""

Cells(i, "D").Value = ""

Cells(i, "E").Value = ""

 

If dosyavarmi("C:\FOTO\*.jpg", tcno) Then Cells(i, "B").Value = "VAR" Else Cells(i, "B").Value = "YOK"

If dosyavarmi("C:\NUFUS\*.pdf", tcno) Then Cells(i, "C").Value = "VAR" Else Cells(i, "C").Value = "YOK"

If dosyavarmi("C:\OGKK_PDF\*.pdf", tcno) Then Cells(i, "D").Value = "VAR" Else Cells(i, "D").Value = "YOK"

If dosyavarmi("C:\SGK YENI\*.pdf", tcno) Then Cells(i, "E").Value = "VAR" Else Cells(i, "E").Value = "YOK"

Next i

 

With Application

.Calculation = xlAutomatic

.ScreenUpdating = True

.EnableEvents = True

End With

 

 

MsgBox "işlem tamam"

End Sub
Bu makroyu Excel sayfamın A sütununa yazdığım yaklaşık 9000 satırlık TC kimlik numarasını baz alarak yine TC kimlik numarası ile isimlendirilmiş dört farklı klasörde tarama yaparak excelde ilgili başlıkların altına ve ilgili TC kimlik numaralarının karşılığına VAR veya YOK yazdırıyor um. Bu işlemi yaklaşık 2.5 dakikada gerçekleştiriyor. Bunu süre olarak kisaltmamiz mümkünmu acaba klsor içindeki veriler 12345678901 MERT KAYA ve 12345678923 formatında. Yardımlarınız için şimdiden teşekkürler
 
Katılım
1 Ağustos 2019
Mesajlar
839
Excel Vers. ve Dili
Türkçe excel 2016
İngilizce excel 2016
Altın Üyelik Bitiş Tarihi
19-10-2021
Makronun devami
Kod:
Function dosyavarmi(yol, tcnostr As String)

dosya = Dir(yol)

Do While dosya <> ""

If InStr(dosya, " ") > 0 Then

isim = Mid(dosya, 1, InStr(dosya, " ") - 1)

ElseIf InStr(dosya, ".") > 0 Then

isim = Mid(dosya, 1, InStr(dosya, ".") - 1)

End If

If isim = tcnostr Then

dosyavarmi = True

Exit Function

End If

dosya = Dir

Loop

dosyavarmi = False

End Function
un devami
 

muzaffer.sm

Altın Üye
Katılım
13 Kasım 2008
Mesajlar
372
Excel Vers. ve Dili
Microsoft Office Professional Plus 2016 TR
Altın Üyelik Bitiş Tarihi
07-12-2024
Buna benzer bir konu

Halit Hocanın yazmış olduğu bir kaç seçenekli kodu var. Sizin konu ile uyuşuyor.


Bu linki inceleyin.
 
Katılım
27 Mayıs 2018
Mesajlar
130
Excel Vers. ve Dili
2016 x64
Altın Üyelik Bitiş Tarihi
29/05/2023
Bu şekilde dener misiniz?

Uyarı : Geliştirici >> Visual Basic >> Tools >> References >>Microsoft Scripting Runtime özelliğinin açık olması gerekir. Aksi takdirde kod çalışmayacaktır.

Kod:
Sub deneme()
Dim FSO As FileSystemObject: Set FSO = New FileSystemObject
Dim str As Long
Dim c, rng As Range
Dim xstart, xfinish As Date

xstart = Time

str = Cells(Rows.Count, 1).End(3).Row
Range("b2:e" & str).ClearContents

Set rng = Range("a2:a" & str)
For Each c In rng
    
    If FSO.FileExists("C:\FOTO\" & c.Value & ".jpg") Then
        c.Offset(, 1) = "Var"
    Else: c.Offset(, 1) = "yok"
    End If
    
    If FSO.FileExists("C:\NUFUS\" & c.Value & ".pdf") Then
        c.Offset(, 2) = "Var"
    Else: c.Offset(, 2) = "yok"
    End If
    
    If FSO.FileExists("C:\OGKK_PDF\" & c.Value & ".pdf") Then
        c.Offset(, 3) = "Var"
    Else: c.Offset(, 3) = "yok"
    End If
    
    If FSO.FileExists("C:\SGK YENI\" & c.Value & ".pdf") Then
        c.Offset(, 4) = "Var"
    Else: c.Offset(, 4) = "yok"
    End If
Next

xfinish = Time - xstart
MsgBox xfinish, vbInformation

End Sub
 
Katılım
1 Ağustos 2019
Mesajlar
839
Excel Vers. ve Dili
Türkçe excel 2016
İngilizce excel 2016
Altın Üyelik Bitiş Tarihi
19-10-2021
Bu şekilde dener misiniz?

Uyarı : Geliştirici >> Visual Basic >> Tools >> References >>Microsoft Scripting Runtime özelliğinin açık olması gerekir. Aksi takdirde kod çalışmayacaktır.

Kod:
Sub deneme()
Dim FSO As FileSystemObject: Set FSO = New FileSystemObject
Dim str As Long
Dim c, rng As Range
Dim xstart, xfinish As Date

xstart = Time

str = Cells(Rows.Count, 1).End(3).Row
Range("b2:e" & str).ClearContents

Set rng = Range("a2:a" & str)
For Each c In rng
   
    If FSO.FileExists("C:\FOTO\" & c.Value & ".jpg") Then
        c.Offset(, 1) = "Var"
    Else: c.Offset(, 1) = "yok"
    End If
   
    If FSO.FileExists("C:\NUFUS\" & c.Value & ".pdf") Then
        c.Offset(, 2) = "Var"
    Else: c.Offset(, 2) = "yok"
    End If
   
    If FSO.FileExists("C:\OGKK_PDF\" & c.Value & ".pdf") Then
        c.Offset(, 3) = "Var"
    Else: c.Offset(, 3) = "yok"
    End If
   
    If FSO.FileExists("C:\SGK YENI\" & c.Value & ".pdf") Then
        c.Offset(, 4) = "Var"
    Else: c.Offset(, 4) = "yok"
    End If
Next

xfinish = Time - xstart
MsgBox xfinish, vbInformation

End Sub
Sayın genesis süper 30 saniyede bitirdi çok teşekkür ederim
 
Katılım
1 Ağustos 2019
Mesajlar
839
Excel Vers. ve Dili
Türkçe excel 2016
İngilizce excel 2016
Altın Üyelik Bitiş Tarihi
19-10-2021
Bu şekilde dener misiniz?

Uyarı : Geliştirici >> Visual Basic >> Tools >> References >>Microsoft Scripting Runtime özelliğinin açık olması gerekir. Aksi takdirde kod çalışmayacaktır.

Kod:
Sub deneme()
Dim FSO As FileSystemObject: Set FSO = New FileSystemObject
Dim str As Long
Dim c, rng As Range
Dim xstart, xfinish As Date

xstart = Time

str = Cells(Rows.Count, 1).End(3).Row
Range("b2:e" & str).ClearContents

Set rng = Range("a2:a" & str)
For Each c In rng
   
    If FSO.FileExists("C:\FOTO\" & c.Value & ".jpg") Then
        c.Offset(, 1) = "Var"
    Else: c.Offset(, 1) = "yok"
    End If
   
    If FSO.FileExists("C:\NUFUS\" & c.Value & ".pdf") Then
        c.Offset(, 2) = "Var"
    Else: c.Offset(, 2) = "yok"
    End If
   
    If FSO.FileExists("C:\OGKK_PDF\" & c.Value & ".pdf") Then
        c.Offset(, 3) = "Var"
    Else: c.Offset(, 3) = "yok"
    End If
   
    If FSO.FileExists("C:\SGK YENI\" & c.Value & ".pdf") Then
        c.Offset(, 4) = "Var"
    Else: c.Offset(, 4) = "yok"
    End If
Next

xfinish = Time - xstart
MsgBox xfinish, vbInformation

End Sub
Sayın genesis sadece TC kimlik numaraları olan formattakileri buluyor ancak 12345678911 MEHMET UZUN.pdf ve benzer olan jpg uzantılı verileri görmüyor
 
Katılım
1 Ağustos 2019
Mesajlar
839
Excel Vers. ve Dili
Türkçe excel 2016
İngilizce excel 2016
Altın Üyelik Bitiş Tarihi
19-10-2021
Sayın genesis sadece TC kimlik numaraları olan formattakileri buluyor ancak 12345678911 MEHMET UZUN.pdf ve benzer olan jpg uzantılı verileri görmüyor
Yani klasör içindeki TC kimlik numarasının yanında isim soy isim yazılı verileride görürse süper olacak
 
Katılım
27 Mayıs 2018
Mesajlar
130
Excel Vers. ve Dili
2016 x64
Altın Üyelik Bitiş Tarihi
29/05/2023
".jpg" yerine " *.jpg", ".pdf" yerine " *.pdf" yazarak deneyebilir misiniz?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,157
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Alternatif;

Deneyiniz. Süre olarak avantaj sağlayabilir.

İÇERİR mantığı ile arama yapar.

C++:
Option Explicit

Sub TC_Kimlik_No_Kontrol()
    Dim Veri As Variant, Klasor As Variant, Uzanti As Variant, X As Long
    Dim Y As Byte, Son As Long, Dosya As String, Zaman As Double
  
    Zaman = Timer
  
    Application.ScreenUpdating = False
  
    Klasor = Array("C:\FOTO\", "C:\NUFUS\", "C:\OGKK_PDF\", "C:\SGK YENI\")
    Uzanti = Array(".jpg", ".pdf", ".pdf", ".pdf")
  
    Son = Cells(Rows.Count, 1).End(3).Row
    Veri = Range("A2:E" & Son).Value2
    Range("B2:E" & Rows.Count).ClearContents
  
    For X = LBound(Veri) To UBound(Veri)
        If Veri(X, 1) <> "" Then
            For Y = LBound(Klasor) To UBound(Klasor)
                Dosya = Dir(Klasor(Y) & "*" & Veri(X, 1) & "*" & Uzanti(Y))
                If Dosya <> "" Then
                    Veri(X, Y + 2) = "Var"
                Else
                    Veri(X, Y + 2) = "Yok"
                End If
            Next
        End If
    Next

    Range("A2").Resize(UBound(Veri, 1), UBound(Veri, 2)) = Veri

    Application.ScreenUpdating = True

    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye"
End Sub
 
Katılım
1 Ağustos 2019
Mesajlar
839
Excel Vers. ve Dili
Türkçe excel 2016
İngilizce excel 2016
Altın Üyelik Bitiş Tarihi
19-10-2021
Alternatif;

Deneyiniz. Süre olarak avantaj sağlayabilir.

C++:
Option Explicit

Sub TC_Kimlik_No_Kontrol()
    Dim Veri As Variant, Klasor As Variant, Uzanti As Variant, X As Long, Y As Byte, Son As Long, Dosya As String, Zaman As Double
   
    Zaman = Timer
   
    Application.ScreenUpdating = False
   
    Klasor = Array("C:\FOTO\", "C:\NUFUS\", "C:\OGKK_PDF\", "C:\SGK YENI\")
    Uzanti = Array(".jpg", ".pdf", ".pdf", ".pdf")
   
    Son = Cells(Rows.Count, 1).End(3).Row
    Veri = Range("A2:E" & Son).Value2
    Range("B2:E" & Rows.Count).ClearContents
   
    For X = LBound(Veri) To UBound(Veri)
        If Veri(X, 1) <> "" Then
            For Y = LBound(Klasor) To UBound(Klasor)
                Dosya = Dir(Klasor(Y) & "*" & Veri(X, 1) & "*" & Uzanti(Y))
                If Dosya <> "" Then
                    Veri(X, Y + 2) = "Var"
                Else
                    Veri(X, Y + 2) = "Yok"
                End If
            Next
        End If
    Next

    Range("A2").Resize(UBound(Veri, 1), UBound(Veri, 2)) = Veri

    Application.ScreenUpdating = True

    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye"
End Sub
Korhan hocan yukarıda belirttiğim veri olarak her iki formattada sağlıklı çalıştı. 75 sn işlemi bitirdi. Paylaştığım makroya göre yarı zamanda yaptı. Teşekkür ederim
 
Katılım
27 Mayıs 2018
Mesajlar
130
Excel Vers. ve Dili
2016 x64
Altın Üyelik Bitiş Tarihi
29/05/2023
Deneyiniz.

Kod:
Sub deneme()
Dim str As Long
Dim c, rng As Range
Dim xstart, xfinish As Date

xstart = Time

str = Cells(Rows.Count, 1).End(3).Row
Range("b2:e" & str).ClearContents

Set rng = Range("a2:a" & str)

For Each c In rng
    If Dir("C:\FOTO\" & c.Value & "*.jpg") <> vbNullString Then
            c.Offset(, 1) = "Var"
    Else: c.Offset(, 1) = "Yok"
    End If

    If Dir("C:\NUFUS\" & c.Value & "*.pdf") <> vbNullString Then
        c.Offset(, 2) = "Var"
    Else: c.Offset(, 2) = "Yok"
    End If
 
    If Dir("C:\OGKK_PDF\" & c.Value & "*.pdf") <> vbNullString Then
        c.Offset(, 3) = "Var"
    Else: c.Offset(, 3) = "Yok"
    End If
 
    If Dir("C:\SGK YENI\" & c.Value & "*.pdf") <> vbNullString Then
        c.Offset(, 4) = "Var"
    Else: c.Offset(, 4) = "Yok"
    End If
Next

xfinish = Time - xstart
MsgBox xfinish, vbInformation

End Sub
 
Son düzenleme:

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,157
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
İlginç, ben 20.000 satırda denedim. Yaklaşık 5 saniyede bitirdi. Sanırım klasör içlerinde az dosya olduğundan bu sonucu aldım.
 
Katılım
1 Ağustos 2019
Mesajlar
839
Excel Vers. ve Dili
Türkçe excel 2016
İngilizce excel 2016
Altın Üyelik Bitiş Tarihi
19-10-2021
Deneyiniz.

Kod:
Sub deneme()
Dim str As Long
Dim c, rng As Range
Dim xstart, xfinish As Date

xstart = Time

str = Cells(Rows.Count, 1).End(3).Row
Range("b2:e" & str).ClearContents

Set rng = Range("a2:a" & str)

For Each c In rng
    If Dir("C:\FOTO\" & c.Value & "*.jpg") <> vbNullString Then
            c.Offset(, 1) = "Var"
    Else: c.Offset(, 1) = "Yok"
    End If

    If Dir("C:\NUFUS\" & c.Value & "*.pdf") <> vbNullString Then
        c.Offset(, 2) = "Var"
    Else: c.Offset(, 2) = "Yok"
    End If

    If Dir("C:\OGKK_PDF\" & c.Value & "*.pdf") <> vbNullString Then
        c.Offset(, 3) = "Var"
    Else: c.Offset(, 3) = "Yok"
    End If

    If Dir("C:\SGK YENI\" & c.Value & "*.pdf") <> vbNullString Then
        c.Offset(, 4) = "Var"
    Else: c.Offset(, 4) = "Yok"
    End If
Next

xfinish = Time - xstart
MsgBox xfinish, vbInformation

End Sub
Sayın genesis şimdi oldu 37 sn de işlemi bitirdi teşekkür ederim çok sağolun
 

tahsinanarat

Altın Üye
Katılım
14 Mart 2005
Mesajlar
2,164
Excel Vers. ve Dili
Ofis 2019 Türkçe
Altın Üyelik Bitiş Tarihi
27-05-2028
Sn. @genesis_vision 12 nolu mesajınızdaki kod güzel çalışıyor,bende 4Bin satırlık veriyi 4 sn. de bitiriyor. Elinize sağlık, Bu kodda var yazan yerlere dosya adını yazdırıp, link atamak istersek kodda nasıl bir değişikliği gidilebilir. Teşekkürler.
 
Son düzenleme:
Katılım
27 Mayıs 2018
Mesajlar
130
Excel Vers. ve Dili
2016 x64
Altın Üyelik Bitiş Tarihi
29/05/2023
Sn. @genesis_vision 12 nolu mesajınızdaki kod güzel çalışıyor,bende 4Bin satırlık veriyi 4 sn. de bitiriyor. Elinize sağlık, Bu kodda var yazan yerlere dosya adını yazdırıp, link atamak istersek kodda nasıl bir değişikliği gidilebilir. Teşekkürler.
Sayın @tahsinanarat fikir vermesi açısından aşağıdaki kodları deneyebilirsiniz. Umarım işinize yarar.
Kod:
Sub bagEkle()
Dim FD As FileDialog
Dim str As Long
Dim c, rng As Range
Dim xstart, xfinish As Date
Dim xPath As String


Set FD = Application.FileDialog(msoFileDialogFolderPicker)
    If FD.Show = -1 Then
        xPath = FD.SelectedItems(1)
    End If
    
Set FD = Nothing
If xPath = "" Then Exit Sub

xstart = Time

str = Cells(Rows.Count, 1).End(3).Row
Range("b2:e" & str).ClearContents

Set rng = Range("a2:a" & str)

For Each c In rng
    If Dir(xPath & "\" & c.Value & "*.jpg") <> vbNullString Then
         ActiveSheet.Hyperlinks.Add Anchor:=c.Offset(, 1), _
         Address:=xPath & "\" & c.Value & ".jpg", _
         TextToDisplay:=c.Text
    Else: c.Offset(, 1) = "Bulunamadı"
    End If
  
Next

xfinish = Time - xstart
MsgBox xfinish, vbInformation

End Sub
 

tahsinanarat

Altın Üye
Katılım
14 Mart 2005
Mesajlar
2,164
Excel Vers. ve Dili
Ofis 2019 Türkçe
Altın Üyelik Bitiş Tarihi
27-05-2028
Sn. @@genesis_vision gösterdiğiniz alaka için çok teşekkürler, bu başka bir projede kullanılabilir, bu kodda da yine bire bir eşleşme istiyor yani saadece tc kimlik numarası eşleyenleri getiriyor, 11991278023 TAHSİN ANARAT (ssg) gibi bir datayı olduğu gibi getirip link atamasını istemiştim, hatta 12.mesajınızda link atayarak dataları getirebilirse mükemmel olurdu. Teşekkürler
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,157
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Aşağıdaki kodu deneyiniz.

Daha iyi performans veriyor.

İLE BAŞLAR mantığı ile arama yapar.

Bir önceki önerim İÇERİR mantığı ile arama yaptığı için daha yavaş çalışıyordu. Aşağıdaki kod bende oldukça hızlı sonuç verdi. Yaklaşık 7 saniye sürdü.

TEST VERİSİ;
25.000 satır
4 Klasör + 25.000 Dosya

C++:
Option Explicit

Sub TC_Kimlik_No_Kontrol()
    Dim Veri As Variant, Klasor As Variant, Uzanti As Variant, X As Long
    Dim Y As Byte, Son As Long, Dosya As String, Zaman As Double
   
    Zaman = Timer
   
    Application.ScreenUpdating = False
   
    Klasor = Array("C:\FOTO\", "C:\NUFUS\", "C:\OGKK_PDF\", "C:\SGK YENI\")
    Uzanti = Array(".jpg", ".pdf", ".pdf", ".pdf")
   
    Son = Cells(Rows.Count, 1).End(3).Row
    Veri = Range("A2:E" & Son).Value2
    Range("B2:E" & Rows.Count).ClearContents
   
    For X = LBound(Veri) To UBound(Veri)
        If Veri(X, 1) <> "" Then
            For Y = LBound(Klasor) To UBound(Klasor)
                Dosya = Dir(Klasor(Y) & Veri(X, 1) & "*" & Uzanti(Y))
                If Dosya <> "" Then
                    Veri(X, Y + 2) = "Var"
                Else
                    Veri(X, Y + 2) = "Yok"
                End If
            Next
        End If
    Next

    Range("A2").Resize(UBound(Veri, 1), UBound(Veri, 2)) = Veri

    Application.ScreenUpdating = True

    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye"
End Sub
 
Üst