Genel Bakış
CDbl (Convert to Double), verilen metin ya da sayısal ifadeyi Double veri türüne çeviren bir VBA tür dönüştürme işlevidir. Hücrelerde metin olarak duran sayıları hesaplamaya hazırlamak, tarihleri seri numarasına çevirmek ve ondalıklı hesaplarda türü açıkça belirlemek için kullanılır.
Dönüştürmenin başarılı olup olmayacağından emin değilseniz önce IsNumeric ile denetleyin ya da On Error Resume Next ve Err.Number ile hatayı yakalayın. Örnekler bölümünde ikinci örnek bu yöntemi gösterir.
Makro çalışınca C sütununda gerçek sayılar oluşur. Klavye için fiyat 1.250,00, KDV'li tutar ise 1.500,00 olarak yazılır. Artık bu hücreler TOPLA gibi işlevlere ve diğer hesaplara doğrudan girebilir.
Ocak satırında dönüştürme başarılı olur ve C2 hücresine 1500 yazılır. Şubat satırında "yok" metni sayıya çevrilemediği için C3 hücresinde Hatalı yazısı görünür ve D3 hücresine hata kodu 13 (Type mismatch) yazılır. Böylece makro hata verip durmaz, tüm satırları işlemeye devam eder.
S-1001 siparişinin tarihi 45366 seri numarasına dönüşür; sonraki gün olan S-1002 için seri numarası 45367 olur. Türü gösteren D2 hücresinde Double yazar. Seri numarası, 1 Ocak 1900 gününden itibaren geçen gün sayısını gösterir; tarih farkı ve gün hesaplarında bu sayı kullanılabilir.
Söz dizimi
İşlevin söz dizimi şöyledir:CDbl(ifade)
- ifade: Zorunludur. Dönüştürülecek metin, sayı, tarih ya da sayıya çevrilebilen bir değişken veya hücre değeridir. Varsayılan değeri yoktur.
Dönüştürme kuralları
- Metin: İçeriği sayı olarak okunabiliyorsa çevrilir. Baştaki ve sondaki boşluklar sorun çıkarmaz. Sayı olarak okunamayan metin (ör. harf içeren) Type mismatch (Tür uyuşmazlığı, hata 13) verir. Boş metin de aynı hatayı verir.
- Tarih: Tarih ve saat değerleri Excel seri numarasına dönüşür. Tam sayı kısmı gün sayısını, ondalık kısmı günün saatini gösterir.
- Boolean: True değeri -1, False değeri 0 olur.
- Empty: Boş bir hücrenin .Value değeri Empty olduğu için sonuç 0 çıkar.
- Null: Null değeri Null değerinin geçersiz kullanımı (hata 94) hatası üretir.
Bölgesel ayarlar ve hata yönetimi
CDbl, bilgisayarın bölgesel ayarlarını dikkate alır. Türkçe ayarlarda ondalık ayırıcı virgül, binlik ayırıcı noktadır. Bu nedenle bir metindeki 1.250,75 değeri Türkçe ayarlarda doğru okunurken, İngilizce ayarlı bir bilgisayarda aynı metin hata verebilir ya da farklı bir sayıya dönüşebilir. Kodun içinde yazdığınız sabit sayılar ise her zaman noktalı ondalık biçimle yazılır.Dönüştürmenin başarılı olup olmayacağından emin değilseniz önce IsNumeric ile denetleyin ya da On Error Resume Next ve Err.Number ile hatayı yakalayın. Örnekler bölümünde ikinci örnek bu yöntemi gösterir.
1. Metin olarak yazılmış fiyatları sayıya çevirme
Fiyatlar B sütununda metin biçiminde duruyor. Aşağıdaki kodu standart bir modüle yapıştırın. Makro her fiyatı CDbl ile sayıya çevirip C sütununa yazar, ardından D sütununda yüzde 20 KDV'li tutarı hesaplar.
VBA
15 satır
Option Explicit
Sub MetniSayiyaCevir()
Dim r As Long
Dim fiyat As Double
' 2. satırdan 6. satıra kadar fiyatları işle
For r = 2 To 6
' Metni Double türüne çevir
fiyat = CDbl(Cells(r, 2).Value)
Cells(r, 3).Value = fiyat
' KDV'li tutarı hesapla
Cells(r, 4).Value = fiyat * 1.2
Next r
End Sub
CDbl
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Fiyat (Metin) | Fiyat (Sayı) | KDV'li Tutar |
| 2 | Klavye | 1250 | 1.250,00 | 1.500,00 |
| 3 | Fare | 980 | 980,00 | 1.176,00 |
| 4 | Monitör | 2400 | 2.400,00 | 2.880,00 |
| 5 | Kulaklık | 175 | 175,00 | 210,00 |
| 6 | Yazıcı | 3600 | 3.600,00 | 4.320,00 |
Metin SayılarExcelDepo v1.0.0
2. Hatalı veriyi yakalayarak güvenli dönüştürme
Aylık satış değerlerinin bir kısmı sayı değil, açıklama metni içeriyor. Kodu standart bir modüle yapıştırın. Makro dönüştürme hatasını yakalar; başarılı satırlarda sayıyı, başarısız satırlarda "Hatalı" yazısını C sütununa, hata kodunu D sütununa yazar.
VBA
23 satır
Option Explicit
Sub GuvenliCevir()
Dim r As Long
Dim sayi As Double
For r = 2 To 6
Err.Clear
On Error Resume Next
sayi = CDbl(Cells(r, 2).Value)
If Err.Number <> 0 Then
' Dönüştürme başarısız: hata kodunu kaydet
Cells(r, 3).Value = "Hatalı"
Cells(r, 4).Value = Err.Number
Err.Clear
Else
Cells(r, 3).Value = sayi
Cells(r, 4).Value = 0
End If
On Error GoTo 0
Next r
End Sub
CDbl
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ay | Satış (Ham Veri) | Sonuç | Hata Kodu |
| 2 | Ocak | 1500 | 1500 | 0 |
| 3 | Şubat | yok | Hatalı | 13 |
| 4 | Mart | 2400 | 2400 | 0 |
| 5 | Nisan | belirsiz | Hatalı | 13 |
| 6 | Mayıs | 875 | 875 | 0 |
Hata DenetimiExcelDepo v1.0.0
3. Tarihi seri numarasına çevirme
Sipariş tarihlerinin Excel'deki seri numaralarını görmek istiyorsunuz. Kodu standart bir modüle yapıştırın. Makro B sütunundaki tarihi CDbl ile çevirip C sütununa yazar, D sütununa ise sonucun veri türünü TypeName ile yazar.
VBA
14 satır
Option Explicit
Sub TarihiSayiyaCevir()
Dim r As Long
Dim seri As Double
For r = 2 To 6
' Tarihi seri numarasına (Double) çevir
seri = CDbl(Cells(r, 2).Value)
Cells(r, 3).Value = seri
' Dönüşen değerin veri türünü yaz
Cells(r, 4).Value = TypeName(seri)
Next r
End Sub
CDbl
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Sipariş No | Sipariş Tarihi | Seri No | Tür |
| 2 | S-1001 | 15.03.2024 | 45366 | Double |
| 3 | S-1002 | 16.03.2024 | 45367 | Double |
| 4 | S-1003 | 01.04.2024 | 45383 | Double |
| 5 | S-1004 | 20.05.2024 | 45432 | Double |
| 6 | S-1005 | 30.06.2024 | 45473 | Double |
Tarih Seri NoExcelDepo v1.0.0
Kullanırken dikkat edin
- Bölgesel ayar farkına dikkat edin: Metindeki ondalık ve binlik ayırıcılar bilgisayarın bölgesel ayarlarına göre yorumlanır. Aynı dosya farklı dil ayarlı bir bilgisayarda açılırsa metin tabanlı dönüştürmeler farklı sonuç verebilir. Dışarıdan gelen verilerde önce ayırıcıları kontrol edin.
- Çevrilemeyen değerde hata oluşur: Harf içeren metin, boş metin ya da hata değeri içeren hücre CDbl ile çevrilirse Type mismatch (hata 13) oluşur. Emin olmadığınız verilerde önce IsNumeric ile denetleyin ya da On Error Resume Next ve Err.Number ile hatayı yakalayın. Hata kapsamını işi bitince On Error GoTo 0 ile kapatmayı unutmayın.
- Boş hücre 0 olarak çevrilir: Boş bir hücrenin .Value değeri Empty olduğundan CDbl sonucu 0 çıkar. Boş hücreleri 0'dan ayırmak istiyorsanız dönüştürmeden önce IsEmpty ya da Len ile kontrol edin.
- Birden çok hücreyi tek seferde çeviremezsiniz: CDbl tek bir değer ister. Birden çok hücre içeren bir Range nesnesini doğrudan veremezsiniz; hücreler üzerinde For döngüsüyle tek tek dolaşmanız gerekir.
- Kayan noktalı sayı hassasiyeti: Double türü yaklaşık 15 anlamlı basamak tutar. Çok büyük tam sayılarda ve ondalık karşılaştırmalarında küçük yuvarlama farkları oluşabilir. Parasal hesaplarda CCur (Currency) ya da CDec daha güvenli olabilir.
- İlgili konular:
- CInt, CLng, CSng, CCur, CDec: Diğer tür dönüştürme işlevleri.
- Val: Metnin başındaki sayısal kısmı, ondalık ayırıcı olarak noktayı kullanarak okur ve bölgesel ayarlardan etkilenmez.
- IsNumeric: Bir ifadenin sayıya çevrilebilir olup olmadığını denetler.
- TypeName ve VarType: Bir değerin veri türünü öğrenmek için kullanılır.
- On Error deyimi ve Err nesnesi: Dönüştürme hatalarını yakalamak için kullanılır.
- DEĞER ve TARİHSAYISI: Çalışma sayfasında metni sayıya ya da tarihe çeviren işlevler.