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

eerste en laatste cel van een bereik uitvragen

Status
Niet open voor verdere reacties.

Ginger

Terugkerende gebruiker
Lid geworden
29 dec 2006
Berichten
2.972
Vanmiddag liep ik tegen een kleinigheidje (in VBA) aan waarbij ik niet precies wist hoe eea op te lossen. Vervolgens is het wel via een 'work around' opgelost, maar 't laat me toch niet los!:confused:
Helaas heb ik hier ff niet de code bij de hand (was op m'n werk) maar ik zal 't zo goed mogelijk proberen uit te leggen. Via een application.inputbox laat ik een gebruiker een bereik selecteren. Via de Set functie (is Set een functie??:)) geef ik dit bereik op aan een 'als range gedefinieerde variabele'. Nou wilde ik via een msgbox in de code de gebruiker melden wat de startcel en wat de eindcel is (bij de aanvang een melding met de startcel en bij het einde van de code een melding met de eindcel). Dat hoopte ik te bereiken via (zoals je dat doet bij Array's) de Lbound en Ubound. Uiteraard begon de debugger direct te mekkeren dat dit niet kon...:(
Het is nu opgelost door het bereik te splitsen op de dubbele punt, maar dat lijkt me nogal omslachtig.
Wie weet de eenvoudige methode om de 1e en de laatste cel uit een bereik te halen?
(neem als voorbeeld: A5:A75)

Dank voor de hulp alvast...

Groet, Leo

(leuk om óók 'ns een eigen vraag te hebben...:D)
 
Hoi Leo

Ah zo, jij wilt eens aan de andere kant gaan piepen? :eek::D

Als het een aangesloten bereik is, kom je met dit wel weg.

Code:
Sub voorleo()

    Dim r As Range
    
    Set r = Range("A5:A75")
    
    MsgBox "beginrij = " & r.Row
    
    MsgBox "eindrij = " & r.Row + r.Rows.Count - 1

End Sub

Als er gaten in het bereik zijn, wordt het lastiger.

Wigi
 
Update:

Voor niet-aaneengesloten bereiken:

Code:
Sub voorLeo()

    Dim r As Range
    Dim LastRow As Long
    Dim rTemp As Range
    Dim rMax As Long
    
    Set r = Selection

    If TypeName(Selection) = "range" Then
        MsgBox "beginrij = " & r.Row
        
        If r.Areas.Count = 1 Then
            
            MsgBox "eindrij = " & r.Row + r.Rows.Count - 1
            
        Else
        
            If WorksheetFunction.CountA(r) > 0 Then
                MsgBox "eindrij = " & r.Find(What:="*", After:=r.Cells(1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            Else
                For Each rTemp In r
                    If rTemp.Row > rMax Then rMax = rTemp.Row
                Next
                MsgBox "eindrij = " & rMax
            End If
            
        End If
    End If

End Sub

Dit lijkt mij redelijk robuuste code, enkel is de lus op het einde niet echt een zaligmakende oplossing.

Wigi
 
Wigi zei:
Ah zo, jij wilt eens aan de andere kant gaan piepen?
Och.... een mens moet toch 'ns andere dingen uitproberen??? :D:D

Maar.... Alvast bedankt voor je antwoord. Helaas kan het dus NIET simpel gedaan worden met een 'enkele' functie. Ik hoopte dat er zoiets bestond als FirstOfRange en LastOfRange...:o Want ik zoek eigenlijk het 1e en laatste celadres (om het je lekker ff lastig te maken!:rolleyes:)

Ik dacht het dus met jouw idee gevonden te hebben (zie aangepaste code) maar als je dan de range over 2 kolommen laat lopen, gaat het weer mis! Ook de 2e msgbox geeft aan dat er kolom A gebruikt wordt (terwijl dat nu toch echt B moest zijn)

Code:
Sub voorleo()

    Dim r As Range
    
    Set r = Range("A5:B75")
    
    MsgBox "begincel = " & Cells(r.Row, r.Column).Address
    
    MsgBox "eindcel = " & Cells(r.Row + r.Rows.Count - 1, r.Column).Address

End Sub
Mocht je nog een oplossinkje te binnen schieten, dan ben je meer dan welkom. Maar doe aub niet te veel moeite voor me...

Groet, Leo

EDIT: Ik zie net na het plaatsen van deze reply dat je alweer een extra codeblok verzonnen had... Ziet er uiteraard weer schitterend uit maar is het dus nog net niet helemaal. Bij de weg... Het is ten alle tijden (ten allen tijde.... te allen tijden... wat is goed???) altijd een aaneengesloten range van cellen.
Ik zal je vrees ik vanavond géén reactie meer geven, want ik moet mijn computerhok annex logeerkamer afstaan... ;-((
 
Laatst bewerkt:
Code:
MsgBox "eindcel = " & Cells(r.Row + r.Rows.Count - 1, r.Column + r.Columns.Count - 1).Address

Wigi
 
...Maar ja... Als jij ZO SNEL blijft antwoorden, dan is een snel antwoord nog net mogelijk...:D:thumb:
Dit is de oplossing! Niet in een enkele standaard functie, maar wel prima werkend.

Groet, Leo

P.s. Mocht je ooit op een van je andere fora nog een enkele functie tegenkomen?... Gaarne! (ook al was het maar voor mijn leergierigheid)
 
Laatst bewerkt:
P.s. Mocht je ooit op een van je andere fora nog een enkele functie tegenkomen?... Gaarne! (ook al was het maar voor mijn leergierigheid)

Ik zal er op letten als ik het niet vergeet.
 
Ik besef dat dit een oude thread is, maar zelf gebruik ik onderstaande code om het probleem op te lossen. Ik plaats deze hier in deze thread zodanig dat anderen er misschien ook iets aan hebben (bv. bij een zoekopdracht).

Algemene (voorbeeld)code om het adres van de eerste en laatste cel van een range te kennen. Deze range moet dan niet bestaan uit een aaneengesloten gebied:

Sub CelAddress()

Dim rngA As Range

Set rngA = Range("E5:G23,Z1:Z55") 'geen aaneengesloten range

Debug.Print rngA.Cells(1).Address 'eerste cel adres

Debug.Print rngA.Areas(rngA.Areas.Count).Cells(rngA.Areas(rngA.Areas.Count).Cells.Count).Address 'laatste cel adres

End Sub

Indien de range echter uit een aangesloten bereik bestaat kan je ook deze (vereenvoudigde) code gebruiken voor het adres van de laatste cel:


Code:
Code:
Sub CelAddress()

Dim rngA As Range

Set rngA = Range("E5:G23") 'aaneengesloten range

Debug.Print rngA.Cells(1).Address 'eerste cel adres

Debug.Print rngA.Cells(rngA.Cells.Count).Address 'laatste cel adres bij 1 area

End Sub

Al bij al relatief korte en eenvoudige code, al zou een LastCell statement of iets dergelijks nog makkelijker zijn :)
 
Finch, Oud of niet... Móóie aanvulling! :thumb: Die gaat bij het speciale bestandje met dit soort toepassingen.;)

Groet, Leo
 
Voor de verzamelaars

als het om de inhoud gaat

Code:
sq=range("A5:A47")
1e cel:
Code:
c0=sq(1,1)
laatste cel
Code:
c1=sq(ubound(sq),1)
of
Code:
c2=sq(uboundsq),ubound(sq,2))

Als het om het adres gaat

1e gevulde cel
Code:
c0=range("A5:A47").specialcells(xlcelltypeconstants).cells(1).address

laatste gevulde cel
Code:
with range("A5:A47").specialcells(xlcelltypeconstants)
  c1=.cells(.cells.count).address
end with

Als het om de inhoud gaat

1e gevulde cel
Code:
c0=range("A5:A47").specialcells(xlcelltypeconstants).cells(1).value

laatste gevulde cel
Code:
with range("A5:A47").specialcells(xlcelltypeconstants)
  c1=.cells(.cells.count).value
end with
 
Snb, ook jij dank voor deze waardevolle aanvulling! Da's toch leuk... Staat je topic een jaar 'in de koelkast', worden er toch allemaal nieuwe inzichten toegevoegd.

Groet, Leo
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan