Genel Bakış
LBound, bir dizinin belirtilen boyutundaki en küçük geçerli indis numarasını, yani alt sınırı döndüren VBA işlevidir. UBound ile birlikte kullanıldığında dizinin hangi sayıdan başladığını bilmeden güvenli döngüler yazmanızı sağlar. Özellikle Range.Value ile alınan, Array ve Split ile oluşturulan dizilerde alt sınır farklı olabileceği için önemlidir.
İki boyutlu dizilerde her boyut için ayrı çağrı yapılır: LBound(v, 1) satır, LBound(v, 2) sütun alt sınırını verir. Eleman sayısı, UBound(dizi) - LBound(dizi) + 1 işlemiyle bulunur.
Makro çalışınca a dizisinin alt sınırı 0, üst sınırı 5, eleman sayısı 6 olarak yazılır. b dizisi 1 ile 12 arasındadır ve 12 eleman içerir. c dizisi -2 ile 2 arasındadır. d dizisinin 1. boyutu 1 ile 3, 2. boyutu ise 0 ile 4 arasındadır; 2. boyut 5 eleman taşır. Boyut numarasını ikinci parametreyle verdiğinize dikkat edin.
Range.Value ile alınan dizinin satır alt sınırı 1, sütun alt sınırı 1 olarak yazılır; yani indisler 1'den başlar. Split dizisinin alt sınırı ise 0 değerindedir. A2:C6 aralığındaki satır sayısı 5 olarak hesaplanır. Bu fark yüzünden bir diziyi gezerken 0 ya da 1 varsaymak yerine LBound kullanmak daha güvenlidir.
Döngü, dizinin ilk elemanından son elemanına kadar çalışır. Ocak ayı için kümülatif değer 12500, Mart ayı için 40550, Haziran ayı için 91050 olarak yazılır. Aralığın boyutu değişse bile döngü sınırlarını elle düzeltmeniz gerekmez.
Söz dizimi
İşlevin söz dizimi şöyledir:LBound(arrayname, [dimension])
- arrayname: Alt sınırı öğrenilecek dizinin adı; zorunludur. Dizi, sabit boyutlu ya da bellekte yer ayrılmış dinamik bir dizi olmalıdır.
- dimension: Alt sınırı istenen boyutun numarası; isteğe bağlıdır, varsayılanı 1'dir. 1 ilk boyutu (Range.Value dizilerinde satırlar), 2 ikinci boyutu (sütunlar) ifade eder.
Alt sınırı belirleyen etkenler
Alt sınır her zaman 0 ya da 1 değildir; dizinin nasıl oluşturulduğuna bağlıdır:- Dim a(5): Alt sınır varsayılan olarak 0'dır; dizi 0'dan 5'e kadar 6 eleman içerir.
- Dim a(1 To 12): To sözcüğü ile alt sınırı kendiniz belirlersiniz; negatif değerler de kullanılabilir, örneğin (-2 To 2).
- Option Base 1: Modülün başına yazılırsa To kullanılmadan tanımlanan dizilerin ve Array işlevinin alt sınırı 1 olur.
- Range.Value: Bir hücre aralığını diziye aktardığınızda dizi her zaman iki boyutludur ve Option Base ne olursa olsun alt sınırı 1'dir.
- Split: Döndürdüğü dizi her zaman 0 tabanlıdır; Option Base bunu değiştirmez.
- ReDim: Dinamik dizinin sınırlarını yeniden belirler; böylece alt sınır da değişebilir.
UBound ile birlikte kullanım
Diziyi baştan sona gezmenin güvenli yolu, sınırları sabit sayı yazmak yerine işlevlerden almaktır:
VBA
3 satır
For i = LBound(dizi) To UBound(dizi)
' dizi(i) ile işlem yapın
Next i
1. Farklı tanımların alt sınırları
Aşağıdaki makro dört farklı dizi tanımının alt ve üst sınırını örnek sayfaya yazar. Kodu standart bir modüle (Ekle > Modül (Insert > Module)) yapıştırın ve AltSinirlariYaz makrosunu örnek sayfa etkinken çalıştırın.
VBA
23 satır
Option Explicit
Sub AltSinirlariYaz()
Dim a(5) As String ' 0 ile 5 arası
Dim b(1 To 12) As Double ' 1 ile 12 arası
Dim c(-2 To 2) As Integer ' -2 ile 2 arası
Dim d(1 To 3, 0 To 4) As Long ' iki boyutlu dizi
Dim ws As Worksheet
Set ws = ActiveSheet
Yaz ws, 2, LBound(a), UBound(a)
Yaz ws, 3, LBound(b), UBound(b)
Yaz ws, 4, LBound(c), UBound(c)
Yaz ws, 5, LBound(d, 1), UBound(d, 1) ' 1. boyut
Yaz ws, 6, LBound(d, 2), UBound(d, 2) ' 2. boyut
End Sub
Private Sub Yaz(ByVal ws As Worksheet, ByVal satir As Long, ByVal alt As Long, ByVal ust As Long)
ws.Cells(satir, 3).Value = alt
ws.Cells(satir, 4).Value = ust
ws.Cells(satir, 5).Value = ust - alt + 1 ' eleman sayısı
End Sub
LBound
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Dizi | Tanım | Alt Sınır | Üst Sınır | Eleman Sayısı |
| 2 | a | Dim a(5) | 0 | 5 | 6 |
| 3 | b | Dim b(1 To 12) | 1 | 12 | 12 |
| 4 | c | Dim c(-2 To 2) | -2 | 2 | 5 |
| 5 | d (1. boyut) | Dim d(1 To 3, 0 To 4) | 1 | 3 | 3 |
| 6 | d (2. boyut) | Dim d(1 To 3, 0 To 4) | 0 | 4 | 5 |
Dizi SınırlarıExcelDepo v1.0.0
2. Range.Value ve Split dizileri
Bu örnek, hücre aralığından alınan dizinin her zaman 1 tabanlı, Split ile üretilen dizinin ise 0 tabanlı olduğunu gösterir. Kodu standart bir modüle yapıştırın ve RangeVeSplitSinirlari makrosunu çalıştırın.
VBA
22 satır
Option Explicit
Sub RangeVeSplitSinirlari()
Dim v As Variant
Dim parcalar() As String
Dim ws As Worksheet
Set ws = ActiveSheet
' Aralık, iki boyutlu ve 1 tabanlı diziye aktarılır
v = ws.Range("A2:C6").Value
ws.Range("E2").Value = LBound(v, 1) ' satır alt sınırı
ws.Range("E3").Value = LBound(v, 2) ' sütun alt sınırı
' Split her zaman 0 tabanlı dizi döndürür
parcalar = Split("Ankara,İzmir,Bursa", ",")
ws.Range("E4").Value = LBound(parcalar)
' Satır sayısı = üst sınır - alt sınır + 1
ws.Range("E5").Value = UBound(v, 1) - LBound(v, 1) + 1
End Sub
LBound
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Şehir | Tutar | Bilgi | Sonuç |
| 2 | Klavye | Ankara | 450,00 | Value dizisi 1. boyut alt sınırı | 1 |
| 3 | Fare | İzmir | 230,00 | Value dizisi 2. boyut alt sınırı | 1 |
| 4 | Monitör | Bursa | 3.200,00 | Split dizisi alt sınırı | 0 |
| 5 | Kulaklık | Adana | 680,00 | Value dizisi satır sayısı | 5 |
| 6 | Yazıcı | Konya | 2.150,00 |
Satış TablosuExcelDepo v1.0.0
3. Alt sınırdan bağımsız döngü
Aşağıdaki makro, B2:B7 aralığındaki aylık satışları diziye alır ve For döngüsünü LBound ile UBound üzerinden kurarak C sütununa kümülatif toplamı yazar. Kodu standart bir modüle yapıştırıp KumulatifToplam makrosunu çalıştırın.
VBA
18 satır
Option Explicit
Sub KumulatifToplam()
Dim v As Variant
Dim i As Long
Dim toplam As Double
Dim ws As Worksheet
Set ws = ActiveSheet
v = ws.Range("B2:B7").Value
' Sınırlar sabit yazılmaz; diziden okunur
For i = LBound(v, 1) To UBound(v, 1)
toplam = toplam + v(i, 1)
' C2 hücresinden başlayarak i. elemanın karşısına yaz
ws.Range("C2").Offset(i - LBound(v, 1), 0).Value = toplam
Next i
End Sub
LBound
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ay | Satış | Kümülatif |
| 2 | Ocak | 12.500 | 12500 |
| 3 | Şubat | 14.800 | 27300 |
| 4 | Mart | 13.250 | 40550 |
| 5 | Nisan | 16.900 | 57450 |
| 6 | Mayıs | 15.400 | 72850 |
| 7 | Haziran | 18.200 | 91050 |
Aylık ToplamExcelDepo v1.0.0
Kullanırken dikkat edin
- Yer ayrılmamış dinamik dizi: Boyutu henüz ReDim ile belirlenmemiş ya da Erase ile boşaltılmış dinamik dizi için LBound çağrısı 9 numaralı hata verir. Gerekirse hatayı On Error Resume Next ile yakalayıp Err.Number değerini denetleyin.
- Boyut numarasını doğru verin: Dizide olmayan bir boyut numarası (örneğin tek boyutlu dizide 2) hataya yol açar. Range.Value ile alınan dizi, tek sütunluk ya da tek satırlık aralık olsa bile iki boyutludur; bu yüzden v(i) değil v(i, 1) biçiminde erişmeniz gerekir.
- Option Base etkisi: Option Base 1 yalnız yazıldığı modülü etkiler ve To ile sınırı açıkça verilmiş dizilere dokunmaz. Split ve Range.Value dizilerinin alt sınırını da değiştirmez. Karışıklığı önlemek için sınırları To ile açıkça yazmanız veya LBound kullanmanız önerilir.
- Parametre dizisi ve Variant: Bir işleve dizi aktarırken parametreyi Variant olarak tanımlayıp LBound ve UBound ile gezerseniz, işleviniz hangi tabanlı diziyle çağrılırsa çağrılsın doğru çalışır. Bir değişkenin dizi olup olmadığını önceden IsArray ile denetleyebilirsiniz.
- İlgili konular:
- UBound: Dizinin üst sınırını verir.
- Option Base: Varsayılan alt sınırı 0 ya da 1 yapar.
- Dim ve ReDim: Dizi tanımlar ve yeniden boyutlandırır.
- Array ve Split: Değerlerden dizi üretir.
- Range.Value: Hücre aralığını iki boyutlu diziye aktarır.
- IsArray ve Erase: Dizi denetimi ve boşaltma.
- For...Next: Dizi elemanlarını gezmek için kullanılan döngü.
- SATIRSAY ve SÜTUNSAY: Çalışma sayfasında aralığın satır ve sütun sayısını veren işlevler.