2009-11-19 10 views
6

He generado una serie de filas usando C# y VSTO. Básicamente he cargado un par de filas con datos y le he dado a cada celda un NamedRange. Mi pregunta es cómo podría, conociendo el índice de filas y filas finales, atravesar cada celda y recuperar su NamedRange. He intentado con Excel.Range range = (Excel.Range) m_worksheet.Cells [x, y]; que obtiene el rango bien, pero luego cuando hago un range.Name.ToString(); Obtengo "Sistema .__ COM ...." en lugar del nombre. ¿Alguien puede ayudar?Cómo encontrar el rango con nombre de una celda - VSTO

Gracias

Respuesta

8

Aquí está el código de ejemplo (take from here) cómo se puede iterar a través de rango con nombre en Excel.

private Excel.Workbook m_workbook; 
object missing = Type.Missing; 

    public void testNamedRangeFind() 
    { 
     m_workbook = Globals.ThisAddIn.Application.ActiveWorkbook; 
     int i = m_workbook.Names.Count; 
     string address = ""; 
     string sheetName = ""; 

     if (i != 0) 
     { 
      foreach (Excel.Name name in m_workbook.Names) 
      { 
       string value = name.Value; 
       //Sheet and Cell e.g. =Sheet1!$A$1 or =#REF!#REF! if refers to nothing 
       string linkName = name.Name; 
       //gives the name of the link e.g. sales 
       if (value != "=#REF!#REF!") 
       { 
        address = name.RefersToRange.Cells.get_Address(true, true, Excel.XlReferenceStyle.xlA1, missing, missing); 
        sheetName = name.RefersToRange.Cells.Worksheet.Name; 
       } 
       Debug.WriteLine("" + value + ", " + linkName + " ," + address + ", " + sheetName); 
      } 
     } 

    } 
0

Se necesitan bucle a través de la colección Nombres para encontrar el NamedRange

2

Sé que este lechón es antiguo, pero sólo necesitaba esta respuesta por lo que ahora que lo tengo voy a compartir: Cuando se construye sus rangos con nombre que desea manejar su evento Change, En ese manejador se le necesitará un poco de código como este:

foreach (Excel.Name name in Globals.ThisWorkbook.Name) 
{ 
if (Application.Intersect(name.RefersToRange, Target) != Null) //Target is the single parameter of our handler delegate type. 
{ 
// FOUND IT!!!! 
} 
} 

Application.Intersect determina la intersección de 2 rangos, y devuelve null si no encuentra ninguno.

1

I utilizó un reparto:

((Excel.Name)target.Name).Name 

Donde "diana" es una Microsoft.Office.Interop.Excel.Range; El nombre incluye el nombre de la hoja.

1

Traté de esta manera: funciona si la célula es parte de la primera hoja, pero en el momento que haga clic en una celda de otra hoja y utilizar la función me da excepción de HRESULT: 0x800A03EC error

Mi código es de esta manera:

Microsoft.Office.Interop.Excel.Workbook _workbook = Globals.ThisAddIn.Excel.CurrentWorkbook.InteropReference; 
      Microsoft.Office.Interop.Excel.Range Target = (Microsoft.Office.Interop.Excel.Range)Globals.ThisAddIn.Application.ActiveCell; 
      foreach (Microsoft.Office.Interop.Excel.Name name in _workbook.Names) 
      { 
       Microsoft.Office.Interop.Excel.Range intersectRange = Globals.ThisAddIn.Excel.CurrentWorkbook.InteropReference.Application.Intersect(Target, name.RefersToRange); 

       if (intersectRange != null) 
       { 
        rangeName = name.Name; 
        break; 
       } 
      } 
0

esto funcionó para mí

 var ranges = activeworkBook.Names; 
     int i = 1; 
     while (i <= ranges.Count) 
     { 
      String currentName = ranges.Item(i, Missing.Value, Missing.Value).Name; 
      if (currentName.Equals(namedRangeToBeDeleted)) 
      { 
       ranges.Item(i, Type.Missing, Type.Missing).Delete(); 
      } 
      else 
      { 
       i++; 
      } 
     } 

Tomó referencia de here y reemplazó el refereTo ya que eso estaba dando direcciones de celda reales.

0

El ejemplo anterior usa m_workbook.Names. En mi caso, necesitaba encontrar rangos con nombre en una hoja de cálculo específica (ActiveWorksheet). Sin embargo, esto no parece funcionar: la lista de nombres permanece vacía. Cuando se usa el libro de trabajo para acceder a los rangos nombrados, funcionó. (VS 2015, Office 2016)

Cuestiones relacionadas