seleccionar recorrer rango macro leer funcion español desde celda activar activa c# excel automation

rango - recorrer excel c#



Cómo obtener el rango de celdas ocupadas en hoja de Excel (8)

Debería probar la propiedad currentRegion, si sabe desde dónde se encuentra el rango. Esto le dará los límites de su rango utilizado.

Uso C # para automatizar un archivo de Excel. Pude obtener el libro de trabajo y las hojas que contiene. Si, por ejemplo, tengo en la hoja 1 dos columnas y 5 filas. Quería obtener el rango para las celdas ocupadas como A1: B5. Probé el siguiente código pero no dio el resultado correcto. las columnas # y # de fila eran mucho más grandes y las celdas también estaban vacías.

Excel.Range xlRange = excelWorksheet.UsedRange; int col = xlRange.Columns.Count; int row = xlRange.Rows.Count;

¿Hay alguna otra manera que pueda usar para obtener ese rango?


Estas dos líneas por sí mismas no estaban funcionando para mí:

xlWorkSheet.Columns.ClearFormats(); xlWorkSheet.Rows.ClearFormats();

Puede probar presionando ctrl + end en la hoja y viendo qué celda se selecciona.

Descubrí que agregar esta línea después de los dos primeros resolvía el problema en todas las instancias que he encontrado:

Excel.Range xlActiveRange = WorkSheet.UsedRange;


La única forma en que podría hacerlo funcionar en TODOS los escenarios (excepto las hojas protegidas) (basado en la respuesta de Farham):

Es compatible con:

  • Escaneo de filas / columnas ocultas

  • Ignora celdas formateadas sin datos / fórmula

Código:

// Unhide All Cells and clear formats sheet.Columns.ClearFormats(); sheet.Rows.ClearFormats(); // Detect Last used Row - Ignore cells that contains formulas that result in blank values int lastRowIgnoreFormulas = sheet.Cells.Find( "*", System.Reflection.Missing.Value, InteropExcel.XlFindLookIn.xlValues, InteropExcel.XlLookAt.xlWhole, InteropExcel.XlSearchOrder.xlByRows, InteropExcel.XlSearchDirection.xlPrevious, false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Row; // Detect Last Used Column - Ignore cells that contains formulas that result in blank values int lastColIgnoreFormulas = sheet.Cells.Find( "*", System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, InteropExcel.XlSearchOrder.xlByColumns, InteropExcel.XlSearchDirection.xlPrevious, false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Column; // Detect Last used Row / Column - Including cells that contains formulas that result in blank values int lastColIncludeFormulas = sheet.UsedRange.Columns.Count; int lastColIncludeFormulas = sheet.UsedRange.Rows.Count;


Tuve un problema muy similar al tuyo. Lo que realmente funcionó es esto:

iTotalColumns = xlWorkSheet.UsedRange.Columns.Count; iTotalRows = xlWorkSheet.UsedRange.Rows.Count; //These two lines do the magic. xlWorkSheet.Columns.ClearFormats(); xlWorkSheet.Rows.ClearFormats(); iTotalColumns = xlWorkSheet.UsedRange.Columns.Count; iTotalRows = xlWorkSheet.UsedRange.Rows.Count;

En mi humilde opinión, lo que sucede es que cuando borras datos de Excel, sigue pensando que hay datos en esas celdas, aunque están en blanco. Cuando eliminé los formatos, elimina las celdas en blanco y, por lo tanto, devuelve recuentos reales.


Una vieja pregunta, pero si alguien está buscando una solución, esto funciona para mí.

using Excel = Microsoft.Office.Interop.Excel; Excel.ApplicationClass excel = new Excel.ApplicationClass(); Excel.Application app = excel.Application; Excel.Range all = app.get_Range("A1:H10", Type.Missing);


Vea el método Range.SpecialCells. Por ejemplo, para obtener celdas con valores constantes o fórmulas, use:

_xlWorksheet.UsedRange.SpecialCells( Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants | Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas)


Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing); Excel.Range range = sheet.get_Range("A1", last);

"rango" ahora será el rango de celdas ocupadas


dim lastRow as long ''in VBA it''s a long lastrow = wks.range("A65000").end(xlup).row