7
votes

Accéder aux cellules Excel par leur nom au lieu de "coordonnées" comme A1

J'ai une feuille Excel où j'ai nommé les cellules que je dois remplir de mon code. La raison des champs nommés est que le client a la possibilité de réorganiser les cellules.

Pour en faire un peu plus clair: j'ai utilisé le champ ci-dessous pour nommer les cellules. P>

Nom du champ Excel P>

Mon problème est maintenant que je n'ai aucune idée de comment résoudre ces champs de c # Utilisation de Bureau Interop. P>

Range r = Sheet.get_Range("M_Leitung", Type.Missing);


0 commentaires

3 Réponses :


8
votes

Je viens de simuler votre scénario et que le code suivant a fonctionné comme un charme (où j'ai étiqueté A1 en feuille2 comme M_LEITUNG):

EDIT: Code mis à jour - Lorsque vous avez plusieurs feuilles, vous devez renvoyer les noms à la portée du classeur qui reviendra une adresse parfaite (et la gamme résultante sait donc quelle feuille de sélection de l'adresse) xxx

Notez que vous créez une plage nommée automatiquement lorsque vous renommez une cellule . Si vous avez créé une gamme de Say A1: B1 et que vous avez sélectionné cela. Excel vous montrerait la plage nommée dans cette étiquette de coin plutôt que les adresses qui le prouve fonctionne les deux manières.

hth


5 commentaires

Cela fonctionne pour "A1", "A1", mais à chaque fois que lorsque j'essaie d'utiliser le nom de champ, je reçois l'exception suivante: Exception de HRESULT: 0x800A03ec


J'ai utilisé Interop 11 avant, mais installé 14 maintenant. Même résultat. J'ai vérifié la fenêtre de modules et j'ai confirmé que la version 14 est utilisée.


J'ai testé cela sur Office 2010 et 2007 en utilisant Interop 14 et 12. Son travail avec les deux cas. Je soupçonne que cela a à voir avec la façon dont vous parlez exactement de la plage de noms. Comment allez-vous naviguer sur la feuille? Utilisez-vous comme je suis?


Voici exactement ce que je fais: ---- Application Excelapp = nouvelle application (); Cloisons Excelworkbooks = Excelapp.workworkbooks; Rapport de travail = Excelworkbooks.open (nom de fichier, 0, false, 5, "" "" "", vrai, xlplatform.xlwindows, "", vrai, faux, 0, faux, faux, faux); Feuille de calcul gissheet = reporter.worksheets [2]; var y = gissheet.range ["m_leitung", "m_leitung"]. Valeur; ----


Trié! Nécessité de se référer à la gamme sur la portée du classeur comme d'autres personnes mentionnées lorsque vous avez plusieurs feuilles. Mis à jour le code en conséquence. Testé et travailler.



3
votes

Les noms définis dans Excel ont une portée, un classeur ou une feuille (c'est-à-dire global ou local). Les taper dans comme si vous avez fait les créer comme une portée du classeur. Utilisez le gestionnaire de noms pour vérifier la portée.

Utilisez les propriétés Noms & referstorange, pas à ne pas y accéder. La syntaxe est légèrement différente:

Scope au classeur: workbook.names ("M_LEITUNG"). referstorange.value

feuille de calcul Scope: workbook.sheet.names ("M_LEITUNG"). refertorange.value

La raison en est que vous pouvez créer le même nom sur différentes feuilles.


1 commentaires

Notez que refertorange échoue si la valeur n'est pas réellement une plage d'Excel. Pour ces types de valeurs, j'ai utilisé .names ("m_leitung"). Valeur.trim (nouveau caractère [] {'=', '"'"}) . .Value renvoie la valeur à l'intérieur "" avec = devant celui-ci afin que la garniture () enlève.



0
votes
Excel.Application app = new Excel.ApplicationClass();

Excel.Workbook book =  app.Workbooks.Open(Filename: System.IO.Path.Combine( Environment.CurrentDirectory, "Book1.xls"));

Excel.Name MyRange =    book.Names.Item(Index:"MyRange");

Console.WriteLine(MyRange.RefersToRange.Value);

MyRange.RefersToRange.Value  = "55";

book.Save();

app.Quit();
Above code open a file and get the value from workbook and update the range. I think this will solve the problem.

0 commentaires