Come contare il numero di righe in Excel con i dati?

la colonna A ha dati come questo (cioè celle vuote frequenti):

HEADING <-- this is A1 kfdsl fdjgnm fdkj gdfkj 4353 fdjk <-- this is A9 

Mi piacerebbe essere in grado di ottenere il riferimento di cella dell’ultima cella che ha dati. Quindi nell’esempio sopra voglio tornare: A9

Ho provato questo, ma si ferma alla prima cella vuota (cioè restituendo A4 )

 numofrows = destsheet.Range("A2").End(xlDown).Row - 1 

Mi piace in questo modo:

ActiveSheet.UsedRange.Rows.Count

Lo stesso può essere fatto con il conteggio delle colonne. Per me, lavora sempre. Tuttavia, se si dispone di dati in altre colonne, il codice sopra li considererà anche perché il codice cerca l’intervallo di celle nel foglio.

L’opzione più sicura è

 Lastrow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row Lastcol = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column 

Non utilizzare UsedRange o SpecialCells(xlLastCell) o End(xlUp) . Tutti questi metodi potrebbero dare risultati errati se in precedenza hai cancellato alcune righe. Excel conta ancora queste celle invisibili .

Questi metodi funzioneranno di nuovo se si eliminano le celle, si salva la cartella di lavoro, si chiude e si riapre.

Funzionerà, indipendentemente dalla versione di Excel (2003, 2007, 2010). Il primo ha 65536 righe in un foglio, mentre le ultime due hanno un milione di righe o giù di lì. Sheet1.Rows.Count restituisce questo numero in base alla versione.

 numofrows = Sheet1.Range("A1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp).Row 

o l’equivalente ma più breve

 numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp) 

Questa ricerca dalla parte inferiore della colonna A per la prima cella non vuota e ottiene il suo numero di riga.

Questo funziona anche se hai dati che vanno più in basso in altre colonne. Quindi, ad esempio, se si prendono i dati di esempio e si scrive anche qualcosa nella cella FY4763, quanto sopra restituirà correttamente correttamente 9 (non 4763, che qualsiasi metodo che coinvolge la proprietà UsedRange restituirà erroneamente).

Nota che, in realtà, se vuoi il riferimento alla cella, dovresti semplicemente usare quanto segue. Non è necessario prima ottenere il numero di riga e quindi creare il riferimento di cella.

 Set rngLastCell = Sheet1.Range("A1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp) 

Nota che questo metodo fallisce in alcuni casi limite:

  • L’ultima riga contiene dati
  • Le ultime righe sono nascoste o filtrate

Quindi stai attento se hai intenzione di usare la riga 1.048.576 per queste cose!

Ho confrontato tutte le possibilità con un foglio di prova lungo:

0,140625 sec per

 lastrow = calcws.Cells.Find("*", [A1], , , xlByColumns, xlPrevious).row 

0 secondi per

 iLastRow = calcws.Cells(rows.count, "a").End(xlUp).row 

e

 numofrows = calcws.Cells.SpecialCells(xlLastCell).row 

0,0078125 sec per

 lastrow = calcws.UsedRange.rows.count Do While 1 If calcws.Cells(lastrow, 1).Value = "" Then lastrow = lastrow - 1 Else Exit Do End If Loop 

Penso che i favoriti siano ovvi …

Dim RowNumber As Integer
RowNumber = ActiveSheet.Range("A65536").End(xlUp).Row

Nel tuo caso dovrebbe restituire # 9

Trovato questo approccio su un altro sito. Funziona con le nuove dimensioni più grandi di Excel e non richiede l’hardcode del numero massimo di righe e colonne.

 iLastRow = Cells(Rows.Count, "a").End(xlUp).Row iLastCol = Cells(i, Columns.Count).End(xlToLeft).Column 

Grazie a mudraker a Melborne, in Australia

Funzionerebbero entrambi, lasciando che Excel definisca l’ultima volta che vede i dati

 numofrows = destsheet.UsedRange.SpecialCells(xlLastCell).row numofrows = destsheet.Cells.SpecialCells(xlLastCell).row 
  n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count 

Preferisco usare la proprietà CurrentRegion, che è equivalente a Ctrl- *, che espande l’intervallo corrente al suo più ampio intervallo continuo con i dati. Si inizia con una cella o intervallo, che si conosce conterrà dati, quindi si espande. La proprietà UsedRange restituisce a volte aree enormi, solo perché qualcuno ha fatto un po ‘di formattazione nella parte inferiore del foglio.

 Dim Liste As Worksheet Set Liste = wb.Worksheets("B Leistungen (Liste)") Dim longlastrow As Long longlastrow = Liste.Range(Liste.Cells(4, 1), Liste.Cells(6, 3)).CurrentRegion.Rows.Count 

Per maggiore chiarezza, voglio aggiungere un esempio chiaro e in esecuzione

  openFileDialog1.FileName = "Select File"; openFileDialog1.DefaultExt = ".xls"; openFileDialog1.Filter = "Excel documents (.xls)|*.xls"; DialogResult result = openFileDialog1.ShowDialog(); if (result==DialogResult.OK) { string filename = openFileDialog1.FileName; Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; xlApp = new Excel.Application(); xlApp.Visible = false; xlApp.DisplayAlerts = false; xlWorkBook = xlApp.Workbooks.Open(filename, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); var numRows = xlWorkSheet.Range["A1"].Offset[xlWorkSheet.Rows.Count - 1, 0].End[Excel.XlDirection.xlUp].Row; MessageBox.Show("Number of max row is : "+ numRows.ToString()); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); }