Excel için hazırlanan VBA makrolarının en büyük handikapı performans problemidir. Eğer VBA ile Excel sayfası arasında çok fazla veri alış verişi varsa hatrı sayılır bir süre beklemeniz gerekebilir. Bu yazıdaki ip uçlarını kullanarak makrolarınız performansını biraz arttırabilirsiniz.
1. Hücreleri teker teker okumak yerine bütün bir range’i tek seferde bir dizi değişkenine atayın. Aynı şey verileri geri yazarken’de geçerli.
1 2 3 4 5 | Dim A as Variant 'okuma A = Range("SomeRange").Resize(10,20) 'geri yazma Range("SomeRange").Resize(10,20) = A |
2. Değişkenleri değişken tipleriyle beraber tanımlamak size hız kazandıracaktır.
3. Kullanıdığını worksheet fonksiyonlarının yerine VBA kodlarıyla kendi fonksiyonlarınızı yazabiliyorsanız bu daha hızlı çalışacaktır.
4. Daha hızlı çalışmak için makro başladıktan sonra ekran güncellemesini kaptın. İşiniz bittikten sonra tekrar açarsınız.
1 | Application.ScreenUpdating = False |
5. Aynı şekilde otomatik hesaplama özelliği de geçici olarak kapatılabilir.
1 2 3 | Application.Calculation = xlManual
'Eski duruma dönmek için
Application.Calculation = xlAutomatic |
6. Eğer makronuzun çalışması uzun sürecekse durum çubuğundan kullanıcıya işin ilerlemesi hakkında bilgi vermek faydalı olabilir. Fikir olması açısından text dosyasından okuma yapan bir makroya ait aşağıdaki örnek kodu inceleyebilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | dBoy = FileLen(dosya) / 128 'dosyanın boyutunu al ve 128'e böl. Open dosya For Input As #1 Do While Not EOF(1) ' dosyanın sonuna gelinceye dek kadar devam et Line Input #1,metin N = N + 1 'satırları say 'Loc() her 128 bayt'lık bloklar halinde dosyanın içindeki pozisyonu verir bunu kularak yüzde olarak dosyanın neresinde olduğumuzu anlayabiliriz. Bu bilgiyi kullanarak durum çubuğunda ilerleme durumu gösterelim ve her 100 kayıtta bir durum çubuğunu güncelleyelim If N Mod 100 = 0 Then Application.StatusBar = "İlerleme " & Format(Loc(1)/dBoy,"0%") Loop Close 'durum çubuğunu tekrar Excel'e bırakalım. Application.StatusBar = False |
7. Text dosyasından hızlı bir şekilde veri almak ve yazmak için aşağıdaki kodu deneyebilirsiniz.
1 2 3 4 5 6 7 8 9 10 | 'yazmak için Open "c:temptest.txt" For Binary As #1 Put #1,,A Close 'okumak için Dim A(30,10) As Single Open "c:temptest.txt" For Binary As #1 Get #1,,A Close |
Umarım bu bilgiler işinize yarar.
Kaynak: http://www.avdf.com/apr98art_ot003.html