2016-11-11 62 views
-1

Delphi 10/Seattle、Excel 2013. Excelプラグインを作成するためにDelphiを使用しています。このプラグインはピボットテーブルを作成します。私の挑戦は、私が望む特定の機能(Count vs Average vs Sumなど)を設定することです。関数を設定しないと、デフォルト(COUNT)が使用され、コードは正常に動作します。ピボット・テーブルはそうであるようです。 PivotFieldで関数を変更しようとすると、「PivotFieldクラスのFunctionプロパティを設定できません」というエラーが表示されます。エラーの検索では、私は2つの一般的な原因を見つけました。 (1)PivotテーブルにはデフォルトバージョンのxlPivotTableVersion15が必要です。(2)PivotFieldの向きをxlDataFieldに設定する必要があります。私は両方を行い、マウスオーバー時にIDEは両方のInteger値を表示するので、定義されていることがわかります。Delphi - Excelの関数を変更できないPivotField

私はPivotField.functionの値を取得することを試みました。 「PivotFieldクラスのFunctionプロパティを取得できません」という同様のエラーが表示されます。私が合計したい列は「#Clicks」と呼ばれます。コードの問題のある行が

myPivotTable.PivotFields('#Clicks').function := xlSum; 

である私は、この行をコメントアウトした場合、私はデフォルトのCOUNT関数を取得しますが、私のルーチンは、代わりに私が欲しいSUM関数の、細かい動作します。

感謝しています。行がコメントアウトされ、コードが実行されると、Excelに入り、Pivo​​tFieldリストに入り、関数をCountからSumに変更できます。ここに私のフルコードです。

procedure T_ZTemplateForm.TestPivotTable; 
var 
myPivotCache: OleVariant; 
myPivotTable : OleVariant; 
myActive_WorkBook : OleVariant; 
TabDestination : string; 
f1: OleVariant; 

begin 
    // Add the new Sheet 
    XLApp.Connect; // XLApp is a global variable, pointing to the Excel instance 
    myActive_WorkBook := XLApp.ActiveWorkbook; 
    XLApp.Worksheets.Add(EmptyParam, EmptyParam,1, xlWorksheet, LOCALE_USER_DEFAULT); 

    // Get a handle to the new sheet and set the Sheet Name 
    sheet_graph1 := XLApp.ActiveSheet; 
    sheet_graph1.Name := 'Graph1'; 

    // Create a Pivot Cache 
    myPivotCache := myActive_WorkBook.PivotCaches.Create(xlDatabase,'Raw Data!R1C1:R1048576C36',xlPivotTableVersion15); 

    // Create a Pivot table within the PivotCache 
    TabDestination := 'Graph1!R3C1'; 
    myPivotTable := myPivotCache.CreatePivotTable(TabDestination, 'PivotTable1',xlPivotTableVersion15); 

    // Now start adding the fields... 
    f1 := myPivotTable.PivotFields('Fiscal Quarter'); 
    f1.Orientation := xlRowField; 
    f1.Position := 1; 

    myPivotTable.PivotFields('#Clicks').orientation := xlDataField; 
    // myPivotTable.PivotFields('#Clicks').function := xlSum; 

end; 
+0

**あなたがあなたの '#Clicks' PivotFieldを作成する方法**正確に? – MartynA

+0

@@ MartynA - #Clicksは、Raw Dataシートのデータ列の1つの名前/ヘッダーです。そのシートの各列は、Pivo​​tCache/PivotTableでアクセスできます(少なくとも理解している限り)。 – user1009073

+0

追加情報:Excel_TLBファイルを見ると、Pivo​​tTable.Functionが 'PivotTable.Function_'に変更されたというメッセージが表示されますが、残念ながらそれは役に立ちませんが、ヒントになる可能性があります。 – user1009073

答えて

1

更新私はシアトルおよびExcel 2007を使用してSet_FunctionとのgetFunctionとあなたの問題を再現することができますので、私の答えの元のバージョンを無視してください。

しかし、私はCreateDataFieldを使用してxlCountのFunctionでPivotFieldを作成する方法を見つけました。これは非常に簡単です。

指定されたローカル変数

var 
    DataField : OleVariant; 
    Value : OleVariant; 

次のコードは、文句なしに実行され、正しく

Value := xlCount; 
    DataField := DestinationSheet.PivotTables('APivotTable').AddDataField(
    vPivotField, 
    'Count', 
    Value 
    ); 

DataField := DestinationSheet.PivotTables('APivotTable').AddDataField(
    vPivotField, 
    'Count', 
    xlCount 
    ); 

