Search code examples
delphiexcelinteropfor-in-loop

In Delphi, what do I do about "no GetEnumerator present" error when using a for loop over Excel Interop Worksheets collection?


I'm trying to write a Delphi program that will loop through each worksheet in an Excel file and format some cells. I'm receiving an error while trying to use the for-in loop over the Workbook.Worksheets collection, though. The error is specifically:

[DCC Error] Office.pas(36): E2431 for-in statement cannot operate on collection type 'Sheets' because 'Sheets' does not contain a member for 'GetEnumerator', or it is inaccessible

The line of code this occurs for is:

for Worksheet in Workbook.Worksheets do

The definition of Worksheet and Workbook is as follows:

var ExcelApp: ExcelApplication;
var Workbook: ExcelWorkbook;
var Worksheet: ExcelWorksheet;

I'm porting this code to Delphi from C#, in which it works. Does anyone know why I'd be getting this GetEnumerator error? I'm using the Office 2007 Excel Interop file and Embarcadero® Delphi® 2010 Version 14.0.3593.25826.


Solution

  • I'm not sure how C# handles enumerable collections, but for Delphi, it looks for a method on the collection called GetEnumerator, which returns an enumerator. The enumerator must be a data structure that contains at least the following two members:

    public
      function MoveNext: boolean;
      property Current: <some type> read <some read method>;
    end;
    

    If Delphi says 'Sheets' does not contain a member for 'GetEnumerator', or it is inaccessible, then that means exactly what it says. Either there's no GetEnumerator on Sheets, or it's not a public method. What does the definition of Sheets look like?