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 UsedRange
gebruiken 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 - 1
gedeelte 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.Count
zou 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 k
dienovereenkomstig (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