• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

İşlem Hızlandırma

Katılım
7 Mayıs 2017
Mesajlar
58
Excel Vers. ve Dili
2016 Türkçe
Herkese merhaba,

Forumdaki değerli arkadaşlarımızın yardımı ile stok takibi için bir çalışma sayfası hazırladım. Bu kodlar tam olarak istediğim gibi çalışıyor fakat işlemler biraz uzun sürüyor. İşlem süresini kısaltmak için yapılabilecek birşey var mı acaba? Kodlar ile ilgili açıklamaları kırmızı ile boyadım daha rahat anlaşılabilmesi için.

Kod:
Sub calistir()
    [COLOR="red"]'Çalıştır butonuna bastığım zaman Stok Hareketleri sayfasına yapılan kayıt işlemi uzun sürüyor. Örneğin, tek kalem kayıt yapılacaksa hızlı ama 7-8 kalem kayıt yapılıyorsa yavaşlama yapıyor.[/COLOR] 
    filtretemizle
    deneme
    verifiltretemizle
    veritemizle
End Sub
Sub deneme()
    Dim s1 As Worksheet, s2 As Worksheet
    Dim bul As Range, satir As Long
    Set s1 = Sheets("Veri Girişi")
    Set s2 = Sheets("Stok Hareketleri")
    Application.ScreenUpdating = False
    For Each bul In s1.Range("P2:P" & s1.Range("P65536").End(3).Row)
    If bul.Value <> "" Then
    satir = satir + 1
    bul.EntireRow.Copy
    s2.Select
    sat = Sheets("Stok Hareketleri").Cells(65536, "A").End(xlUp).Row + 1
    Sheets("Stok Hareketleri").Range("A" & sat).PasteSpecial xlPasteValues
    End If
    Next bul
    [a1].Select
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub
Sub veritemizle()
    [COLOR="red"]'Veri Girişi sayfasında her kayıt yapıldıktan sonra sahaları tekrar boşaltıyor ki yeni girişlere yer açılsın. Formüller olduğu için sadece içeriği temizletiyorum.[/COLOR]
    Sheets("Veri Girişi").Select
    Range("F2:P7000").Select
    Selection.SpecialCells(xlCellTypeConstants, 23).Select
    Selection.ClearContents
    Range("A1").Select
End Sub
Sub filtretemizle()
    [COLOR="red"]'Stok Hareketleri sayfasında kullanıcı filtre yaptıktan sonra bu filtreyi bozması gerekiyor kayıtların doğru işlenebilmesi için. Bunu şansa bırakmamak içinde Stok Hareketleri sayfasında filtreyi otomatik temizletiyorum.[/COLOR]
    Sheets("Stok Hareketleri").Select
    If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
    Sheets("Veri Girişi").Select
End Sub
Sub verifiltretemizle()    
    [COLOR="red"]'Veri Girişi sayfasında kullanıcı filtre yaptıktan sonra bu filtreyi bozması gerekiyor kayıtların doğru işlenebilmesi için. Bunu şansa bırakmamak içinde Veri Girişi sayfasında filtreyi otomatik temizletiyorum.[/COLOR]
    Sheets("Veri Girişi").Select
    If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
    Sheets("Veri Girişi").Select
End Sub
Sub goster()
For s = 3 To Sheets.Count [COLOR="Red"]'3. sayfadan başlıyor ve toplamda 55 sayfada işlem yapıyor.[/COLOR]
For Each t In Sheets(s).Range("O2:O175").Cells
If t.Value <> "0" Then 'değeri 0 olmayan hücreleri gösterir
t.EntireRow.Hidden = False
End If
Next t
Next
End Sub

Teşekkür ederim.
 
Konu güncel. Hatta bu stok programını kullanan arkadaş hergün şikayet eder oldu. :)

Yavaşlığın sebebinin Veri Girişi sayfasındaki 7000 satırlık malzeme listesinden kaynaklandığını düşünüyorum. Yukarıdaki kodda açıkladığım üzere bir temizleme işlemi yapılıyor.

Bu konuda yardımcı olabilirseniz çok sevinirim.
 
o select'ler var ya o select'ler. %99'una ihtiyaç yoktur neredeyse....
 
Aynen katılıyorum.

Ayrıca; bence en iyisi; çok fazla olmamak koşuluyla ve
gerçek veri veya gerçeği temsil edebilecek benzer veri içeren
bir örnek belge olursa daha hızlı sonuca ulaşırsınız.

Belgede işlem yapan (özellikle Worksheet_Change/Worksheet_Selection_CHange türünden)
başka makrolar varsa onlarda belge içerisinde olsun derim ben.
.
 
