2

Excelファイルの各ワークシートをループしていくつかのセルをフォーマットするDelphiプログラムを作成しようとしています。ただし、Workbook.Worksheetsコレクションでfor-inループを使用しようとすると、エラーが発生します。エラーは具体的には次のとおりです。

[DCCエラー]Office.pas(36):「Sheets」に「GetEnumerator」のメンバーが含まれていないか、アクセスできないため、E2431for-inステートメントはコレクションタイプ「Sheets」を操作できません

これが発生するコード行は次のとおりです。

for Worksheet in Workbook.Worksheets do

ワークシートとワークブックの定義は次のとおりです。

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

このコードをC#からDelphiに移植しており、そこで動作します。このGetEnumeratorエラーが発生する理由を誰かが知っていますか?Office 2007ExcelInteropファイルとEmbarcadero®Delphi®2010バージョン14.0.3593.25826を使用しています。

4

3 に答える 3

1

C#は、Delphiと同様の列挙子を処理します。MoveNextとResetの2つのメソッドを持つIEnumerableインターフェイスがあります。また、Currentと呼ばれる1つのプロパティ。

ExcelWorkBook.Sheetsプロパティの場合、MSDNドキュメントにはGetEnumeratorメソッドがあると記載されていますが、Delphiが提供するExcelXPユニットでのこのクラスの定義にはそのようなメソッドがないことに注意してください。そのため、タイプライブラリの新しいバージョンをDelphiにインポートする必要があるかもしれません。

于 2010-03-15T18:29:39.187 に答える
1

C#が列挙可能なコレクションをどのように処理するかはわかりませんが、Delphiの場合、列挙子を返すGetEnumeratorというコレクションのメソッドを探します。列挙子は、少なくとも次の2つのメンバーを含むデータ構造である必要があります。

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

Delphiが「Sheets」に「GetEnumerator」のメンバーが含まれていない、またはアクセスできないと言った場合、それはまさにそれが言っていることを意味します。SheetsにGetEnumeratorがないか、パブリックメソッドではありません。シートの定義はどのように見えますか?

于 2010-03-15T17:18:36.520 に答える
0

編集:コメントに基づいて、オブジェクトのGetEnumeratorメソッドが存在するため、このソリューションは正しくない可能性があります。

Delphiを使用してからしばらく経ちましたが、エラーに基づく私の推測では、ExcelWorksheetコレクションは列挙されていません。つまり、for / eachスタイルのループを実行すると機能せず、C-を使用する必要があります。 forループのように:

 For  i := 1 to Length(Workbook.Worksheets) do
  Worksheet = Workbook.Worksheets[i];
end;
于 2010-03-15T17:08:09.387 に答える