• DİKKAT

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

Sayfadaki Kodlarda Yavaşlama sorunu

Katılım
5 Ocak 2009
Mesajlar
1,586
Excel Vers. ve Dili
2003 Türkçe
Selam,
20-25 sayfadan oluşan bir excel dosyamda bir sayfadaki "Sorgula" butonuna tıkladığımda görüntüleme bitmesine rağmen işlem çok geç sonlanıyor.
Bir kaç sayfayı silince çok hızlanıyor.
Fakat silinen bu sayfaların kodların olduğu sayfadaki ne fonksiyonlar ile ne de Kodlar ile bir bağ yok
Bunun sebebi nedir? Bu problemi nasıl giderebilirim? Sayfadaki kodlar aşağıdaki gibidir.

Yardımcı olabilirseniz çok sevinirim.
İyi çalışmalar.
Kod:
Private Sub CommandButton2_Click()
If operator.Value = "" And insort.Value = "" And format.Value = "" And ebat.Value = "" And sayfa.Value = "" _
And yaprak.Value = "" And gsm.Value = "" Then

If (MsgBox(" Hiçbir Kriter Seçmediniz! Tüm İnsörtler Görüntülecektir." & vbCrLf & _
Chr(13) & "Devam Etmek İstiyormusunuz ?", vbYesNo + vbInformation, "Sayın  " & Environ("username"))) <> vbYes Then Exit Sub
End If
lutfen.Show False:    DoEvents

Range("A2") = operator.Value
Range("B2") = insort.Value
Range("C2") = format.Value
Range("D2") = ebat.Value
Range("E2") = sayfa.Value
Range("F2") = yaprak.Value
Range("G2") = gsm.Value

PageSetup.PrintArea = "$A$1:$O$" & [H1] + 7
Unload lutfen
MsgBox "Sorgu Tamanlandı." & vbCrLf & [H1] & " Adet Sonuç Bulundu.", vbInformation, "Sayın  " & Environ("username")

End Sub
 
Son düzenleme:
Selamlar,

Birde aşağıdaki kodları kendi kodlarınıza ekleyerek deneyin.

Kodlarınızın başına; (DoEvents ten sonra olabilir)
Kod:
Application.Calculation = xlCalculationManual

Kodlarınızın sonuna; (MsgBox tan önce olabilir)
Kod:
Application.Calculation = xlCalculationAutomatic
 
Selam Sayın Korhan Ayhan,
Süper.. Harikasınız. Ne kadar teşekkür etsem azdır. Gerçekten çok minnettarım.
süper hızlı çalışıyor, biraz zaman alıyor o da olması gereken kadar. Sebebi de sayfadaki fonksiyonlar. Bunun haricindeki yavaşlama sorunu kalmadı.
kodları aşağıdaki gibi uyguladım;
Kod:
[COLOR="red"]Application.Calculation = xlCalculationManual 'hızlandırmak için[/COLOR]
Range("A2") = operator.Value
Range("B2") = insort.Value
Range("C2") = format.Value
Range("D2") = ebat.Value
Range("E2") = sayfa.Value
Range("F2") = yaprak.Value
Range("G2") = gsm.Value
[COLOR="Red"]Application.Calculation = xlCalculationAutomatic[/COLOR]

