• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Filter op Array in VBA: waarom geeft Ubound -1 terug?

Status
Niet open voor verdere reacties.

Excelbat

Gebruiker
Lid geworden
23 mrt 2012
Berichten
402
Hi All,

Eerlijk gejat van internet en aangepast naar wat ik wil.
Ik probeer echter dit soort dingen ook te begrijpen, en met de helpfunctie van Microsoft (F1) kom ik er ook niet uit.
Waarom geeft Ubound -1 terug ??? En daarmee samenhangende vraag: waarom LBound 0 ???

Code:
Sub Filter_Match()
Dim strNames As Variant, strSubNames As Variant
strNames = Array("Sheet4", "Sheet5", "Sheet1")

For J = ThisWorkbook.Sheets.Count To 1 Step -1
        
        strSubNames = Filter(strNames, ThisWorkbook.Sheets(J).Name)
        
        If UBound(strSubNames) - LBound(strSubNames) + 1 > 0 Then
            Debug.Print "Well done" & " " & ThisWorkbook.Sheets(J).Name & " " & UBound(strSubNames) & " " & LBound(strSubNames)
        Else
            Debug.Print "Delete" & " " & ThisWorkbook.Sheets(J).Name & " " & UBound(strSubNames) & " " & LBound(strSubNames)
        End If
Next J
 
End Sub

Als je de code handmatig doorloopt met F8, en het 'direct venster' zichtbaar hebt, dan zie je wat ik bedoel.
In mijn simpele beleving moet Ubound altijd een positief getal zijn groter dan 0.

Greetz/Excelbat
 

Bijlagen

  • FilterOpArrayInVBA.xlsb
    21,6 KB · Weergaven: 32
Ubound geeft -1 terug als de array geen elementen bevat.
In dit geval dus als de Filter functie geen resultaat terug geeft.
 
Beter niet jatten
Code:
Sub VenA()
  ar = Array("Sheet4", "Sheet5", "Sheet1")
    For Each sh In Sheets
      Debug.Print IIf(IsNumeric(Application.Match(sh.Name, ar, 0)), "Well done ", "Delete ") & sh.Name
    Next sh
End Sub

Over array's is een heleboel te vinden op de site van snb. http://www.snb-vba.eu/VBA_Arrays_en.html
 
Laatst bewerkt:
#2 Thanx Edmoor,
Ik heb naar aanleiding hiervan wat gegoogeld,en het schijnt dus zo te zijn dat als Lbound 0 is, Ubound automatisch -1 wordt. Wat in mijn beleving niet logisch is, want L(ow)bound zou lager moeten zijn dan U(pper)bound.
#3 Thanx VenA,
Soortgelijke versie had ik inmiddels ook al (hoewel die van u iets korter is), maar ik vind het leuk om de vele wegen naar Rome te onderzoeken, vandaar mijn specifieke vraag over Ubound #1

Greetz/Excelbat
 
LBound is niet interessant, die is altijd 0, dus niet relevant. (array is zero-based)
De Ubound is dat wel, Ubound+1= het aantal elementen in die array die voldoen aan je voorwaarden.
Dus in geval UBound=-1 is ubound+1=0, dus geen element voldoet, etc.
zie https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/filter-function
de laatste 2 parameters zijn optioneel, dus als je bovenstaande leest, dan kan je kiezen :
- met de 3e parameter op wel of niet aanwezig
- met de 4e parameter op de manier van vergelijken (bv. vbtextcompare=hoofdletterongevoelig)
 
Een array begint altijd bij 0, tenzij je anders opgeeft.
Bijvoorbeeld, Dim Subnames(1 To 9) As String
Of met Option Base 1
In dit geval zal LBound ook 1 terug geven in plaats van 0.
 
Laatst bewerkt:
Het betekent alleen dat de wiskundige systematiek achter de Lbound en Ubound anders is dan wat jij verwacht.
Als je met zo'n taal als VBA wil gaan werken zul je je de systematiek (ik noem het expres geen logica) van die taal eigen moeten maken.
Ubound zegt iets over de Array in totaliteit ( geen elementen (-1) of x elementen volgens een 10- tallig stelsel met als eerste getal 0)
Lbound is niet dynamisch en zegt alleen welk item als 'eerste' wordt beschouwd als de array überhaupt waarden bevat.

Code:
msgbox lbound(range("A1:K10").value)
Msgbox lbound(array("aaa","sss"))
 
Laatst bewerkt:
Altijd goed om de verschillende wegen naar Rome te bewandelen. Een leuke om eens te bekijken.

Code:
Sub tst()
  x = Split("a")
  y = "a"
  If IsArray(x) Then Debug.Print LBound(x) & " "; UBound(x)
  If IsArray(y) Then Debug.Print LBound(y) & " "; UBound(y) Else Debug.Print y
End Sub

[Edit] volgens mij is de server weer zo supersnel dat ik een aantal reacties gemist heb.:rolleyes:
 
Laatst bewerkt:
#5 en #6: ik gebruik eigenlijk altijd Option Base 1, want op school heb ik leren tellen van 1 t/m 10, en niet van 0 t/m 9 :)
Het gekke is dat in de VBA van #1 Ubound toch -1 terug geeft, en Lbound toch 0.
Zal wel iets te maken hebben met de wondere wereld van Microsoft.

Greetz/Excelbat
 
Als Ubound -1 terug geeft is dat de indicatie dat de array geen elementen bevat, of je nu bij 0 of bij 1 begint.
 
#8: ook min of meer duidelijk met behulp van de helpfunctie F1. Split "Returns a zero-based, one-dimensional array containing a specified number of substrings."

Greetz/Excelbat
 
Je hebt je nooit afgevraagd waarom we zeggen met een 10-tallig stelsel te werken en als je bij 1 begint te tellen het eerste 'tien'tal slechts 9 elementen bevat: 1,2,3,4,5,6,7,8,9.
Als je dan toch zo'n aanhanger bent van 'logica' (ik zou het liever consistente systematiek noemen), leer je jezelf aan met nul te beginnen.
 
#14 Jawel, ik vraag mezelf best wel eens wat af, bijv. als ik naar het nieuws en de televisie luister, en dan vooral het waarheidsgehalte en/of de simpelheid daarvan. Maar dat terzijde.
Eigenlijk zouden we onze kinderen moeten leren tellen van 0 t/m 9.

Greetz/Excelbat
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan