Dans Delphi, que dois-je faire erreur « non présent GetEnumerator » lors de l'utilisation d'une boucle sur la collection Excel Interop Feuilles de travail?
-
20-09-2019 - |
Question
Je suis en train d'écrire un programme Delphi qui boucle à travers chaque feuille de calcul dans un fichier Excel et formater des cellules. Je reçois une erreur en essayant d'utiliser la boucle for-in sur la collection Workbook.Worksheets, cependant. L'erreur est spécifiquement:
[Erreur CDC] Office.pas (36): E2431 for-in ne peut pas fonctionner sur type de collection « Feuilles » parce que « Feuilles » ne contient pas de membre pour 'GetEnumerator', ou il est inaccessible
La ligne de code de ce produit est la suivante:
for Worksheet in Workbook.Worksheets do
La définition de la feuille de travail et le classeur est comme suit:
var ExcelApp: ExcelApplication;
var Workbook: ExcelWorkbook;
var Worksheet: ExcelWorksheet;
Je suis le portage de ce code à Delphi de C #, dans lequel il fonctionne. Est-ce que quelqu'un sait pourquoi j'obtiendrais cette erreur GetEnumerator? J'utilise Office 2007 fichier Excel Interop et Embarcadero® Delphi® 2010 Version 14.0.3593.25826.
La solution
Je ne sais pas comment gère C # collections énumérables, mais pour Delphi, il semble une méthode sur la collection appelée GetEnumerator, qui retourne un recenseur. L 'agent doit être une structure de données qui contient au moins les deux éléments suivants:
public
function MoveNext: boolean;
property Current: <some type> read <some read method>;
end;
Si Delphi dit « Feuilles » ne contient pas membre pour « GetEnumerator », ou il est inaccessible, alors cela signifie exactement ce qu'il dit. Soit il n'y a pas GetEnumerator sur les feuilles, ou ce n'est pas une méthode publique. Qu'est-ce que la définition de feuilles ressemble?
Autres conseils
C # gère les agents recenseurs similaires à Delphi. Il existe une interface IEnumerable qui a deux méthodes: MoveNext et Reset; et également une propriété appelée actuelle.
Pour propriété ExcelWorkBook.Sheets, vous devez prendre note que, bien que la documentation MSDN dit qu'il a une méthode GetEnumerator, la définition de cette classe dans l'unité ExcelXP fournie par Delphi ne fournit pas une telle méthode. vous avez donc peut-être importer une version plus récente de sa bibliothèque de type dans Delphi.
EDIT: D'après les commentaires, la méthode GetEnumerator existe pour l'objet, de sorte que cette solution est probablement incorrecte
.Il a été un moment que je l'ai utilisé Delphi, mais je pense basé sur l'erreur est que la collecte ExcelWorksheet n'énumérait, ce qui voudrait dire faire un pour / chaque boucle de style ne fonctionnerait pas et vous auriez besoin d'utiliser un C-like boucle for:
For i := 1 to Length(Workbook.Worksheets) do
Worksheet = Workbook.Worksheets[i];
end;