VBA – Bereik.Rij.Count

Ik heb een eenvoudige code geschreven om mijn hachelijke situatie te illustreren.

Sub test()
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("Sheet1")
    Dim k As Long
    k = sh.Range("A1", sh.Range("A1").End(xlDown)).Rows.Count
End Sub

Wat er gebeurt is dit: we tellen de rijen die waarden bevatten die beginnen bij A1. Als het aantal rijen met waarden > 1 de code werkt prima. Als A1 echter de enige cel is die een waarde bevat, is k = 1.048.576, wat volgens mij het maximale aantal rijen is dat in Excel is toegestaan.

Waarom is k = 1 niet?

Foto’s:

EDIT: de oplossing die ik gebruik is de volgende:

Sub test()
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("Sheet1")
    Dim k As Long
    k = sh.Range("A1", sh.Range("A1").End(xlDown)).Rows.Count
    If k = 1048576 Then
        k = 1
    End If
    MsgBox (k)
End Sub

Aangezien k altijd gelijk is aan 1048576 als het aantal rijen met waarden 1 is. Het voelt gewoon een beetje gek om zoiets te moeten doen.


Antwoord 1, autoriteit 100%

Waarschijnlijk is een betere oplossing om van onder naar boven te werken:

k=sh.Range("A1048576").end(xlUp).row

Antwoord 2, autoriteit 25%

U moet in plaats daarvan UsedRangegebruiken als volgt:

Sub test()
    Dim sh As Worksheet
    Dim rn As Range
    Set sh = ThisWorkbook.Sheets("Sheet1")
    Dim k As Long
    Set rn = sh.UsedRange
    k = rn.Rows.Count + rn.Row - 1
End Sub

Het + rn.Row - 1gedeelte is omdat de UsedRange alleen begint bij de eerste rij en kolom die wordt gebruikt, dus als je iets in rij 3 tot en met 10 hebt, maar rij 1 en 2 leeg is , rn.Rows.Countzou 8 zijn


Antwoord 3, autoriteit 8%

CountRows = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count

Antwoord 4, autoriteit 6%

Je zou ook de “Laatste” functie van Ron de Bruin kunnen gebruiken (http:// www.rondebruin.nl/win/s9/win005.htm), werkte bij mij perfect en geeft ook de laatste kolom en cel terug als je wilt. Om de laatste rij te krijgen, gebruik deze zoals

lastRow = Last(1,yourRange)

Ik vond dit best handig.

Function Last(choice As Long, rng As Range)
'Ron de Bruin, 5 May 2008
' 1 = last row
' 2 = last column
' 3 = last cell
    Dim lrw As Long
    Dim lcol As Long
    Select Case choice
    Case 1:
        On Error Resume Next
        Last = rng.Find(What:="*", _
                        After:=rng.Cells(1), _
                        Lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Row
        On Error GoTo 0
    Case 2:
        On Error Resume Next
        Last = rng.Find(What:="*", _
                        After:=rng.Cells(1), _
                        Lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Column
        On Error GoTo 0
    Case 3:
        On Error Resume Next
        lrw = rng.Find(What:="*", _
                       After:=rng.Cells(1), _
                       Lookat:=xlPart, _
                       LookIn:=xlFormulas, _
                       SearchOrder:=xlByRows, _
                       SearchDirection:=xlPrevious, _
                       MatchCase:=False).Row
        On Error GoTo 0
        On Error Resume Next
        lcol = rng.Find(What:="*", _
                        After:=rng.Cells(1), _
                        Lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Column
        On Error GoTo 0
        On Error Resume Next
        Last = rng.Parent.Cells(lrw, lcol).Address(False, False)
        If Err.Number > 0 Then
            Last = rng.Cells(1).Address(False, False)
            Err.Clear
        End If
        On Error GoTo 0
    End Select
End Function

Antwoord 5, autoriteit 6%

Als iemand hier nog eens naar kijkt, kun je dit gebruiken:

Sub test()
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("Sheet1")
    Dim k As Long
    k = sh.Range("A1", sh.Range("A1").End(xlDown).End(xlDown).End(xlUp)).Rows.Count
End Sub

Antwoord 6, autoriteit 3%

Dat is een leuke vraag 🙂

Als je een situatie hebt met 1 cel (A1), is het belangrijk om te bepalen of de tweede gedeclareerde cel niet leeg is (sh.Range("A1").End(xlDown)). Als het waar is, betekent dit dat je bereik uit de hand is gelopen 🙂 Kijk naar onderstaande code:

Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Arkusz1")
Dim k As Long
If IsEmpty(sh.Range("A1").End(xlDown)) = True Then
    k = 1
Else
    k = sh.Range("A1", sh.Range("A1").End(xlDown)).Rows.Count
End If

Antwoord 7, autoriteit 3%

k = sh.Range("A2", sh.Range("A1").End(xlDown)).Rows.Count

of

k = sh.Range("A2", sh.Range("A1").End(xlDown)).Cells.Count

of

k = sh.Range("A2", sh.Range("A1").End(xlDown)).Count

Antwoord 8

Heb je het geprobeerd:-

Sub test()
    k = Cells(Rows.Count, "A").End(xlUp).Row
    MsgBox (k)
End Sub

De /only/ vangst is dat als er geen gegevens zijn, het nog steeds 1 retourneert.


Antwoord 9

Dit werkt voor mij vooral bij het filteren van draaitabellen wanneer ik het aantal cellen met gegevens in een gefilterde kolom wil. Verminder kdienovereenkomstig (k - 1)als u een koprij hebt om te filteren:

k = Sheets("Sheet1").Range("$A:$A").SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants).Count

Antwoord 10

De beste oplossing is om

Cells(Rows.Count, 1).End(xlUp).Row

Omdat het het aantal cellen telt totdat deze de laatste is geschreven.

In tegenstelling tot

Range("A1", sh.Range("A1").End(xlDown)).Rows.Count

Wat het doet is Selecteer een “from-to” bereik en toon het rijenummer van de laatste druk .
Een reeks impliceert twee minimumwaarden, dus … ondertussen heeft A1 een waarde van het bereik blijft tellen tot de limiet (1048576), dan wordt het getoond.

Sub test()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets(1)
Dim k As Long
    k = Cells(Rows.Count, 1).End(xlUp).Row
    MsgBox k
    k = sh.Range("A1", sh.Range("A1").End(xlDown)).Rows.Count
    MsgBox k
End Sub

Other episodes