2009-11-19 3 views
6

Ich habe eine Reihe von Zeilen mit C# und VSTO generiert. Ich habe im Grunde ein paar Zeilen mit Daten geladen und jeder Zelle einen NamedRange gegeben. Meine Frage ist, wie würde ich, wenn ich den Anfangs- und den Endzeilenindex kenne, jede Zelle durchqueren und ihre NamedRange abrufen. Ich habe versucht, Excel.Range Bereich = (Excel.Range) m_worksheet.Cells [x, y]; was den Bereich in Ordnung bringt, aber dann, wenn ich einen Bereich tue.Name.ToString(); Ich bekomme "System .__ COM ...." anstelle des Namens. Kann jemand helfen?So finden Sie den benannten Bereich einer Zelle - VSTO

Dank

Antwort

8

Hier ist der Beispielcode (take from here) zu finden, wie Sie durch benannten Bereich in Excel laufen können.

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

Sie benötigen Schleife durch Sammlung Namen den Namedrange

2

Ich weiß, das Sauger alt ist, aber ich gerade diese Antwort benötigt, so jetzt, dass ich es habe ich teilen: Wenn Sie benannte Bereiche bauen Sie ihre Change-Ereignis behandeln möchten, In diesem Handler werden Sie müssen einige Code wie folgt aus:

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 bestimmt den Schnittpunkt von zwei Bereiche, und gibt null zurück, wenn es einen nicht findet.

1

habe ich eine Besetzung:

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

Wo "Ziel" ein Microsoft.Office.Interop.Excel.Range ist; Der Name enthielt den Namen des Blattes.

1

ich auf diese Weise versucht: Funktioniert, wenn die Zelle Teil des ersten Blattes ist, aber der Moment, als ich in einem anderen Blatt auf eine Zelle klicken und die Funktion gibt mir Ausnahme von HRESULT verwenden: 0x800A03EC Fehler

Meine Code ist auf diese Weise:

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

Dieser arbeitete für mich

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

Referenz Nahm von here und ersetzte das referTo, da es tatsächliche Zelladressen gab.

0

Das obige Beispiel verwendet m_workbook.Names. In meinem Fall musste ich auf einem bestimmten Arbeitsblatt (ActiveWorksheet) benannte Bereiche finden. Dies scheint jedoch nicht zu funktionieren: Die Names-Liste bleibt leer. Wenn die Arbeitsmappe für den Zugriff auf die benannten Bereiche verwendet wurde, funktionierte sie. (VS 2015, Büro 2016)