DoEvents Komutu - Microsoft Excel


DoEvents komutunun ne işe yaradığını ve ne şekilde kullanılabileceğini döngü örnekleriyle beraber görelim.

Senaryo

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

  1. Şimdi biliyor musunuz bilmiyorum ama programların çalışan hallerine proses deniyor ve VBA da bu proseslerden bir tanesi.
  2. Bu DoEvents denilen nane ile VBA prosesinin denetimini işletim sistemine devretmesini sağlıyoruz.
  3. 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

  1. Alternatif bir açıklama buldum ve bu da hoşuma gitti: Bu DoEvents fonksiyonu excel olaylarını işletim sistemine devrediyor ve bu şekilde otomatik düzenlenmesini sağlıyor.
  2. VBA’da 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.
Yararlanılan Kaynaklar
Etiketler
microsoft excel microsoft excel vba