Özellik ikonu

UBound

İndirme izni yok

Genel Bakış

UBound (Upper Bound), VBA'da bir dizinin belirtilen boyutundaki en büyük indeks numarasını döndüren işlevdir. Dizi üzerinde döngü kurarken son elemanın yerini bulmak, dizinin kaç elemanlı olduğunu hesaplamak ve dinamik dizileri güvenle işlemek için kullanılır. Genellikle alt sınırı veren LBound işleviyle birlikte çalışır.

Söz dizimi​

UBound işlevinin söz dizimi şöyledir:
VBA
UBound(arrayname, [dimension])
  • arrayname: Üst sınırı öğrenilecek dizinin adı; zorunludur.
  • dimension: Üst sınırı istenen boyutun numarası; isteğe bağlıdır. Varsayılanı 1'dir (ilk boyut). Birinci boyut için 1, ikinci boyut için 2 yazılır.
İşlev Long türünde bir sayı döndürür. Dizinin eleman sayısını bulmak için, alt sınır 0 ise sonuca 1 eklemek gerekir; genel formül üst sınır eksi alt sınır artı 1'dir.

Alt sınır ve dizi türlerine göre davranış​

Üst sınırın anlamı dizinin alt sınırına bağlıdır. Bu nedenle farklı kaynaklardan gelen dizilerde sonucu yorumlarken dikkatli olun:
  • Dim a(5): Alt sınır varsayılan olarak 0'dır, üst sınır 5 olur ve dizi 6 elemanlıdır. Option Base 1 yazılırsa alt sınır 1 olur.
  • Dim a(2 To 8): Alt ve üst sınır açıkça belirtilmiştir; UBound 8 döndürür.
  • Split işlevi: Option Base ayarından bağımsız olarak her zaman 0 tabanlı dizi üretir. Boş metinde UBound -1 döndürür.
  • Range.Value: Bir aralığın Value özelliğinden alınan dizi her zaman 1 tabanlı ve iki boyutludur: önce satır, sonra sütun gelir. Tek sütunlu aralık bile iki boyutlu dizidir.
  • Array işlevi: Alt sınır Option Base ayarına göre 0 ya da 1 olur.

Hatalar ve dinamik dizilerle kullanım​

Aşağıdaki durumlarda UBound çalışma zamanı hatası 9 (Subscript out of range, Dizin kapsam dışında) verir:
  • Boyut numarası fazla: Dizide olmayan bir boyut numarası verirseniz hata oluşur. Örneğin tek boyutlu dizide boyut olarak 2 yazmak hatalıdır.
  • Boyutlandırılmamış dinamik dizi: Dim a() As String ile tanımlanıp henüz ReDim yapılmamış bir diziye UBound uygulanırsa hata verir.
Dinamik dizi büyütürken ReDim Preserve ile mevcut elemanları koruyarak yeni üst sınır verebilirsiniz. Çok boyutlu dizilerde Preserve kullanıldığında yalnızca son boyut değiştirilebilir. Dizi üzerinde güvenli döngü için For i = LBound(a) To UBound(a) kalıbını tercih edin.

1. Split sonucundaki öğe sayısını bulma​

A sütununda virgülle ayrılmış ürün adları var. Makro her satırı Split ile parçalar, UBound ile öğe sayısını B sütununa ve son ürünü C sütununa yazar. Kodu standart bir modüle yapıştırın.
VBA 19 satır
Option Explicit

Sub OgeSayisiniYaz()
    Dim ws As Worksheet
    Dim son As Long, i As Long
    Dim parcalar() As String

    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To son
        parcalar = Split(ws.Cells(i, 1).Value, ",")
        ' Split 0 tabanlı olduğu için öğe sayısı UBound + 1'dir
        If UBound(parcalar) >= 0 Then
            ws.Cells(i, 2).Value = UBound(parcalar) + 1
            ws.Cells(i, 3).Value = Trim(parcalar(UBound(parcalar)))
        End If
    Next i
End Sub
UBound
Formülünü incelemek için bir hücre seçin.
ABC
1Sipariş ÜrünleriÜrün SayısıSon Ürün
2Kalem,Defter,Silgi3Silgi
3Dosya,Klasör,Zımba,Delgeç4Delgeç
4Toner1Toner
5Kağıt, Bant, Makas, Cetvel, Kalemtraş5Kalemtraş
Sipariş ListesiExcelDepo v1.0.0
Split işlevi 0 tabanlı dizi döndürdüğü için öğe sayısı UBound + 1 ile bulunur. İlk satırda öğe sayısı B2 hücresinde 3, son ürün ise C2 hücresinde Silgi olarak görünür. İkinci satırın sonucu B3 hücresinde 4, tek öğeli satırın sonucu B4 hücresinde 1 değerindedir. Son satırda B5 hücresi 5 değerini taşır; Trim kullanıldığı için C5 hücresindeki Kalemtraş adının başında boşluk kalmaz.

2. Range.Value dizisinin boyutları​

Makro, A2:C5 aralığını bir diziye alır ve UBound ile LBound kullanarak dizinin satır ve sütun sayısını ile alt sınırını D ve E sütunlarına yazar. Kodu standart bir modüle yapıştırın.
VBA 19 satır
Option Explicit

Sub DiziBoyutlari()
    Dim ws As Worksheet
    Dim v As Variant

    Set ws = ActiveSheet
    ' Aralık değeri 1 tabanlı, iki boyutlu bir dizi olarak gelir
    v = ws.Range("A2:C5").Value

    ws.Range("D2").Value = "Satır sayısı"
    ws.Range("E2").Value = UBound(v, 1)

    ws.Range("D3").Value = "Sütun sayısı"
    ws.Range("E3").Value = UBound(v, 2)

    ws.Range("D4").Value = "Alt sınır"
    ws.Range("E4").Value = LBound(v, 1)
