Obteniendo las celdas previas de un range de datos dado

Intento get las celdas previas de un range dado. Hasta ahora mi código se ve así:

Obtenga el range seleccionado y páselo a otro método

Microsoft.Office.Interop.Excel._Application app = this.ExcelAppObj as Microsoft.Office.Interop.Excel._Application; Microsoft.Office.Interop.Excel.Range range = null; range = app.get_Range(this.DataRangeTextBox.Text); var caption = ExcelHelper.GetRangeHeaderCaption(range); 

El siguiente método se ejecuta

  /// <summary> /// Gets the range header caption of a given range. /// The methode goes through every previous cell of the given range to determine the caption. /// If the caption can not be determined the method returns an random string. /// </summary> /// <param name="selectedRange">The selected range.</param> /// <returns></returns> public static string GetRangeHeaderCaption(Range selectedRange, Microsoft.Office.Interop.Excel._Application excelApp) { // The caption of the range. The default value is a random string var rangeCaption = ExcelHelper.getRandomString(5); // Check if the provided range is valid if (selectedRange != null && excelApp.WorksheetFunction.CountA(selectedRange) > 0) { var captionNotFound = true; Range rangeToCheck = selectedRange.Previous; // Go to each previous cell of the provided range // to determine the caption of the range do { // No further previous cells found // We can stop further processing if (rangeToCheck.Cells.Count == 0) { break; } //System.Array myvalues = (System.Array)rangeToCheck.Cells.Value; System.Array myvalues = (System.Array)rangeToCheck.Cells.Value; rangeToCheck = rangeToCheck.Previous; } while (captionNotFound); } return rangeCaption; } 

En el punto

 var rangeToCheck = selectedRange.Previous; 

el acceso a la propiedad arroja la siguiente exception:

 A first chance exception of type 'System.Runtime.InteropServices.COMException' occurnetworking in mscorlib.dll Additional information: Die Previous-Eigenschaft des Range-Objektes kann nicht zugeordnet werden. 

Lo que quiero lograr: ir a través de todas las celdas anteriores del range de datos dado que contiene valores dobles o int y get el encabezado del encabezado mediante verificación si la celda anterior es un valor numérico o una cadena. Si la celda contiene una cadena, devuelva la cadena a la persona que llama.

Editar # 1 Tal vez esta es una información importante. El método GetRangeHeaderCaption se implementa en otra class. No está incluido en la class donde obtengo el range usando la interoperabilidad de Excel.

Editar # 2 Encontrado el problema. La propiedad anterior devuelve la celda IZQUIERDA anterior del range dado. Por ejemplo, si mi range tiene la dirección B2: B16, la propiedad anterior devuelve la dirección A2. Entonces, si bash acceder a la propiedad anterior de A2: A16, obtengo la exception porque no hay una columna antes de la columna A.

Pero lo que necesito es que si tengo el range B2: B16 necesito get el contenido de B1. ¿Me puedes seguir hasta ahora?

De acuerdo, utilicé mi cerebro y encontré una solución para este problema. Es una solución alternativa y no sé si hay otra forma o mejor manera de resolver esto: mira mi código aquí:

  using XLS = Microsoft.Office.Interop.Excel; /// <summary> /// Gets the range header caption of a given range. /// The methode goes through every previous cell of the given range to determine the caption. /// If the caption can not be determined the method returns an random string. /// </summary> /// <param name="selectedRange">The selected range.</param> /// <returns></returns> public static string GetRangeHeaderCaption(Range selectedRange, XLS._Application excelApp) { // The caption of the range. The default value is a random string var rangeCaption = ExcelHelper.getRandomString(5); // Check if the provided range is valid if (selectedRange != null && excelApp.WorksheetFunction.CountA(selectedRange) > 0) { // Get the included cells of the range var rangeCells = selectedRange.Address.Split(new char[] { ':' }); // Get the beginning cell of the range var beginCell = rangeCells[0].Trim(); // Get the column and row data of the cell var cellColumnRow = beginCell.Split(new char[] { '$' }); // Split the beginning cell into the column and the row var cellColumn = cellColumnRow[1]; var cellRow = Convert.ToInt32(cellColumnRow[2]); var captionNotFound = true; int i = 0; // Go to each previous cell of the provided range // to determine the caption of the range do { // Check if the next cell would be invalid var nextCellRow = cellRow - i; if (nextCellRow == 0) break; // Create the cell coordinates to look at var cellToLook = string.Format("{0}{1}", cellColumn, nextCellRow); // Get the value out of the cell var cellRangeValue = ((XLS.Worksheet)((XLS.Workbook)excelApp.ActiveWorkbook).ActiveSheet).get_Range(cellToLook).Value; // ...just to be sure it does not crash if (cellRangeValue != null) { // Convert the determined value to an string var cellValue = cellRangeValue.ToString(); double value; // Check if the cell value is not a numeric value // Check if the cell value is not empty or null if (!double.TryParse(cellValue, out value) && !string.IsNullOrWhiteSpace(cellValue) && !string.IsNullOrEmpty(cellValue)) { // In this case we found the caption rangeCaption = cellValue; captionNotFound = false; } } i++; } while (captionNotFound); } return rangeCaption; }