Kod:
Sub calistir()
    filtretemizle
    deneme
    verifiltretemizle
    veritemizle
End Sub

Sub filtretemizle()
    With Worksheets("Stok Hareketleri")
        If .FilterMode = True Then .ShowAllData
    End With
End Sub

Sub deneme()
    With Worksheets("Veri Girişi")
        .Cells(1).AutoFilter Field:=16, Criteria1:="<>"
        .AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Copy
    End With
    Worksheets("Stok Hareketleri").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
End Sub

Sub verifiltretemizle()
    With Worksheets("Veri Girişi")
        If .FilterMode = True Then .ShowAllData
    End With
End Sub

Sub veritemizle()
    Worksheets("Veri Girişi").Range("F2:P7000").SpecialCells(xlCellTypeConstants, 23).ClearContents

End Sub

Sub goster()

    Dim s As Long
    
    For s = 3 To Sheets.Count
        With Worksheets(s)
            .Cells(1).AutoFilter Field:=15, Criteria1:="<>0" 
        End With
    Next s

End Sub
 
hatta tamamı tek kod içinde toplanabilir...

Kod:
Sub calistir()
    'filtretemizle
    'deneme
    'verifiltretemizle
    'veritemizle
    
    Application.ScreenUpdating = False
    
    'Sub filtretemizle()
    With Worksheets("Stok Hareketleri")
        If .FilterMode = True Then .ShowAllData
    End With

    'Sub deneme()
    With Worksheets("Veri Girişi")
        .Cells(1).AutoFilter Field:=16, Criteria1:="<>"
        .AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Copy
    End With
    Worksheets("Stok Hareketleri").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
    
    'Sub verifiltretemizle()
    With Worksheets("Veri Girişi")
        If .FilterMode = True Then .ShowAllData
    End With

    'Sub veritemizle()
    Worksheets("Veri Girişi").Range("F2:P7000").SpecialCells(xlCellTypeConstants, 23).ClearContents

    'Sub goster()
    Dim s As Long
    
    For s = 3 To Sheets.Count '3. sayfadan başlıyor ve toplamda 55 sayfada işlem yapıyor.
        With Worksheets(s)
            .Cells(1).AutoFilter Field:=15, Criteria1:="<>0" 'değeri 0 olmayan hücreleri gösterir
        End With
    Next s

End Sub
 
Aynen katılıyorum.

Ayrıca; bence en iyisi; çok fazla olmamak koşuluyla ve
gerçek veri veya gerçeği temsil edebilecek benzer veri içeren
bir örnek belge olursa daha hızlı sonuca ulaşırsınız.

Belgede işlem yapan (özellikle Worksheet_Change/Worksheet_Selection_CHange türünden)
başka makrolar varsa onlarda belge içerisinde olsun derim ben.
.

çok doğru.

böylece yazılan kodun test edilmesine ve sonradan sorulabilecek bir çok soruya baştan cevap verilmesine imkan sağlar.
 
Her ikinize de çok teşekkür ediyorum. Kodların tamamı bu diye hatırlıyorum. Yarın Sayın mancubus'un paylaştığı kodu deneyeceğim. Bir aksilik olması durumunda Ömer Bey'in söylediği gibi örnek bir dosya ekleyeceğim.

Saygılar.
 
Tekrar merhaba Sayın mancubus,

Evdeki bilgisayarımda dosyanın bir örneği mevcutmuş. Deneme imkanım oldu. En son gönderdiğiniz kod ufak iki sorun dışında çalışıyor.

1. Kodun bu kısmı sanırım değeri 0 olmayan hücreleri gösterirken aynı zamanda büyükten küçüğe sıralama da yapıyor. Bu sıralamayı yapmasını istemiyoruz. Bunu nasıl değiştirebiliriz?

Kod:
.Cells(1).AutoFilter Field:=15, Criteria1:="<>0" 'değeri 0 olmayan hücreleri gösterir

Not: Şimdi tekrar kontrol ettiğimde işyerimde demek ki bu sıralama yapmıyor. Sadece değeri 0 olmayanları filtre ile gizleme işlemi yapıyor. Yani benim gibi önce satırları bir kere gizle ve sonrasında her defa göster bunu ile dolu olanı göster yapmıyor. Böylelikle 1. sorun ortadan kalkmış oldu. :)

2. Veri Girişi sayfasında bir veri giriyorum ve filtre uyguluyorum (girdiğim verinin Stok Hareketleri sayfasına gelip gelmediğini test etmek için). Daha sonra başka bir sahaya veri giriyorum ve Hareketlere İşle butonuna basıyorum. Stok Hareketleri sayfasına sadece daha sonradan girdiğim veri geliyor ve filtre öncesi yaptığım veri gelmiyor.

