DoEvents komutunun ne işe yaradığını ve ne şekilde kullanılabileceğini döngü örnekleriyle beraber görelim.
Uzun Bir Döngü
Bir modül içine uzun bir döngü yazalım. Hemen aşağıya bir örnek yazdım.
Option Explicit
Sub DonguOrnegi()
Dim i As Long
For i = 1 To 10000000
Range("A" & i) = i
Next
End Sub
Dosyanın Kilitlenmesi
Eğer bu kodu bu haliyle çalıştırırsanız dosyanızın bir süre sonra müdahale edilemez bir hale gelmesi doğal bir olay olarak açıklanabilir. Ha normale döner ama kim bilir ne zaman olur.
Tabii bu durumun en büyük sıkıntısı işlemin yapıldığı esnada dosyaya müdahale edemiyor oluşumuzdur. Tekrar bir şeyler yapabilmek için ya işlemin (döngü) bitmesini bekleyeceğiz ya da dosyayı zorla kapatıp olası bir zarara katlanacağız. Başka da alternatif var mı bilmiyorum açıkçası.
DoEvents Komutu
İşte DoEvents
fonksiyonu tam bu noktada işe yarayabilecek bir fonksiyon olarak karşımıza çıkıyor. Mantığını basitçe şu şekilde özetleyebiliriz: Hacı, işe giriştiğinde yaldır yaldır yapıyorsun, iyi güzel hoş da arada müdahale etmemiz gerekiyor ama sana bir türlü dinletemiyoruz derdimizi. Sen bakarak ol ki (DoEvents
) biz gerekirse araya girebilelim.
Hacıdan cevap gelir: Valla kardeş DoEvents
istiyorsan iş biraz gecikebilir haberin olsun. Sen de biliyorsun ki işler düzgün aksın diye ben bizzat müdahalede bulunacağım ve bu da süreyi biraz uzatabilir.
Heee, yok bilmiyordum ama senin canın sağolsun hacı dayı.
DoEvents Örneği
Option Explicit
Sub DonguOrnegi()
Dim i As Long
For i = 1 To 10000000
Range("A" & i) = i
DoEvents
Next
End Sub
DoEvents Çalışma Prensibi
DoEvents
denilen nane ile VBA prosesinin denetimini işletim sistemine devretmesini sağlıyoruz.DoEvents
’a gelindiğinde işletim sistemi bir şeyler yapıyor, ediyor. Böylelikle makro arkaplanda çalışırken başka işlemlere de yer verilebiliyor. En basitinden makroyu durdurmak için bir fırsat yakalayabiliyoruz.DoEvents Sıklığını Ayarlamak
DoEvents
illa tek başına kullanmamıza gerek yok. Çeşitli kodlarla daha değişik işlemler de yaptırabiliriz. Mesela ben sıkıntı olabilecek düzeylerdeki aralıklar için test ettim ve güzel çalışıyor. Bilgisayarımda makro çalışıyordu ama dosya işlem yapılamaz hale gelip duruyordu ama buna rağmen durdurma fırsatını yine rahatça yakalayabiliyordum.
Bunu neden yazdım, çünkü DoEvents
yukarıda da yazdığım gibi işlemi geciktiriyor ve CPU kullanımını artırıyor.
Option Explicit
Sub DonguOrnegi()
Dim i As Long
Dim kontrol As Variant
For i = 1 To 10000000
Range("A" & i) = i
If i Mod 100000 = 0 Then
kontrol = DoEvents
End If
Next
End Sub
Tabii benim bilgisayar biraz eskidi, yeni bilgisayarlar bu kodu daha rahat çalıştırabilir. Denemek isterseniz döngü ve mod değerlerini artırın.
Notlar
Sleep
ve Application.Wait
alternatifi olarak kullanılabilir ve bunlara göre zaman kaybı daha az oluyormuş. Tabii yapılan işleme göre değişebilir. Örneğin bazı işlerde garantiye almak için DoEvents
’dan önce 1sn’lik bir bekletme yapılabilir.