VBA DoEventleri

İçindekiler

VBA DoEvents işlevi, çalışan bir makroyu geçici olarak duraklatır ve Excel'e tuşa basışları, fare tıklamalarını ve diğer işletim sistemi mesajlarını işleme şansı verir.

Uzun süre çalışan makrolarda, Excel askıda kalıyor ve yanıt vermiyor gibi görünebilir ve makronun kesintiye uğraması imkansız olabilir. Kodunuzda DoEvents varsa, kullanıcılar makronun hala çalıştığından emin olabilir ve gerekirse yürütmeyi kesebilir.

VBA DoEvents Örneği

Aşağıdaki kodu göz önünde bulundurun:

1234567891011 Genel Alt Test()Dim kadar uzuni = 1 ila 20000 içinAralık(“A1”).Değer = isonraki benAlt Bitiş

Bu kodu denediğinizde, Excel penceresinin etkileşime giremeyeceğini not edeceksiniz. Ancak, işlemci üzerinde çok zorlayıcı olmadığından, makro yine de ESC veya CTRL+BREAK tuşlarına basılarak kesilebilir.

Bununla birlikte, bu döngü içinde çok sayıda karmaşık ve zorlu işlevler gerçekleştiriliyorsa, Excel'in bir tuşa basma olayını kaydetmesi daha uzun sürer - özellikle bilgisayar aynı anda başka programları çalıştırıyorsa, birkaç dakikaya kadar veya muhtemelen hiç olmaz.

Şimdi Aralık atamasının altına DoEvents içeren tek bir satır ekleyin:

123 Aralık("A1").Değer = iDoEvents

Bu kodu tekrar çalıştırırsanız, Excel'in artık duyarlı olduğunu göreceksiniz - odaklanabilir ve ön plana çıkarılabilir. DoEvents, döngü aracılığıyla her seferinde çağrılır; bu, Excel'in kendisine gönderilen iletileri işleyebilmesi için makronun her zaman yürütme sağlamasını sağlar. Bu makro hızlı çalıştığı için, neredeyse arka planda çalışıyormuş gibi görünür (ama öyle değil) - döngü içinde daha fazla işlem bu yanılsamayı hızla ortaya çıkarır.

DoEvents Tehlikeleri

Yine de ikinci bir göz atın. Excel'in odaklanmasına izin vermekten daha fazlası, aslında hücrelerin içine tıklayabilir ve hatta makro çalışırken sekmeler arasında geçiş yapabilirsiniz (deneyin - bazı komik davranışlar göreceksiniz). Bu, DoEvents'in tehlikelerinden birini gösterir - makronuz dikkatli bir şekilde kodlanmadıysa, istenmeyen sonuçlara neden olabilir.

Diğer bir tehlike, DoEvents'in diğer makroların içinde çalışması için bir pencere olarak hizmet edebilmesidir. Bunu deneyin: çalışma sayfasına bir ActiveX KomutDüğmesi yerleştirin, üzerine çift tıklayın ve CommandButton1_Click() olayının içine aşağıdaki kodu ekleyin:

1234567 Dim c Aralık olarakAralıktaki Her c İçin("B3:E8")c.Değer = c.Değer + 1sonraki c

Excel'de Tasarım Modu'nu kapatın, ardından daha önce eklediğiniz Test() makrosunu çalıştırın. Test makrosu çalışırken, çalışma sayfasındaki KomutDüğmesi'ni tıklatabilirsiniz; DoEvents Test() makrosuna bir ara verir vermez ilişkili makrosu çalışır.

Buradaki tehlike, KomutDüğmesi makrosunun Test() makrosunun üzerinde çalıştığı verileri değiştirmesi veya Test() makrosunu yeniden tetiklemesidir. Dikkatli olmazsanız, son derece dağınık sonuçlar elde edebilirsiniz.

Son olarak, DoEvents'in çağrıldığında makronuzun performans etkisine maruz kalmasına neden olacağını bilmelisiniz. Bir döngü içinde, DoEvents'in çağrılma sıklığını sınırlamazsanız, bu etki hızla artacaktır. Test() örneğimize bakarak şunu deneyin:

1 Mod 1000 = 0 ise DoEvents

Bu, Excel'in yanıt verme hızını gözle görülür şekilde azaltır, ancak performans etkisi azalacaktır.

DoEvents ne zaman kullanılır?

Bu tehlikelere rağmen DoEvents, test etmeye ve hata ayıklamaya yardımcı olan kullanışlı bir işlevdir. Uzun süren döngülere DoEvents eklemeyi düşünün.

DoEvents'i dahil etmenin bir başka nedeni de kullanıcı geri bildirimine izin vermektir. Örneğin, bir makro, bir UserForm'un etiketlerini ilerleme göstergeleriyle güncelleyebilir. DoEvents olmadan Excel, UserForm'u yeniden boyamak için iletileri almayabilir, bu da kullanıcıya makronun çalışmayı durdurduğu izlenimini verir - özellikle başka bir programa geçer ve ardından Excel'e geri dönmeyi denerseniz. Ancak DoEvents ile UserForm yeniden boyanmaya devam edecek ve makronun ilerleme durumuyla ilgili güncellemeler görünmeye devam edecek.

Çoğunlukla, DoEvents, kodunuza çok şey eklemek isteyeceğiniz bir şey değildir ve çoğu zaman ihmal edilebilir. Duyarlılık, makronuzun ihtiyaç duyduğu bir şeyse, bunu göz ardı etmeyin!

Arkadaşlarınızla sayfasını paylaşan sitenin gelişimine yardımcı olacak

wave wave wave wave wave