2009-11-19 6 views
6

J'ai généré une série de lignes en utilisant C# et VSTO. J'ai fondamentalement chargé quelques lignes avec des données et ai donné à chaque cellule un NamedRange. Ma question est de savoir comment je pourrais, en connaissant l'index de début et de fin de ligne, traverser chaque cellule et récupérer son NamedRange. J'ai essayé Excel.Range range = (Excel.Range) m_worksheet.Cells [x, y]; qui obtient la plage bien, mais quand je fais un range.Name.ToString(); Je reçois "System .__ COM ...." au lieu du nom. Quelqu'un peut-il aider?Comment trouver la plage nommée d'une cellule - VSTO

Merci

Répondre

8

Voici l'exemple de code (take from here) comment vous pouvez itérer plage nommée dans 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

Vous devez boucle à travers la collecte de noms pour trouver le NamedRange

2

Je sais que ce meunier est vieux mais je avais besoin de cette réponse maintenant que je l'ai, je vais partager: Lorsque vous construisez vos plages nommées vous voulez gérer leur événement Change, Dans ce gestionnaire, vous aurez besoin de code comme ceci:

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 détermine l'intersection de 2 plages, et retourne null si elle ne trouve pas.

1

J'ai utilisé un casting:

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

Où "cible" est un Microsoft.Office.Interop.Excel.Range; Le nom incluait le nom de la feuille.

1

J'ai essayé de cette façon: Works si la cellule fait partie de la première feuille, mais dès que je clique sur une cellule dans une autre feuille et utiliser la fonction me donne Exception de HRESULT: 0x800A03EC Erreur

Mon code est ainsi:

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

cela a fonctionné pour moi

 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++; 
      } 
     } 

a pris référence de here et remplacé le refereTo car cela donnait des adresses de cellules réelles.

0

L'exemple ci-dessus utilise m_workbook.Names. Dans mon cas, je devais trouver des plages nommées sur une feuille de calcul spécifique (ActiveWorksheet). Cependant, cela ne semble pas fonctionner: la liste des noms reste vide. Lors de l'utilisation du classeur pour accéder aux plages nommées, il a fonctionné. (VS 2015, Office 2016)

Questions connexes