3. Deneme sonuçları gözlemlerim şöyle. Bu kodları 7000 satırlık Veri Girişi sayfasında ve toplamda 55 sayfalık bir dosyada denediğim zaman yavaşlık diğerine göre daha fazla oldu. Ölçümleme yaptım kabaca. Tek veri girişini 9 saniye civarında yapıyor. Eski kod 5 saniye civarında yapıyor.

Örnek dosyayı da ekledim.
 

Ekli dosyalar

Son düzenleme:
Yavaşlığın sebebini sanırım buldum. :) Şimdi benim diğer 55 sayfada ortalama 170 satırda 3 sütünda formüller çalışıyor. Haliyle ben stok hareketlerine işle dediğim zaman byük ihtimalle bütün formülleri tekrar çalıştırıyor. Bu da basit bir kaydetme işlemini bile geciktiriyor. Olabilir mi ki?
 
Yavaşlığın sebebini sanırım buldum. :) Şimdi benim diğer 55 sayfada ortalama 170 satırda 3 sütünda formüller çalışıyor. Haliyle ben stok hareketlerine işle dediğim zaman byük ihtimalle bütün formülleri tekrar çalıştırıyor. Bu da basit bir kaydetme işlemini bile geciktiriyor. Olabilir mi ki?

Ben bir defasında bir butonda 20 sefer falan kaydet kodu yazmıştım.
İşlem 30 saniye falan sürüyordu. Bu yüzden üşenmeden labelle ProgresBar bile hazırlamıştım. :)
 
bir sebep te formüllerin yeniden hesaplama yapmasıdır.
eğer formüle etki eden hücrelerde bir değişiklik yoksa formüllerin yeniden hesaplanmasına da gerek yoktur. hesaplama yöntemini manüele çevirerek hız kazanmak mümkündür.


Kod:
    Dim calc As Long
    
    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
        calc = .Calculation 'o andaki hesaplama yöntemini calc isimli değişkene atıyor
        .Calculation = xlCalculationManual 'hesaplama yöntemini manüele çeviriyor
    End With

    'kodlar
    'kodlar
    'kodlar
    'kodlar
    'kodlar
    'kodlar
    'kodlar

    With Application
        .EnableEvents = True
        .Calculation = calc 'hesaplama yöntemini calc isimli değişkene atanan yönteöe geri çeviriyor
    End With

Ofis 2007 ve daha üst versiyonlarda kod bittikten sonra aşağıdaki yöntemler otomatik olarak TRUE olur
.ScreenUpdating = False
.DisplayAlerts = False

Ofis 2003 ve daha alt versiyonlarda bunları kod ile TRUE yapmak gerelir. yani yukarıdaki kodun son bölümü aşağıdaki gibi olur.
Kod:
    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .EnableEvents = True
        .Calculation = calc 
    End With
 
Sorun formüllerdeymiş. El ile güncelleme duruma çevirince gayet hızlı bir şekilde çalışıyor. Tabii bu durum başka bir sorunu beraberinde getiriyor. Veri Girişi sayfamızda biz Gelen Miktar ya da Çıkan Miktar girdiğimizde tarihler de otomatik olarak doluyordu. Şimdi formülleri el ile yapınca tabii ki bunlar da olmuyor. Hareketlere İşle butonuna basmadan önce mecburen F9 yapmak gerekiyor.

Bu noktada şunu sormak istiyorum. Veri Girişi sayfasında formülleri otomatik ama geri kalan sayfalarda elle çalıştırma seçeneği var mı?

Sorunlar bitmiyor. :) Formülleri el ile hesapla yapınca, açık olan bütün Excel dosyaları el ile hesapla şeklinde çalışıyor. Bunu sadace belli Excel dosyası için yapma şansımız var mı?

Forumda şöyle bir kod buldum fakat bu kod ile bile o anda açık olan bütün Excel dosyaları etkileniyor ve sürekli bu toggle butonuna basmak gerekiyor. Keşke kolay bir yolu olsaydı. :(

Kod:
Private Sub Worksheet_Activate()
ThisWorkbook.Activate
If ToggleButton1 = False Then
MsgBox "Hesaplamaları Aktif Hale Getimeyi Unutmayınız", vbInformation, "Uyarı..!"
Exit Sub
End If
End Sub
Private Sub ToggleButton1_Click()
If ToggleButton1 = True Then
ToggleButton1.Caption = "Formüller Çalışıyor"
Application.Calculation = xlAutomatic
End If
If ToggleButton1 = False Then
ToggleButton1.Caption = "Formüller Çalışmıyor"
Application.Calculation = xlManual
End If
End Sub

Teşekkür ederim herkese.
 
Son düzenleme:
Geri
Üst