Genel Bakış
Timer (Timer function), VBA'da gece yarısı 00:00'dan bu yana geçen saniye sayısını, saniyenin kesirleriyle birlikte Single türünde döndüren işlevdir. Bir makronun ya da döngünün ne kadar sürdüğünü ölçmek, kısa süreli zaman farklarını hesaplamak ve Randomize için tohum değeri üretmek amacıyla kullanılır.
İşlev çağrıldığı anda sistem saatine bakar ve değeri hesaplar.
B2 hücresine yazılan 46840,94531 değeri, gece yarısından bu yana geçen saniyedir. B3 hücresindeki 13:00:41 aynı süreyi saat biçiminde gösterir, yani makronun çalıştığı andaki saat bilgisine karşılık gelir. B4 hücresindeki 780 ise geçen tam dakika sayısıdır. Makroyu her çalıştırdığınızda değerler o anın saatine göre değişir.
Makro D sütununa her ürünün tutarını yazar; örneğin ilk ürünün tutarı 5.400,00 olur. E2 hücresindeki 0,004 değeri, döngünün saniye cinsinden süresidir. Bu kadar küçük bir işlem çok kısa süreceği için sonuç 0'a çok yakın çıkabilir. Gerçek ölçümlerde döngüyü binlerce satır üzerinde çalıştırmak daha anlamlı bir sonuç verir.
Yedekleme görevinde bitiş değeri başlangıçtan küçük olduğu için ölçümün gece yarısını aştığı anlaşılır; işlev 86400 ekleyerek doğru süreyi, yani 40 saniyeyi bulur. Rapor Hazırlama için süre 450, Veri Aktarımı için 60,25, Gece Temizliği için 600 saniyedir. Basit çıkarma kullansaydınız gece yarısını aşan görevlerde negatif süre elde ederdiniz.
Söz dizimi
Timer işlevi bağımsız değişken almaz; parantez de gerekmez:degisken = Timer
- Bağımsız değişken: yoktur. Yalnızca Timer yazmanız yeterlidir.
- Dönüş türü: Single. Tam sayı kısmı saniyeyi, ondalık kısmı saniyenin kesirlerini gösterir.
- Değer aralığı: 0 ile 86400 arasındadır. Gün içinde en fazla 86399,99 civarına ulaşır, gece yarısında yeniden sıfırlanır.
Dönüş değerini yorumlama
Saat 00:00:00 iken Timer değeri 0'dır. Öğlen 12:00'de 43200, akşam 18:00'de 64800 olur. Bir günde 86400 saniye bulunduğundan, değeri 86400'e bölerek Excel'in zaman serisine çevirebilirsiniz. Böylece sonucu hücreye yazıp Giriş > Sayı > Sayı Biçimi (Home > Number > Number Format) ya da NumberFormat özelliği ile saat biçiminde gösterebilirsiniz.- Timer / 86400: günün hangi kısmının geçtiğini verir; hücreye yazıp hh:mm:ss biçimi uygularsanız saat olarak görünür.
- Int(Timer / 60): gece yarısından bu yana geçen tam dakikayı verir.
- Timer - baslangic: iki ölçüm arasındaki süreyi saniye cinsinden verir.
Gece yarısı ve duyarlık
Timer her gece yarısı sıfırlandığı için, ölçüm 00:00'ı aşarsa bitiş değeri başlangıçtan küçük çıkar ve fark negatif olur. Bu durumu yakalamak için fark negatifse 86400 ekleyin. Ayrıca Single türünün duyarlığı sınırlıdır; gün sonuna doğru değerler büyüdükçe çok küçük kesirler ölçülemeyebilir. Windows'ta çözünürlük yaklaşık saniyenin yüzde biri düzeyindedir; çok kısa işlemler 0 saniye olarak görünebilir. Bu yüzden ölçümü birkaç yüz ya da bin tekrar üzerinden yapmak daha güvenilirdir.1. Timer değerini saniye, saat ve dakika olarak yazma
Bu örnekte makro, çalıştığı andaki Timer değerini üç farklı biçimde B sütununa yazar. Kodu Alt+F11 ile açtığınız VBA düzenleyicisinde Ekle > Modül (Insert > Module) ile eklediğiniz standart modüle yapıştırın.
VBA
16 satır
Option Explicit
Sub TimerDegeriniYaz()
Dim sn As Single
sn = Timer
' Gece yarisindan beri gecen saniye
Range("B2").Value = sn
' Ayni degeri gunun kesri olarak yazip saat bicimi uygula
Range("B3").Value = sn / 86400
Range("B3").NumberFormat = "hh:mm:ss"
' Gece yarisindan beri gecen tam dakika
Range("B4").Value = Int(sn / 60)
End Sub
Timer
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Açıklama | Sonuç |
| 2 | Gece yarısından beri geçen saniye | 46840,94531 |
| 3 | Saat olarak (ss:dd:ss) | 13:00:41 |
| 4 | Geçen tam dakika | 780 |
Timer DeğeriExcelDepo v1.0.0
2. Bir döngünün süresini ölçme
Bu örnekte makro, tutar hesaplayan döngüden önce ve sonra Timer değerini alır ve farkı E2 hücresine yazar. Kodu standart bir modüle yapıştırın.
VBA
17 satır
Option Explicit
Sub TutarHesapla()
Dim baslangic As Single
Dim i As Long
' Olcumu baslat
baslangic = Timer
' Tutar = Adet x Birim Fiyat
For i = 2 To 7
Cells(i, 4).Value = Cells(i, 2).Value * Cells(i, 3).Value
Next i
' Gecen sureyi saniye olarak yaz (3 basamak)
Cells(2, 5).Value = Round(Timer - baslangic, 3)
End Sub
Timer
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar | Süre (sn) |
| 2 | Klavye | 12 | 450,00 | 5.400,00 | 0,004 |
| 3 | Fare | 25 | 180,00 | 4.500,00 | |
| 4 | Monitör | 6 | 4.200,00 | 25.200,00 | |
| 5 | Kulaklık | 18 | 650,00 | 11.700,00 | |
| 6 | Yazıcı | 4 | 3.100,00 | 12.400,00 | |
| 7 | Web Kamerası | 10 | 520,00 | 5.200,00 |
Süre ÖlçümüExcelDepo v1.0.0
3. Gece yarısını aşan ölçümlerde süre hesabı
Bu örnekte başlangıç ve bitiş değerleri, Timer'ın verebileceği saniye değerleri olarak B ve C sütunlarına yazılmıştır. SureHesapla işlevi bitiş değeri başlangıçtan küçükse ölçümün gece yarısını aştığını kabul edip 86400 ekler. Sub ve işlevin tamamını standart bir modüle yapıştırın. Gerçek bir ölçümde değerleri baslangic = Timer ve bitis = Timer ile alırsınız.
VBA
18 satır
Option Explicit
' Iki Timer degeri arasindaki sureyi saniye olarak verir
Function SureHesapla(ByVal basla As Single, ByVal bitis As Single) As Single
If bitis >= basla Then
SureHesapla = bitis - basla
Else
' Olcum gece yarisini asmis: bir gunun saniyesini ekle
SureHesapla = bitis + 86400 - basla
End If
End Function
Sub SureleriYaz()
Dim i As Long
For i = 2 To 5
Cells(i, 4).Value = SureHesapla(Cells(i, 2).Value, Cells(i, 3).Value)
Next i
End Sub
Timer
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Görev | Başlangıç (sn) | Bitiş (sn) | Süre (sn) |
| 2 | Yedekleme | 86380 | 20 | 40 |
| 3 | Rapor Hazırlama | 36000 | 36450 | 450 |
| 4 | Veri Aktarımı | 43200,5 | 43260,75 | 60,25 |
| 5 | Gece Temizliği | 86100 | 300 | 600 |
Gece YarısıExcelDepo v1.0.0
Kullanırken dikkat edin
- Gece yarısında değer sıfırlanır: Uzun süren bir işlemde başlangıç ve bitiş arasında saat 00:00 geçilirse fark negatif çıkar. Süreyi hesaplarken farkın negatif olup olmadığını denetleyin ve gerekirse 86400 ekleyin.
- Çözünürlük işletim sistemine bağlıdır: Windows'ta Timer yaklaşık saniyenin yüzde biri hassasiyetle çalışır. Çok kısa işlemler 0 saniye gibi görünebilir; bu durumda işlemi çok sayıda tekrarlayıp toplam süreyi tekrar sayısına bölün. Mac sürümlerinde çözünürlük daha düşük olabilir.
- Tarih değil, günün saniyesidir: Timer tarih bilgisi taşımaz. Tarih ve saati birlikte almak için Now, yalnız saat için Time, yalnız tarih için Date işlevini kullanın. Günler arası farkları DateDiff ile hesaplayın.
- Değişken türünü Single seçin: Başlangıç değerini Single ya da Double türünde bir değişkende tutun. Integer ya da Long kullanırsanız saniyenin kesirleri yuvarlanır ve ölçüm anlamını yitirir.
- Ölçüm sırasında ekran güncellemesini kapatın: Hücrelere yazan bir kodun süresini ölçüyorsanız Application.ScreenUpdating = False ayarı süreyi belirgin biçimde kısaltır. Karşılaştırma yaparken iki ölçümü de aynı ayarlarla yapın.
- Randomize ile birlikte kullanım: Randomize Timer yazımı, rastgele sayı üretecini o anki saniye değeriyle başlatır; böylece Rnd her çalıştırmada farklı bir dizi verir.
- İlgili konular:
- Now, Time, Date: VBA'da tarih ve saat işlevleri
- DateDiff: iki tarih ya da saat arasındaki farkı birim cinsinden verir
- Randomize ve Rnd: rastgele sayı üretimi
- Application.OnTime: bir makroyu belirli bir zamanda çalıştırır
- ŞİMDİ, ZAMAN ve SAAT işlevleri: çalışma sayfasında karşılık gelen saat işlevleri