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.
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.
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.
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.
Söz dizimi
UBound işlevinin söz dizimi şöyledir: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.
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.
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.| A | B | C | |
|---|---|---|---|
| 1 | Sipariş Ürünleri | Ürün Sayısı | Son Ürün |
| 2 | Kalem,Defter,Silgi | 3 | Silgi |
| 3 | Dosya,Klasör,Zımba,Delgeç | 4 | Delgeç |
| 4 | Toner | 1 | Toner |
| 5 | Kağıt, Bant, Makas, Cetvel, Kalemtraş | 5 | Kalemtraş |
Sipariş ListesiExcelDepo v1.0.0
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ay | Satış | Maliyet | Bilgi | Değer |
| 2 | Ocak | 45.000 | 31.000 | Satır sayısı | 4 |
| 3 | Şubat | 52.000 | 36.500 | Sütun sayısı | 3 |
| 4 | Mart | 61.000 | 40.200 | Alt sınır | 1 |
| 5 | Nisan | 58.000 | 39.800 |
Aylık SatışExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Personel | Satış | Hedefi Aşanlar | Adet |
| 2 | Ahmet Yılmaz | 62.000 | Ahmet Yılmaz | 4 |
| 3 | Elif Kaya | 48.500 | Mehmet Demir | |
| 4 | Mehmet Demir | 75.000 | Ayşe Çelik | |
| 5 | Ayşe Çelik | 51.000 | Zeynep Arslan | |
| 6 | Can Öztürk | 39.000 | ||
| 7 | Zeynep Arslan | 58.000 |
Personel SatışExcelDepo v1.0.0
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.