verdiğiniz kırmızı renkli kodları ve nasıl çalıştığını izah edebilir misiniz?
Zaten yukarıdaki aralıkları el ile girdiğimde (yani commandbutton2'ye basmadan), hızlandığını görmüştüm.
Yavaş çalışmasının sebebi sanki operator, insort v.s. adlı textbox'ladan Hücrelere veri aktarırken oluyor gibi Doğru mudur? doğru ise biraz açıklayabilir misiniz?

Verdiğiniz kodları başka benzeri makrolarda kullanabilir miyiz?
 
Selamlar,

Size önerdiğim kod ARAÇLAR-SEÇENEKLER-HESAPLAMA-EL İLE yönteminin makro karşılığıdır.

Sizin yaşadığınız sıkıntıyı çok fazla sayfada ve formüllerle çalışan tüm excel kullanıcıları yaşamaktadır. Bende sürekli maliyet raporları hazırladığım için yoğun formüller kullanıyorum. Veri sayısıda fazla olunca excelde donmalar yaşıyorum. İşte excel bize burada bu yöntemle yardımcı oluyor. Tablolarımıza tüm verilerimizi girdikten sonra F9 yada kaydet dediğimizde tüm hesaplamalar yapılmaktadır. Bu da zaman kaybını en aza indirgemektedir.

Yavaşlamanın sebebi;

Siz kodlarla hücrelere veri kayıdı yapıyorsunuz. Excel her hücre değişiminde hesaplama moduna geçtiği için dosyanızdaki tüm formüller yeniden hesaplanmaktadır. Bu da yavaşlamanın temel kaynağıdır.

Evet bu kodu buna benzer sorun yaşadığınız dosyalarda kullanabilirsiniz. Yalnız kod içinde manuele alınan yöntemi tekrar otomatik hale getirmeyi unutursanız makro ile yaptığınız hesaplamalar hatalı olabilir. Dikkatli ve kontrollü kullanmanızı tavsiye ederim.
 
Selam,
Sayın Korhan Ayhan,
Açıklamalarınız için çok teşekkür ederim.
Birincisi,
Tablolarımıza tüm verilerimizi girdikten sonra F9 yada kaydet dediğimizde tüm hesaplamalar yapılmaktadır. Bu da zaman kaybını en aza indirgemektedir.
kastetiğinizden pek anlamadım mümkünse biraz izah edebilir misiniz?
İkincisi,
Bahsettiğiniz işlemler "fonksiyonlar" için de geçerli mi? geçerli ise ne yapmamız lazım?
Üçüncüsü,
Makro kodları niye kendisi en hızlısını yapmıyor da, sizin vediğiniz kodlara ihtiyaç duyuyor.
Dördüncüsü,
verdiğiniz kodlar gibi başka hızlandırmaya (veya kolaylaştırmaya) yönelik başka kodlar var mıdır? var ise paylaşabilir misiniz?
Şimdiden çok teşekkür ederim.
İyi çalışmalar
 
Selamlar,

Birinci sorunuz;

Çok fazla formül içeren excel dosylarında bu yöntemi kullanmak tercih edilmelidir.

Eğer bu yöntemi kullanmazsak ne olur;

Her hücreye veri girişinizde excel formül hesaplamalarını yeniden yapacağı için yavaşlama yaşarsınız. Bu sebeple çok fazla formül içeren dosyanızı açın. Bir önceki mesajımda tarif ettiğim menüden hesaplama yöntemini "ELLE" olacak şekilde ayarlayın. Artık dosyanıza veri girdiğinizde formül sonuçları hemen değişmeyecektir. F9 tuşuna bastığınızda yada dosyanızı kaydettiğinizde tüm hesaplamalar yapılacaktır. Örnek dosyadan test edebilirsiniz. A ve B sütunlarına ver girdiğinizde C sütunundaki formül çalışamayacaktır. F9 tuşuna basarak sonucu görebilirsiniz.


İkinci sorunuz;

Evet fonksiyonlar için geçerlidir. Bir önceki mesajımdaki menüden ayarlama yapacaksınız.


Üçüncü sorunuz;

Çünkü makroları kullanıcı yazıyor. Siz kod içinde bir komutla exceli yönlendirmediğiniz sürece excel işlemleri varsayılan yöntemlerle tamamlamaya çalışır.

Örneklersek;

Hesaplama yönteminiz otomatik olarak ayarlı ve dosyanız aşırı derecede hesaplamaları yavaş yapıyor.
Siz bu dosyada formüllerin başvuru alanındaki hücrelere veri kaydı yapmak istiyorsunuz. Hesaplama yönetmi otomatik olduğu için hücrelere kayıt işledikçe formüller yeniden hesaplanacaktır. Bu da yavaşlamanın devam edeceği anlamına gelir.

İşte burada kullanıcı devreye girerek bir komut göndererek kodları bir nebze olsun hızlandırabilir.


Dördüncü sorunuz;

Kodlarınızın hızlı çalışması için temel olarak aşağıdaki yöntemler kullanılır;

Kod içinde kullanılacak değişkenleri kod başlangıcında DIM komutu ile tanımlamak.

Application.ScreenUpdating = False (Ekran hareketlerini pasif hale getirir. Kod çalışırken ekranda gerçekleşen işlem hareketleri görünmez.)

Application.ScreenUpdating = True (Ekran hareketlerini aktif hale getirir.)

Application.Calculation = xlCalculationManual (Hesaplama yöntemini "ELLE" olarak ayarlar.)

Application.Calculation = xlCalculationAutomatic (Hesaplama yöntemini "OTOMATİK" olarak ayarlar.)


Bunların dışında;

Kodlarda gereksiz sorgulardan uzak durmak.
SELECT komutundan uzak durmak. (Mecbur kalınmadığı sürece kullanmamak.)
Eğer excelin yerleşik özelliklerini kullanarak makro işlemi yapılabiliyorsa bunları kullanmak. (Mesela makro ile benzersiz kayıtları listelemek için döngü yerine GELİŞMİŞ FİLTRE yöntemini kullanmak. Ya da sütundaki belli bir değeri saydırmak için döngü yerine kod editöründe kullanabildiğimiz WORKSHEETFUNCTION yöntemi ile excelin yerleşik fonksiyonlarını kullanmak.)

Excel versiyonları yükseldikçe önceki versiyonlarda kullanıcıların makrolarla yaptığı birçok işlemler yerleşik özellikler haline getirilmektedir. Mesela RENGE GÖRE FİLTRELEME - BENZERSİZ KAYITLARI AYIKLAMA menüleri 2007 versiyonda kullanıcılara sunulmuştur.

Umarım açıklamaların size faydası olur.
 

Ekli dosyalar

Sayın Korhan Ayhan,
Ne kadar güzel izah ediyorsunuz. İzahlarınızı anlamak bir yana aynı zamanda büyük bir zevkle okuyorum.
Çok teşekkürler
Umarım açıklamaların size faydası olur.
Diyorsunuz. bize faydası olmuyorsa bilin ki kabahat bizimdir.
Elbette bana ve konuyu takip eden herkese faydası olmuştur ve olacaktır.

bir iki soru daha sorabilir miyim? mümkün müdür?
Application.Calculation = xlCalculationManual (Hesaplama yöntemini "ELLE" olarak ayarlar.)

Application.Calculation = xlCalculationAutomatic (Hesaplama yöntemini "OTOMATİK" olarak ayarlar.)
kodları sizin vediğiniz gibi yani yukarıdaki gibi kullanıyorum.
Ancak, sizin izahlarınızdan yola çıkarak, makro olarak kaydedeyim dedim. Aşağıdaki gibi çıktı.

Application.Calculation = xlManual
Application.Calculation = xlAutomatic
arasında bir fark var mıdır?

ikincisi;
Application.ScreenUpdating = False (Ekran hareketlerini pasif hale getirir. Kod çalışırken ekranda gerçekleşen işlem hareketleri görünmez.)

Application.ScreenUpdating = True (Ekran hareketlerini aktif hale getirir.)
kısmını pek anlayamadım. Mazur görünüz. Fonksiyonu, mantığı nedir? nasıl, ve nerede kullanabiliriz? Bir de "True" ve "False" sırası aynen verdiğiniz gibi midir?

İyi çalışmalar.
 
Selamlar,

Birinci sorunuz;

İki kod arasında yazımın dışında bir fark yoktur.

Kod:
Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic

Kod:
Application.Calculation = xlManual
Application.Calculation = xlAutomatic


İkinci sorunuz;

Application.ScreenUpdating komutu kod içinde sürekli seçimler (Hücre seçme, Aralık seçme, Sayfa seçme, Kitap seçme gibi) kullanılan zamanlarda etkilidir. Bu seçme işlemlerini mümkün olduğunca ekrana yansıtmaz yani kullanıcı o an ekranda olup biteni görmez. Bu komutun etkisini ekteki dosyadaki iki butona tıklayarak test edebilirsiniz.
 

Ekli dosyalar

Sayın Korhan Ayhan,
Yardımlarınız ve açıklamalarınız için çok teşekkür ederim.
İyi çalışmalar.
 
Korhan hocam eline dilene sağlık.

Selametle kalasın.
 
Geri
Üst