Genel Bakış
Application.Volatile (Application.Volatile method), bir kullanıcı tanımlı işlevi (UDF) uçucu olarak işaretleyen yöntemdir. Uçucu işlev, yalnızca bağımsız değişkenleri değiştiğinde değil, çalışma sayfasında herhangi bir hücre hesaplandığında yeniden hesaplanır. İşlevin bağımsız değişken olarak almadığı hücrelere, zamana ya da başka dış duruma bağlı sonuç ürettiği durumlarda güncel sonucu garanti etmek için kullanılır.
Excel'in kendi uçucu işlevleri de vardır: ŞİMDİ, BUGÜN, S_SAYI_ÜRET, RASTGELEARADA, DOLAYLI ve KAYDIR bunların başlıcalarıdır. Application.Volatile ile kendi yazdığınız işlevlere aynı davranışı kazandırırsınız.
İşlev iskeleti şöyledir:
Hesaplama modu El ile ise (Formüller > Hesaplama Seçenekleri > El ile (Formulas > Calculation Options > Manual)) uçucu işlevler de kendiliğinden yenilenmez; F9 tuşuna ya da kodda Application.Calculate yöntemine ihtiyaç vardır.
Makro, Defter tutarını 190 olarak değiştirdikten sonra C2 hücresinde KDV dahil toplam 528,00 olarak görünür. Bu sonuç yeni tutarları içerir, çünkü işlev uçucudur ve her hesaplamada yeniden çalışır. Application.Volatile satırını silerseniz Excel işlev ile B2:B5 aralığı arasındaki bağı bilmediği için C2 eski değerde kalabilir.
Makro A5 ve B5 hücrelerine yeni personeli yazdıktan sonra C2 hücresinde kayıt sayısı 4 olarak görünür. Bu değer yeni eklenen kaydı da kapsar. Bu örnekte Application.Volatile bağımsız değişkensiz yazılmıştır; varsayılan değer True olduğu için etkisi Application.Volatile True ile aynıdır.
Makro iki işlevi hücrelere yazar, ardından sayaçları sıfırlar ve Application.Calculate yöntemini üç kez çalıştırır. Uçucu işlev sonraki hesaplamalarda da yeniden çalıştığı için C2 hücresindeki sayaç 4 değerine ulaşır. Uçucu olmayan işlev Calculate ile yeniden çalışmadığı için C3 hücresinde formül girilirken oluşan 1 değeri kalır. İki değerin farkı, Application.Volatile ayarının hesaplama davranışını değiştirdiğini gösterir.
Söz dizimi
Yöntem, bir Function yordamının içinde, genellikle ilk satırda çağrılır:Application.Volatile [Volatile]
- Volatile: İsteğe bağlı, Boolean türünde. True ise işlev uçucu olur, False ise işlev uçucu olmayan duruma döner. Varsayılan değeri True'dur.
Uçucu ve uçucu olmayan işlev farkı
Excel normalde bir işlevi yalnızca bağımsız değişkenleri (girdileri) değiştiğinde yeniden hesaplar. Bu davranış hızlıdır, çünkü gereksiz hesaplama yapılmaz. Uçucu işlev ise çalışma sayfasındaki herhangi bir hücre hesaplandığında, çalışma kitabı açıldığında ve F9 ile hesaplama yapıldığında yeniden çalışır.Excel'in kendi uçucu işlevleri de vardır: ŞİMDİ, BUGÜN, S_SAYI_ÜRET, RASTGELEARADA, DOLAYLI ve KAYDIR bunların başlıcalarıdır. Application.Volatile ile kendi yazdığınız işlevlere aynı davranışı kazandırırsınız.
Ne zaman gerekir
Uçucu işaret şu durumlarda işe yarar:- Bağımsız değişken olmayan hücre okumak: İşlev kod içinde Range ile bir aralığı okuyor ama aralığı bağımsız değişken olarak almıyorsa Excel bağımlılığı bilemez; sonuç eski kalabilir.
- Zamana ya da rastgeleliğe bağlı sonuç: Tarih, saat ya da rastgele sayı üreten işlevlerde.
- Dış duruma bağlı sonuç: Sayfadaki kayıt sayısı, etkin sayfa gibi değişebilen bilgilere bağlı işlevlerde.
İşlev iskeleti şöyledir:
VBA
4 satır
Function OrnekIslev() As Double
Application.Volatile True
' hesaplama kodu
End Function
Nerede çalışır
Application.Volatile yalnızca bir çalışma sayfası hücresinden çağrılan kullanıcı tanımlı işlevlerde anlam taşır. Bir Sub içinde ya da hücreden çağrılmayan bir işlevde etkisi yoktur. Yöntem işlevin içinde çalıştırıldığı için, işlev hücreye ilk kez girildiğinde kayıt altına alınır.Hesaplama modu El ile ise (Formüller > Hesaplama Seçenekleri > El ile (Formulas > Calculation Options > Manual)) uçucu işlevler de kendiliğinden yenilenmez; F9 tuşuna ya da kodda Application.Calculate yöntemine ihtiyaç vardır.
1. Bağımsız değişkensiz aralığı okuyan işlev
Aşağıdaki kodu standart bir modüle yapıştırın. KdvliToplam işlevi B2:B5 aralığını bağımsız değişken olarak almaz, kod içinde okur. Hesapla makrosu işlevi C2 hücresine yazar, sonra Defter tutarını değiştirir ve sayfayı hesaplar.
VBA
19 satır
Option Explicit
' B2:B5 aralığını toplayıp yüzde 20 KDV ekler
Function KdvliToplam() As Double
' Aralık bağımsız değişken olmadığı için işlev uçucu yapılır
Application.Volatile True
Dim ws As Worksheet
Set ws = Application.Caller.Worksheet
KdvliToplam = Application.WorksheetFunction.Sum(ws.Range("B2:B5")) * 1.2
End Function
Sub Hesapla()
With ThisWorkbook.Worksheets("Tutar Listesi")
.Range("C2").Formula = "=KdvliToplam()"
' Tutarı değiştir; işlev uçucu olduğu için sonuç güncellenir
.Range("B3").Value = 190
Application.Calculate
End With
End Sub
Application.Volatile
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Tutar | KDV Dahil Toplam |
| 2 | Kalem | 150,00 | 528,00 |
| 3 | Defter | 190,00 | |
| 4 | Dosya | 60,00 | |
| 5 | Klasör | 40,00 |
Tutar ListesiExcelDepo v1.0.0
2. Kayıt sayısını dinamik sayan işlev
Standart modüle aşağıdaki kodu yapıştırın. KayitSayisi işlevi A sütunundaki dolu hücreleri sayar. Bağımsız değişkeni olmadığı için uçucu yapılmıştır. KayitEkle makrosu listeye yeni bir personel ekler ve sayfayı hesaplar.
VBA
19 satır
Option Explicit
' A2:A100 aralığındaki dolu hücreleri sayar
Function KayitSayisi() As Long
Application.Volatile
Dim ws As Worksheet
Set ws = Application.Caller.Worksheet
KayitSayisi = Application.WorksheetFunction.CountA(ws.Range("A2:A100"))
End Function
Sub KayitEkle()
With ThisWorkbook.Worksheets("Personel Listesi")
.Range("C2").Formula = "=KayitSayisi()"
' Listeye yeni kayıt ekle
.Range("A5").Value = "Elif Aydın"
.Range("B5").Value = "Konya"
Application.Calculate
End With
End Sub
Application.Volatile
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Personel | Şehir | Kayıt Sayısı |
| 2 | Ayşe Yılmaz | Ankara | 4 |
| 3 | Mehmet Demir | İzmir | |
| 4 | Zeynep Kaya | Bursa | |
| 5 | Elif Aydın | Konya |
Personel ListesiExcelDepo v1.0.0
3. Uçucu ve uçucu olmayan işlev karşılaştırması
Standart modüle aşağıdaki kodu yapıştırın. İki işlev de her çalıştığında bir sayaç artırır; biri Application.Volatile True, diğeri Application.Volatile False kullanır. Deneme makrosu işlevleri hücrelere yazar, ardından sayaçları sıfırlar ve sayfayı üç kez hesaplar.
VBA
32 satır
Option Explicit
Private mUcucuSayi As Long
Private mSabitSayi As Long
' Uçucu işlev: her hesaplamada yeniden çalışır
Function UcucuSayac() As Long
Application.Volatile True
mUcucuSayi = mUcucuSayi + 1
UcucuSayac = mUcucuSayi
End Function
' Uçucu olmayan işlev: yalnızca girdileri değişirse çalışır
Function SabitSayac() As Long
Application.Volatile False
mSabitSayi = mSabitSayi + 1
SabitSayac = mSabitSayi
End Function
Sub Deneme()
Dim i As Long
With ThisWorkbook.Worksheets("Hesap Sayacı")
.Range("C2").Formula = "=UcucuSayac()"
.Range("C3").Formula = "=SabitSayac()"
' Sayaçları sıfırla, sonra üç kez hesapla
mUcucuSayi = 0
mSabitSayi = 0
For i = 1 To 3
Application.Calculate
Next i
End With
End Sub
Application.Volatile
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | İşlev | Ayar | Hesaplama Sayısı |
| 2 | Uçucu işlev | Volatile True | 4 |
| 3 | Uçucu olmayan işlev | Volatile False | 1 |
Hesap SayacıExcelDepo v1.0.0
Kullanırken dikkat edin
- Performansı unutmayın: Uçucu işlev her hesaplamada çalışır. Çok sayıda hücrede kullanırsanız ya da işlev ağır bir döngü içeriyorsa çalışma kitabı yavaşlar. Yalnızca gerçekten gerektiğinde kullanın.
- Önce bağımsız değişkeni deneyin: İşlevin okuduğu aralığı bağımsız değişken olarak alırsanız Excel bağımlılığı kendisi izler ve Application.Volatile gerekmez. Bu yol hem daha hızlı hem de daha öngörülebilirdir.
- Yalnızca hücreden çağrılan işlevde etkilidir: Application.Volatile bir Sub içinde ya da hücreden çağrılmayan işlevlerde bir etki yaratmaz. İşlevin hücre formülünde kullanıldığından emin olun.
- Kaydetme uyarısı: Uçucu işlevler çalışma kitabı açıldığında hesaplandığı için, hiçbir değişiklik yapmasanız bile kapatırken kaydetme uyarısı çıkabilir.
- El ile hesaplama modu: Hesaplama modu El ile ise uçucu işlevler de kendiliğinden yenilenmez. F9 tuşuna basın ya da kodda Application.Calculate yöntemini kullanın.
- Çağrı yeri: Yöntemi işlevin ilk satırlarına yazın; hesaplama kodundan önce çalışması, işlevin her koşulda uçucu olarak kaydedilmesini sağlar.
- İlgili konular:
- Application.Calculate: Açık çalışma kitaplarını hesaplatan yöntem.
- Application.Caller: İşlevi çağıran hücreyi verir.
- Application.Calculation: Hesaplama modunu (otomatik ya da el ile) belirler.
- Function deyimi: Kullanıcı tanımlı işlev yazma.
- Worksheet_Calculate olayı: Sayfa hesaplandığında çalışan olay.
- Formüller > Hesaplama Seçenekleri (Formulas > Calculation Options): Hesaplama modunu değiştiren menü.
- Uçucu Excel işlevleri: ŞİMDİ, BUGÜN, S_SAYI_ÜRET, RASTGELEARADA, DOLAYLI, KAYDIR