Genel Bakış
Val (Val function), bir metnin başında yer alan sayısal karakterleri okuyup sayıya çeviren VBA işlevidir. Sayı olarak yorumlayamadığı ilk karakterde okumayı bırakır ve o noktaya kadar okuduğu değeri döndürür. Ölçü, adet ya da kod gibi hem sayı hem metin içeren hücre değerlerinden sayıyı ayıklamak için kullanılır.
Un için 12,5, zeytinyağı için 3,5, çay için 500 değeri yazılır. "Kutu 24" metni harfle başladığı için 0 sonucunu verir. "3,5 kg" metninde virgül ondalık ayracı sayılmadığı için okuma orada durur ve 3 yazılır. "1 250 gr" metnindeki boşluk yok sayıldığından sonuç 1250 olur. "%18 yağ" metni yüzde işaretiyle başladığı için 0 döner.
"&HFF" metni onaltılık sayı olarak okunur ve 255 değerini verir; "&O17" sekizlik sayı olarak 15 olur. "$100" metni para simgesiyle başladığı için 0 sonucunu verir. "1,234" metninde okuma virgülde durur ve 1 yazılır. "1.2.3" için 1,2, "4 5 6" için 456 elde edilir. Sayı içermeyen "abc" metni 0 döndürür.
Defter satırında adet 24, tutar 444,00 olarak yazılır. "12adet" gibi boşluksuz yazılmış notlarda da sayı doğru ayıklanır; silgi satırında adet 12 olur. "Acil: 15" notu harfle başladığı için Val 0 döndürür; dosya satırının adet hücresine Kontrol, tutar hücresine Hesaplanamadı yazılır. Genel toplam 1.560,00 hücresinde görünür; metin içeren hücreler toplama katılmaz.
Söz dizimi
Val işlevi tek bir bağımsız değişken alır:Val(string)
- string: sayıya çevrilecek metin ifadesi; zorunludur, varsayılan değeri yoktur. Genellikle bir metin değişkeni ya da hücrenin Value özelliği verilir.
Metin nasıl okunur
Val metni soldan sağa tarar ve şu kurallara göre çalışır:- Boşluklar: boşluk, sekme ve satır sonu karakterleri yok sayılır. Bu yüzden "1 250 gr" metni 1250, "4 5 6" metni 456 olarak okunur.
- Ondalık ayracı: yalnızca nokta (.) ondalık ayracı olarak tanınır. Bilgisayarınızın bölgesel ayarı virgül olsa bile "3.5" metni 3,5 olur; "3,5" metni ise virgülde durduğu için 3 olur.
- Tanınmayan karakterler: para simgesi ($), yüzde işareti (%), binlik ayracı olarak virgül ve harfler sayının parçası sayılmaz. Metin bunlardan biriyle başlıyorsa sonuç 0 olur.
- Birden çok nokta: "1.2.3" metninde ikinci noktada okuma durur ve sonuç 1,2 olur.
- Önek: &H öneki onaltılık, &O öneki sekizlik sayı olarak yorumlanır. Örneğin Val("&HFF") 255, Val("&O17") 15 verir.
- Sayı bulunamazsa: metin sayıyla başlamıyorsa ya da boş metinse sonuç 0 olur; hata üretilmez.
Val ile diğer dönüştürme yöntemleri
CDbl, CLng gibi dönüştürme işlevleri metnin tamamının geçerli bir sayı olmasını bekler ve bölgesel ayarlara uyar; uygun olmayan metinde Tür uyuşmazlığı (Type mismatch) hatası verir. Val ise hata vermez, baştaki sayıyı alır ve her zaman nokta ayracını kullanır.- Val: "12.5 kg" gibi karışık metinlerden baştaki sayıyı almak için uygundur.
- CDbl: kullanıcının yerel biçimde yazdığı "12,5" gibi saf sayı metinleri için uygundur.
- IsNumeric: dönüştürmeden önce metnin sayıya benzeyip benzemediğini denetler.
1. Ölçü metninden sayıyı ayıklama
Sayfada ürünlerin ölçüleri "12.5 kg" gibi metin olarak yazılıdır. Alt+F11 ile Visual Basic Düzenleyicisi'ni açın, Ekle > Modül (Insert > Module) ile standart modül ekleyin ve aşağıdaki kodu yapıştırın. Makro, B sütunundaki metinlerin sayısal karşılığını C sütununa yazar.
VBA
13 satır
Option Explicit
Sub OlculeriSayiyaCevir()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Worksheets("Ölçüler")
' 2-8. satırlardaki ölçü metinlerini sayıya çevirir
For i = 2 To 8
ws.Cells(i, 3).Value = Val(ws.Cells(i, 2).Value)
Next i
End Sub
Val
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Ölçü Metni | Sayısal Değer |
| 2 | Un | 12.5 kg | 12,5 |
| 3 | Zeytinyağı | 3.5 lt | 3,5 |
| 4 | Çay | 500 gr | 500 |
| 5 | Şeker | Kutu 24 | 0 |
| 6 | Makarna | 3,5 kg | 3 |
| 7 | Tuz | 1 250 gr | 1250 |
| 8 | Süt | %18 yağ | 0 |
ÖlçülerExcelDepo v1.0.0
2. Özel biçimler ve tanınmayan karakterler
Bu örnek Val işlevinin farklı metin kalıplarını nasıl yorumladığını gösterir. Standart bir modül ekleyip aşağıdaki kodu yapıştırın; makro A sütunundaki metinleri okuyup sonucu B sütununa yazar.
VBA
13 satır
Option Explicit
Sub KaliplariDene()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Worksheets("Metin Kalıpları")
' A sütunundaki her metin için Val sonucunu B sütununa yazar
For i = 2 To 8
ws.Cells(i, 2).Value = Val(ws.Cells(i, 1).Value)
Next i
End Sub
Val
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Metin | Val Sonucu | Açıklama |
| 2 | &HFF | 255 | Onaltılık sayı öneki |
| 3 | &O17 | 15 | Sekizlik sayı öneki |
| 4 | $100 | 0 | Para simgesi tanınmaz |
| 5 | 1,234 | 1 | Virgülde okuma durur |
| 6 | 1.2.3 | 1,2 | İkinci noktada okuma durur |
| 7 | 4 5 6 | 456 | Boşluklar yok sayılır |
| 8 | abc | 0 | Sayı yoksa 0 döner |
Metin KalıplarıExcelDepo v1.0.0
3. Sipariş notlarından tutar hesaplama
Siparişlerin adetleri "24 adet" gibi serbest notlar içinde yazılmıştır. Standart bir modüle aşağıdaki kodu yapıştırın. Makro adedi Val ile ayıklar, adet okunamıyorsa satırı "Kontrol" olarak işaretler ve geçerli satırların tutarlarını toplar.
VBA
26 satır
Option Explicit
Sub SiparisTutariHesapla()
Dim ws As Worksheet
Dim i As Long
Dim adet As Double
Set ws = ThisWorkbook.Worksheets("Sipariş Notları")
For i = 2 To 7
' Nottaki baştaki sayıyı adet olarak al
adet = Val(ws.Cells(i, 2).Value)
If adet > 0 Then
ws.Cells(i, 3).Value = adet
ws.Cells(i, 5).Value = adet * ws.Cells(i, 4).Value
Else
' Not sayıyla başlamıyorsa elle denetlenmesi için işaretle
ws.Cells(i, 3).Value = "Kontrol"
ws.Cells(i, 5).Value = "Hesaplanamadı"
End If
Next i
' Metin olan hücreler toplama katılmaz
ws.Range("E8").Value = Application.WorksheetFunction.Sum(ws.Range("E2:E7"))
End Sub
Val
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Sipariş Notu | Adet | Birim Fiyat | Tutar |
| 2 | Defter | 24 adet | 24 | 18,50 | 444,00 |
| 3 | Kalem | 100 adet | 100 | 3,25 | 325,00 |
| 4 | Dosya | Acil: 15 | Kontrol | 6,75 | Hesaplanamadı |
| 5 | Klasör | 8 adet | 8 | 42,00 | 336,00 |
| 6 | Silgi | 12adet | 12 | 2,50 | 30,00 |
| 7 | Zımba | 5 adet | 5 | 85,00 | 425,00 |
| 8 | Toplam | 1.560,00 |
Sipariş NotlarıExcelDepo v1.0.0
Kullanırken dikkat edin
- Virgüllü sayılara dikkat edin: Türkçe bölgesel ayarda sayılar virgülle yazılır, ancak Val yalnızca noktayı ondalık ayracı olarak tanır. "3,5" metni 3,5 değil 3 olarak okunur. Kullanıcıdan gelen verilerde virgül olabiliyorsa metni önce Replace ile düzeltin ya da bölgesel ayara duyarlı CDbl işlevini kullanın.
- Binlik ayracı ve para simgesi: "1,250" metni 1 olarak okunur, "$100" ve "%18" gibi metinler 0 verir. Para ya da yüzde biçimli metinlerde önce bu simgeleri Replace ile temizleyin, sonra dönüştürün.
- Sonuç 0 ise ne olduğunu ayırt edin: Val hem gerçek 0 değerinde hem de sayı bulunamadığında 0 döndürür. Ayrım gerekiyorsa önce metnin ilk karakterini ya da IsNumeric sonucunu denetleyin; üçüncü örnekteki gibi 0'ı "Kontrol" olarak işaretleyebilirsiniz.
- Hata değeri ve Null: Hücre #N/A gibi bir hata değeri içeriyorsa Val bu değeri işleyemez ve çalışma zamanı hatası oluşur. Null değer verilmesi de hata doğurur. Döngüde hücreleri okurken IsError ile denetim yapmak güvenlidir.
- Sayı hücrelerinde gerekmez: Val metin bekleyen bir işlevdir. Hücre zaten sayı içeriyorsa değeri doğrudan kullanın; sayıyı yeniden metne çevirip Val ile okumak bölgesel ayar yüzünden yanlış sonuç doğurabilir.
- İlgili konular:
- CDbl, CLng, CInt: tüm metni sayıya çeviren, bölgesel ayara uyan dönüştürme işlevleri
- IsNumeric: bir ifadenin sayıya çevrilebilir olup olmadığını denetler
- Str ve CStr: sayıyı metne çevirir
- Replace: metindeki virgül ve simgeleri değiştirmek için
- Left, Mid, Right: metinden belirli bir parçayı ayırmak için
- DEĞER: çalışma sayfasında metni sayıya çeviren işlev
- SAYIDEĞERİ: ondalık ve binlik ayracını kendiniz belirterek metni sayıya çeviren işlev