のに対し、あなたが引用されたエラーメッセージで失敗します。だから、私はAddDataFieldが "生"値xlCountで呼び出されたときに、コンパイラが生成するFunction_引数が何らかの形で間違って "パッケージ化"されているのに対し、引数がxlCountの値を含むOleVariantである場合、

もう一度お試しください。XlConsolidationFunction値 - 私は今この問題を十分に受けています!

元回答:私の実験で判断すると、最終的なパラメータ(あなたのケースではxlSum)をAddDataFieldに指定せずに、使用するExcelの「機能」を変更することができます。実際には、シアトルとExcel2007では、AddDataFieldの 'The parameter is incorrect'例外なしで実行することはできません。最終的な 'function'パラメータの値はです。

私は、会社名、配当支払日、金額の表を含むワークブックを持っています。テーブルヘッダーは、Company、PaymentDate、およびAmountです。

以下のコードは、AddDataFieldのCaptionパラメータとして関数の名前を指定するだけで、Amount列に適用する関数を選択することができます。私は後半のバインディングを主にセットアップの容易さのために使用しました。そのため、指定したくないパラメータの引数を簡単に省略することができます。

コード:

procedure TForm1.TestPivotTable; 
var 
    vXLApp : OleVariant; 
    PivotCache: OleVariant; 
    PivotTable : OleVariant; 
    ActiveWorkBook : OleVariant; 
    DestinationSheet : OleVariant; 
    FN : String; 
    Destination : OleVariant; 
    PivotField : OleVariant; 
    DataField : OleVariant; 
begin 
    vXLApp := CreateOleObject('Excel.Application'); 
    vXLApp.Visible := True; 

    FN := 'D:\aaad7\officeauto\MAPivot.xlsm'; 
    Assert(FileExists(FN)); 
    vXLApp.Workbooks.Open(FN); 
    ActiveWorkBook := vXLApp.ActiveWorkbook; 

    PivotCache := ActiveWorkbook.PivotCaches.Create(SourceType := xlDatabase, 
    SourceData := 'Table1', //'R2C1R30C3', 
    Version:=xlPivotTableVersion2000); 

    DestinationSheet := ActiveWorkBook.Sheets['Sheet3']; 
    Destination := DestinationSheet.Name + '!R3C1'; 
    PivotTable := PivotCache.CreatePivotTable(TableDestination := Destination, 
    TableName := 'APivotTable' 
    ); 

    DestinationSheet.Select; 
    DestinationSheet.Cells[3, 1].Select; 
    DestinationSheet.PivotTables('APivotTable').PivotFields('Company').Orientation := xlRowField; 
    DestinationSheet.PivotTables('APivotTable').PivotFields('Company').Position := 1; 

    DestinationSheet.PivotTables('APivotTable').PivotFields('PayDate').Orientation := xlRowField; 
    DestinationSheet.PivotTables('APivotTable').PivotFields('PayDate').Position := 2; 

    DestinationSheet.PivotTables('APivotTable').PivotFields('Amount').Orientation := xlRowField; 
    DestinationSheet.PivotTables('APivotTable').PivotFields('Amount').Position := 3; 

    PivotField := DestinationSheet.PivotTables('APivotTable').PivotFields('Amount'); 
    DataField := DestinationSheet.PivotTables('APivotTable').AddDataField(
    Field := PivotField, 
    Caption := 'Sum'); 
end; 

+0

@@ MartynA、あなたのコードを試しましたが、動作しても問題は解決しません。既定のピボットテーブルバージョンをxlPivotTableVersion2000に設定します。このバージョンのデフォルト関数はSumと表示されるので、何も指定しないときに得られるものです。残念なことに、あなたの例では、SUMはすべて取得できますが、Countを選択することはできません。他の機能の注:Excel_TLBファイルを見ると、Pivo​​tTable.FunctionがPivotTable.Function_に変更されたことが示されます。残念ながらそれは私を助けませんが、ヒントになる可能性があります。他の考え? – user1009073

+0

a)シアトルで提供されているExcelのタイプライブラリのインポートを使用していますか?そうであれば、どのコンポーネントを使用していますか? IDEの「コンポーネントをインポートする」?私は、私がインストールしたExcel 2007からその方法で生成したものを使用しています。 Version2000は最低限の共通点として使われました。 b)PivotTable.Functionの名前が変更されているとは思わない - Delphiのタイプライブラリのインポータは、.Pasファイル内の名前がDelphiの予約語と衝突するのを防ぐため、「アプリケーション」を含むことが多い。 – MartynA

+0

@@ MartynA - IDEでインポートから自分自身を生成しました。これはExcel_TLBと呼ばれ、C:\ Program Files(x86)\ Microsoft Office \ Office15 \ EXCEL.EXE(これは、インストール済みのバージョンであるExcel 2013です)に基づいています。 – user1009073

関連する問題