".ScreenUpdating = False" makroyu hızlandırma

Katılım
6 Mayıs 2014
Mesajlar
264
Excel Vers. ve Dili
office 365
Altın Üyelik Bitiş Tarihi
23-06-2021
Kod:
Sub with_baş()

With Application
.ScreenUpdating = False
.Calculation = xlManual
End With
         
End Sub
Kod:
Sub with_son()

With Application
.CutCopyMode = False
.ScreenUpdating = True
.Calculation = xlAutomatic
End With
     
End Sub
Yeni bir şey öğrendim. (Moderatör Ömer Bey'in gönderdiği bir kodun içinde farkettim. Kendisine teşekkür ediyorum). Birinci kodu makrolarımın başına Run("with_baş") şeklinde, ikinci kodu ise makrolarımın sonuna Run("with_son") şeklinde yerleştirip makroları hızlandırmaya çalışıyorum. Anladığım kadarı ile ekran görüntüsünün gidip gelmesini engellediği için içinde döngü olan makrolarda ya da sayfalar arası gidip gelen makrolarda makronun yavaşlamasını engelliyor.

Bu konuda birkaç şeyi merak ettim.

1- Her makronun başında ve sonunda kodları çalıştırmamın herhangi bir sakıncası var mı?

2- Yukarıdakilerden sadece birinci makroyu kullansam, ikincisini kullanmasam sıkıntı olur mu? Çünkü bazen makro bittikten sonra bile otomatik hesaplamaya geçmesini istemiyorum.

3- Kullandığım makrolarda, makronun ne zaman manuel / otomatik hesaplamaya geçeceğini zaten ayarlıyorum. (yavaşlamayı engellemek için) Bu yüzden yukarıdaki ilk makronun ".Calculation = xlManual" kısmını çıkarsam olur mu?

4- Yukarıdaki kodlara eklenebilecek, makroların hızlanmasını sağlayacak genel ve zorunlu başka bir kod öneriniz var mı? ( Application.DisplayAlerts özelliği, Application.EnableEvents özelliği gibi bazı şeyler okudum ama bunları zaten kullanmıyorum. Ekelenebilecek kod ile kastettiğim, zorunlu ya da her duruma uyabilecek, işe yarar ve sıkıntı çıkarmayak bir kod. yazı ile ilgili söz konusu link : https://excelinefendisi.com/konular/VBAMakro/DortTemelNesne_Application.aspx )
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Öncelikle bu odları ayrı makrolar halinde kullanmanız şart değil. Her makronun içine kod olarak da ekleyebilirsiniz:

sub deneme()
application.screenupdating = false
application.calculation = xlmanual
kodlar
.
.
.
application.screenupdating = true
application.calculation = xlautomatic
end sub

gibi.
Kodları çalıştırmanın normalde bir sakıncası yok. Ancak diyelim ki makroda başka bir hücrede yer alan formülün sonucuna göre işlem yapılıyorsa ve hesaplama manuel ise hatalı sonuç verir. Örneğin:

A1'de =B1*C1 formülü varsa

Makroda da B1 ya da C1 hücresine herhangi bir şekilde değer giriliyorsa ve sonuçta A1'deki değere göre başka bir işlem yapılıyorsa hesaplama otomatik olmadığında B1 değiştiğinde A1 değişmez, beklenen sonuç gerçekleşmez.

Bu nedenle bunu her zaman değil gerektiğinde kullanmalısınız.

Screenupdating olayı sadece ekran görüntüsüyle ilgilidir, işlem tamamlandığında açılırsa bir sorun çıkmaz. Ancak bunu açmayı unutursanız ya da açmazsanız başka bir dosyada da etkisini gösterir, "bu sayfa neden yenilenmiyor?" diye şaşırmanıza neden olur. Bu durumda açmak için başka bir makro çalıştırmanız gerekir.

Bu durum hesaplama için de geçerlidir. Manuele aldığınızda başka dosyalarda da çalışmaz, sıkıntı yaşayabilirsiniz.

Üçüncü sorunun cevabını zaten ilk kısımda vermiştim, bunun için ayrı makrolara gerek yok, her makronun içinde kullanabilirsiniz.

Displayalaerts uyarıların pasiflenmesi anlamına geliyor, örneğin dosya kapatmak istediğinizde dosyayı kaydetmek istediğiniz sorulur normalde, bu özelliği kapatırsanız dosya uyarı vermeden ve kaydedilmeden kapanır, veri kaybı yaşarsınız. Bunu engellemek için kodda dosya kaydet satırı eklemeniz gerekir.

Application yani Excelin kendisiyle ilgili kodlar sadece çalışılan dosyayı değil bütün dosyaları etkilediği için dikkatli kullanılmalıdır.

Bahsettiğiniz türden başka kod var mı bilmiyorum ama sorgu işlemlerinde for next döngüsü yerine dizi, sl, ado, scriptingdictionary gibi yöntemler kullanılarak çok daha hızlı sonuçlar elde edilebiliyor. Ancak bu kodların kullanılması konusunda maalesef yeterli bilgiye sahip değilim.
 
Katılım
6 Mayıs 2014
Mesajlar
264
Excel Vers. ve Dili
office 365
Altın Üyelik Bitiş Tarihi
23-06-2021
Ayrı makrolar halinde ( Run("with_baş") şeklinde ) kullanmamın sebebi şu: Makroları yeni öğreniyorum. Daha emekleme aşamasında bile değilim. Deneme yanılma yöntemi ile yaptığım en gelişmiş makro basit bir for döngüsü ile do until döngüsü. Dolayısı ile iki satırlık kodları bile hafızada tutamadığım için mesela değerleri yapıştır kodlarını bir makronun içinde gerekli olan yerde Run("değerleri_yapıştır") şeklinde çağırmak daha kolayıma geliyor.

Zaman ayırdığınız teşekkür ediyorum. Saygılar.
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Bu size özgü bir sorun değil. Ben de her kodu ezbere bilmiyorum, hatta çoğu kodu bilmiyorum (do until'i bilmiyorum mesela). Gerektiğinde makro kaydet ile kodları oluşturup kullanıyorum.
 
Üst