Έχω γράψει έναν απλό κώδικα για να καταδείξω τη δυσχερή θέση μου.
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
Αυτό που συμβαίνει είναι το εξής: Μετράμε τις γραμμές που περιέχουν τιμές που ξεκινούν από το Α1. Εάν ο αριθμός των γραμμών που περιέχουν τιμές είναι > 1 ο κώδικας λειτουργεί τέλεια. Ωστόσο, αν το Α1 είναι το μοναδικό κελί που περιέχει κάποια τιμή, k = 1.048.576 που υποθέτω ότι είναι ο μέγιστος αριθμός γραμμών που επιτρέπεται στο Excel.
Γιατί δεν ισχύει k = 1;
Εικόνες:
EDIT: Η λύση που χρησιμοποιώ είναι η ακόλουθη:
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
Δεδομένου ότι το k είναι πάντα ίσο με 1048576 όταν ο αριθμός των γραμμών με τιμές είναι 1. Απλά αισθάνεται λίγο ανόητο να πρέπει να κάνουμε κάτι τέτοιο.
Πιθανώς μια καλύτερη λύση είναι να εργαστείτε προς τα πάνω από κάτω:
k=sh.Range("A1048576").end(xlUp).row
Θα πρέπει να χρησιμοποιήσετε το UsedRange
ως εξής:
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
Το μέρος + rn.Row - 1
είναι επειδή το UsedRange ξεκινά μόνο από την πρώτη γραμμή και στήλη που χρησιμοποιείται, οπότε αν έχετε κάτι στη γραμμή 3 έως 10, αλλά οι γραμμές 1 και 2 είναι κενές, το rn.Rows.Count
θα είναι 8
Έχετε δοκιμάσει :-
Sub test()
k = Cells(Rows.Count, "A").End(xlUp).Row
MsgBox (k)
End Sub
Η /μόνη/ παγίδα είναι ότι αν δεν υπάρχουν δεδομένα εξακολουθεί να επιστρέφει 1.