End Sub
UBound
Formülünü incelemek için bir hücre seçin.
ABCDE
1AySatışMaliyetBilgiDeğer
2Ocak45.00031.000Satır sayısı4
3Şubat52.00036.500Sütun sayısı3
4Mart61.00040.200Alt sınır1
5Nisan58.00039.800
Aylık SatışExcelDepo v1.0.0
A2:C5 aralığı 4 satır ve 3 sütundur. UBound(v, 1) satır sayısını verir; sonuç E2 hücresinde 4 olarak görünür. UBound(v, 2) sütun sayısını verir ve E3 hücresinde 3 değerindedir. Aralıktan gelen dizi 1 tabanlı olduğundan alt sınır E4 hücresinde 1 olarak yazılır; bu yüzden üst sınır doğrudan eleman sayısına eşittir.

3. ReDim Preserve ile büyüyen dizi​

Makro, satışı 50.000 ve üzerinde olan personelin adlarını dinamik bir diziye toplar. Dizi her eşleşmede ReDim Preserve ile büyütülür; sonunda LBound ve UBound ile dizideki adlar C sütununa dökülür, adet D2 hücresine yazılır. Kodu standart bir modüle yapıştırın.
VBA 29 satır
Option Explicit

Sub HedefiAsanlariListele()
    Dim ws As Worksheet
    Dim adlar() As String
    Dim n As Long, i As Long, son As Long

    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    n = -1 ' Dizi henüz boş

    For i = 2 To son
        If ws.Cells(i, 2).Value >= 50000 Then
            n = n + 1
            ReDim Preserve adlar(0 To n)
            adlar(n) = ws.Cells(i, 1).Value
        End If
    Next i

    ' Dizi boyutlandırılmadıysa UBound hata verir; önce n kontrol edilir
    If n >= 0 Then
        For i = LBound(adlar) To UBound(adlar)
            ws.Cells(i + 2, 3).Value = adlar(i)
        Next i
        ws.Range("D2").Value = UBound(adlar) + 1
    Else
        ws.Range("D2").Value = 0
    End If
End Sub
UBound
Formülünü incelemek için bir hücre seçin.
ABCD
1PersonelSatışHedefi AşanlarAdet
2Ahmet Yılmaz62.000Ahmet Yılmaz4
3Elif Kaya48.500Mehmet Demir
4Mehmet Demir75.000Ayşe Çelik
5Ayşe Çelik51.000Zeynep Arslan
6Can Öztürk39.000
7Zeynep Arslan58.000
Personel SatışExcelDepo v1.0.0
Dizi, koşulu sağlayan her personel için bir eleman büyür. Listenin ilk adı C2 hücresinde Ahmet Yılmaz olarak görünür, ikinci ad C3 hücresinde Mehmet Demir değerindedir. Dizideki toplam kişi sayısı UBound + 1 ile bulunup D2 hücresine yazılır; bu hücrede 4 değeri görünür. Hiç eşleşme olmasaydı dizi boyutlandırılmamış kalacağı ve UBound hata vereceği için kod, dizi kullanılmadan önce n değerini denetler.

Kullanırken dikkat edin​

  • Eleman sayısı için 1 ekleyin: UBound eleman sayısını değil, en büyük indeksi verir. Dizi 0 tabanlıysa eleman sayısı UBound + 1'dir. Genel ve güvenli formül UBound eksi LBound artı 1'dir.
  • Boş diziyi önceden denetleyin: Boyutlandırılmamış dinamik dizide UBound hata 9 verir. Dizi kullanmadan önce bir sayaç ya da bayrak değişkeniyle dolu olup olmadığını kontrol edin. Split ile üretilen boş dizide ise UBound -1 döndürür; bu durumda ilk elemana erişmeyin.
  • Boyut numarasını doğru yazın: İkinci parametre 1'den başlar ve dizinin boyut sayısını aşamaz. Range.Value dizisinde 1 satırı, 2 sütunu temsil eder; tek sütunlu aralık bile iki boyutlu dizi olur.
  • Preserve kısıtı: ReDim Preserve ile çok boyutlu dizide yalnızca son boyutun üst sınırı değiştirilebilir. Bu nedenle satır sayısı bilinmiyorsa tabloyu tersine (sütun sayısı sabit, son boyut satır olacak şekilde) kurmak gerekebilir.
  • Alt sınırı varsaymayın: Split her zaman 0 tabanlı, Range.Value her zaman 1 tabanlı, Array işlevi ise Option Base ayarına bağlı dizi üretir. Döngülerde sabit 0 ya da 1 yazmak yerine LBound ve UBound kullanın.
  • İlgili konular:
    • LBound: Dizinin alt sınırını döndürür.
    • ReDim ve ReDim Preserve: Dinamik dizinin boyutunu değiştirir.
    • Dim: Dizi tanımlama deyimi.
    • Split: Metni ayırıcıya göre diziye böler.
    • Join: Dizi elemanlarını tek metinde birleştirir.
    • Array: Değerlerden Variant dizi oluşturur.
    • Option Base: Dizilerin varsayılan alt sınırını belirler.
    • Erase: Diziyi temizler.
    • IsArray: Bir değişkenin dizi olup olmadığını denetler.
    • Range.Value: Aralığı iki boyutlu diziye aktarır.
    • DİZİ.BİRLEŞTİR ve SATIR gibi işlevler: Çalışma sayfası tarafında benzer sayım işleri için kullanılır; örneğin ÇOKEĞERSAY, BAĞ_DEĞ_DOLU_SAY.
Ö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
10
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst