valor una que posicion obtener numero funciones funcion fila direccion columna coincidir celda busqueda buscado c# excel vsto

c# - que - posicion de una celda en excel



¿Cómo obtengo un rango de Excel usando números de fila y columna en VSTO/C#? (7)

Creo que la pregunta lo resume todo. Dado dos enteros para fila y columna o cuatro enteros para fila y columna para las dos esquinas de un rango, ¿cómo obtengo un objeto de rango para ese rango?


Donde el rango es múltiples celdas:

Excel.Worksheet sheet = workbook.ActiveSheet; Excel.Range rng = (Excel.Range) sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[3,3]);

Donde rango es una celda:

Excel.Worksheet sheet = workbook.ActiveSheet; Excel.Range rng = (Excel.Range) sheet.Cells[1, 1];


Encontré un buen método corto que parece funcionar bien ...

Dim x, y As Integer x = 3: y = 5 ActiveSheet.Cells(y, x).Select ActiveCell.Value = "Tada"

En este ejemplo, estamos seleccionando 3 columnas más y 5 filas más abajo, luego colocamos "Tada" en la celda.


Enfrentando el mismo problema, encontré que la solución más rápida era escanear las filas de las celdas que deseaba clasificar, determinar la última fila con un elemento que no estaba en blanco y luego seleccionar y ordenar esa agrupación.

Dim lastrow As Integer lastrow = 0 For r = 3 To 120 If Cells(r, 2) = "" Then Dim rng As Range Set rng = Range(Cells(3, 2), Cells(r - 1, 2 + 6)) rng.Select rng.Sort Key1:=Range("h3"), order1:=xlDescending, Header:=xlGuess, DataOption1:=xlSortNormal r = 205 End If Next r


La respuesta dada arrojará un error si se usa en Microsoft Excel 14.0 Object Library. Object no contiene una definición para get_range. En su lugar use

int countRows = xlWorkSheetData.UsedRange.Rows.Count; int countColumns = xlWorkSheetData.UsedRange.Columns.Count; object[,] data = xlWorkSheetData.Range[xlWorkSheetData.Cells[1, 1], xlWorkSheetData.Cells[countRows, countColumns]].Cells.Value2;


Si quieres como Cells(Rows.Count, 1).End(xlUp).Row , puedes hacerlo.

solo usa el siguiente código:

using Excel = Microsoft.Office.Interop.Excel; string xlBk = @"D:/Test.xlsx"; Excel.Application xlApp; Excel.Workbook xlWb; Excel.Worksheet xlWs; Excel.Range rng; int iLast; xlApp = new Excel.Application(); xlWb = xlApp.Workbooks.Open(xlBk, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "/t", false, false, 0, true, 1, 0); xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1); iLast = xlWs.Rows.Count; rng = (Excel.Range)xlWs.Cells[iLast, 1]; iLast = rng.get_End(Excel.XlDirection.xlUp).Row;


UsedRange funciona bien con celdas "vírgenes", pero si sus celdas se rellenan en el pasado, UsedRange le entregará el valor anterior.

Por ejemplo:

"Piensa en una hoja de Excel que tenga las celdas A1 a A5 llenas de texto". En este escenario, UsedRange debe implementarse como:

Long SheetRows; SheetRows = ActiveSheet.UsedRange.Rows.Count;

Un reloj a la variable SheetRows debe mostrar un valor de 5 después de la ejecución de este par de líneas.

P1: Pero, ¿qué ocurre si se borra el valor de A5?

A1: el valor de SheetRows sería 5

P2: ¿Por qué esto?

A2: Porque MSDN define la propiedad UsedRange como:

Obtiene un objeto Microsoft.Office.Interop.Excel.Range que representa todas las celdas que han contenido un valor en cualquier momento.

Entonces, la pregunta es: ¿existe alguna solución alternativa para este comportamiento?

Creo que en 2 alternativas:

  1. Evite eliminar el contenido de la celda y prefiera eliminar toda la fila (haga clic con el botón derecho en el número de fila y luego en "eliminar fila").
  2. Use CurrentRegion lugar de la propiedad UsedRange de la siguiente manera:

Long SheetRows; SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;