web-dev-qa-db-de.com

VBA - Range.Row.Count

Ich habe einen einfachen Code geschrieben, um meine Situation darzustellen. 

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

Was passiert, ist folgendes: Wir zählen die Zeilen, die Werte enthalten, die bei A1 beginnen. Wenn die Anzahl der Zeilen, die Werte enthalten,> 1 ist, funktioniert der Code hervorragend. Wenn A1 jedoch die einzige Zelle ist, die einen beliebigen Wert enthält, ist k = 1.048.576, und ich denke, dies ist die maximale Anzahl von Zeilen, die in Excel zulässig ist.

Warum ist k = 1 nicht?

Bilder:

The code works

This is wrong

EDIT: Die Problemumgehung, die ich verwende, ist folgende:

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

Da k immer gleich 1048576 ist, wenn die Anzahl der Zeilen mit Werten 1 ist. Es fühlt sich einfach ein bisschen dumm an, so etwas zu tun.

19
docjay

Eine bessere Lösung ist wahrscheinlich die Arbeit von unten nach oben:

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

Sie sollten UsedRange stattdessen wie folgt verwenden:

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

Der + rn.Row - 1-Teil liegt daran, dass UsedRange nur bei der ersten Zeile und Spalte beginnt, die verwendet wird. Wenn Sie also etwas in Zeile 3 bis 10 haben, Zeile 1 und 2 jedoch leer sind, wäre rn.Rows.Count 8

6
neelsg

Sie können auch die "Last" -Funktion von Ron de Bruin ( http://www.rondebruin.nl/win/s9/win005.htm ) verwenden, die für mich perfekt funktionierte und auch die letzte Spalte und zurückgibt Zelle, wenn Sie möchten. Um die letzte Reihe zu erhalten, verwenden Sie sie wie

lastRow = Last(1,yourRange)

Ich fand das sehr praktisch.

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
2
suiluj_julius
CountRows = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
2
Dado

Das ist eine schöne Frage :)

Wenn Sie eine Situation mit 1 Zelle (A1) haben, ist es wichtig zu ermitteln, ob die zweite deklarierte Zelle nicht leer ist (sh.Range("A1").End(xlDown)). Wenn es wahr ist, bedeutet das, dass Ihr Bereich außer Kontrolle geraten ist :) Schauen Sie sich den Code unten an:

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
1
lowak
k = sh.Range("A2", sh.Range("A1").End(xlDown)).Rows.Count

oder

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

oder

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

Falls sich jemand dies noch einmal ansieht, können Sie Folgendes verwenden: 

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
1
greg

Die beste Lösung ist zu verwenden

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

da es die Anzahl der Zellen zählt, bis es die zuletzt geschriebene findet.

Nicht wie

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

was es tut, ist Wählen Sie einen "Von-Bis" -Bereich und zeigen Sie die Zeilennummer des zuletzt besetzten an .
Ein Bereich impliziert zwei Mindestwerte, also ... während A1 einen Wert hat, der bis zum Grenzwert (1048576) weiter zählt, wird er angezeigt.

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

enter image description here

0
APO69

Dies funktioniert für mich besonders bei der Pivot-Tabellenfilterung, wenn ich die Anzahl der Zellen mit Daten in einer gefilterten Spalte festlegen möchte. Reduzieren Sie k entsprechend (k - 1), wenn Sie eine Kopfzeile zum Filtern haben:

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

Hast du es versucht :-

Sub test()

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

    MsgBox (k)

End Sub

/ Only/catch ist, dass, wenn keine Daten vorhanden sind, immer noch 1 zurückgegeben wird.

0
user3205578