.net - para - ¿Cómo contar el número de filas en Excel con datos?
contar si excel (10)
Ambos funcionarían también, permitiendo que Excel defina la última vez que ve datos
numofrows = destsheet.UsedRange.SpecialCells(xlLastCell).row
numofrows = destsheet.Cells.SpecialCells(xlLastCell).row
la columna A tiene datos como este (es decir, celdas en blanco frecuentes):
HEADING <-- this is A1
kfdsl
fdjgnm
fdkj
gdfkj
4353
fdjk <-- this is A9
Me gustaría poder obtener la referencia de celda de la última celda que tiene datos. Entonces, en el ejemplo anterior, quiero regresar: A9
Lo he intentado pero se detiene en la primera celda en blanco (es decir, devuelve A4
)
numofrows = destsheet.Range("A2").End(xlDown).Row - 1
Comparé todas las posibilidades con una hoja de prueba larga:
0,140625 segundos para
lastrow = calcws.Cells.Find("*", [A1], , , xlByColumns, xlPrevious).row
0 segundos para
iLastRow = calcws.Cells(rows.count, "a").End(xlUp).row
y
numofrows = calcws.Cells.SpecialCells(xlLastCell).row
0,0078125 segundos para
lastrow = calcws.UsedRange.rows.count
Do While 1
If calcws.Cells(lastrow, 1).Value = "" Then
lastrow = lastrow - 1
Else
Exit Do
End If
Loop
Creo que los favoritos son obvios ...
Encontré este enfoque en otro sitio. Funciona con los nuevos tamaños más grandes de Excel y no requiere que codifique el número máximo de filas y columnas.
iLastRow = Cells(Rows.Count, "a").End(xlUp).Row
iLastCol = Cells(i, Columns.Count).End(xlToLeft).Column
Esto funcionará, independientemente de la versión de Excel (2003, 2007, 2010). El primero tiene 65536 filas en una hoja, mientras que las dos últimas tienen un millón de filas más o menos. Sheet1.Rows.Count
devuelve este número dependiendo de la versión.
numofrows = Sheet1.Range("A1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp).Row
o el equivalente pero más corto
numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp)
Esto busca desde la parte inferior de la columna A la primera celda no vacía y obtiene su número de fila.
Esto también funciona si tiene datos que van más abajo en otras columnas. Entonces, por ejemplo, si toma sus datos de ejemplo y también escribe algo en la celda FY4763, lo anterior aún devolverá correctamente 9 (no 4763, que cualquier método que involucre la propiedad UsedRange
retornaría incorrectamente).
Tenga en cuenta que realmente, si desea la referencia de la celda, solo debe usar lo siguiente. No es necesario que primero obtenga el número de fila y luego construya la referencia de celda.
Set rngLastCell = Sheet1.Range("A1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp)
Tenga en cuenta que este método falla en ciertos casos extremos:
- La última fila contiene datos
- La última fila (s) está oculta o filtrada
¡Así que ten cuidado si estás planeando usar la fila 1,048,576 para estas cosas!
Me gusta de esta manera:
ActiveSheet.UsedRange.Rows.Count
Lo mismo se puede hacer con el recuento de columnas. Para mí, siempre trabajo. Pero, si tiene datos en otras columnas, el código anterior también los considerará, porque el código busca todo el rango de celdas de la hoja.
Para mayor claridad, quiero agregar un ejemplo claro y ejecutar
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();
}
Prefiero usar la propiedad CurrentRegion, que es equivalente a Ctrl- *, que expande el rango actual a su rango continuo más grande con datos. Empiezas con una celda, o rango, que sabes que contendrá datos, luego la expandes. La propiedad UsedRange a veces devuelve grandes áreas, simplemente porque alguien hizo un poco de formateo en la parte inferior de la hoja.
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
Dim RowNumber As Integer
RowNumber = ActiveSheet.Range("A65536").End(xlUp).Row
En su caso, debería devolver el n. ° 9
La opción más segura es
Lastrow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Lastcol = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
No use UsedRange
o SpecialCells(xlLastCell)
o End(xlUp)
. Todos estos métodos pueden dar resultados incorrectos si eliminó algunas filas previamente. Excel todavía cuenta estas células invisibles .
Estos métodos funcionarán nuevamente si elimina sus celdas, guarda el libro, lo cierra y lo vuelve a abrir.
n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count