Özellik ikonu

LBound

İndirme izni yok

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.

Söz dizimi​

İşlevin söz dizimi şöyledir:
VBA
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.
İşlev Long türünde bir tam sayı döndürür. Dizide bulunmayan bir boyut numarası verirseniz ya da yer ayrılmamış bir dinamik diziyi sorarsanız 9 numaralı "Subscript out of range" (Dizin kapsam dışında) hatası oluşur.

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
İ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.

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.
ABCDE
1DiziTanımAlt SınırÜst SınırEleman Sayısı
2aDim a(5)056
3bDim b(1 To 12)11212
4cDim c(-2 To 2)-225
5d (1. boyut)Dim d(1 To 3, 0 To 4)133
6d (2. boyut)Dim d(1 To 3, 0 To 4)045
Dizi SınırlarıExcelDepo v1.0.0
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.

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.
ABCDE
1ÜrünŞehirTutarBilgiSonuç
2KlavyeAnkara450,00Value dizisi 1. boyut alt sınırı1
3Fareİzmir230,00Value dizisi 2. boyut alt sınırı1
4MonitörBursa3.200,00Split dizisi alt sınırı0
5KulaklıkAdana680,00Value dizisi satır sayısı5
6YazıcıKonya2.150,00
Satış TablosuExcelDepo v1.0.0
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.

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.
ABC
1AySatışKümülatif
2Ocak12.50012500
3Şubat14.80027300
4Mart13.25040550
5Nisan16.90057450
6Mayıs15.40072850
7Haziran18.20091050
Aylık ToplamExcelDepo v1.0.0
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.

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.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
9
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst