Delphi - 无法更改Excel PivotField中的函数

时间:2016-11-11 15:26:41

标签: excel delphi com pivot-table

Delphi 10 / Seattle,Excel 2013.我使用Delphi构建Excel插件。这个插件将创建一个Pivot表。我的挑战是设置我想要的特定功能(计数与平均值和总和等)。如果我没有设置函数,则使用默认值(COUNT),并且我的代码工作正常,数据透视表就像它应该的那样。如果我尝试更改PivotField上的函数,则会收到错误“无法设置PivotField类的Function属性”。在搜索错误时,我发现了两个常见原因。 (1)数据透视表必须具有xlPivotTableVersion15的默认版本,并且(2)必须将PivotField方向设置为xlDataField。我已经完成了这两项工作,当moused-over时,IDE会显示两者的Integer值,所以我知道它们是已定义的。

我尝试获取(而不是设置)PivotField.function的值。我得到一个类似的错误“无法获取PivotField类的Function属性”。我想要Sum的列称为'#Clicks'。违规行代码是

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

如果我注释掉这一行,我的例程运行正常,虽然我得到了默认的COUNT函数,而不是我想要的SUM函数。

任何想法都赞赏。请注意,当该行被注释掉,并且我运行代码时,我可以进入Excel,进入PivotField列表,并将函数从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;

1 个答案:

答案 0 :(得分: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_参数在某种程度上被错误地“打包”,而当参数是包含{{1}的OleVariant时值,它被正确打包。

我会让你尝试其他xlCount值 - 我现在已经受够了这个问题了!

原始答案:根据我的实验判断,您可以更改要使用的Excel'功能',而无需指定XlConsolidationFunction的最终参数(在您的情况下为xlSum)。事实上,对于Seattle和Excel2007,我无法在没有得到'参数不正确'的情况下执行{em>任何最终的'function'参数值。

我有一张工作簿,上面有公司名称,股息支付日期和金额表。表格标题是公司,PaymentDate和金额。

下面的代码适用于我,允许我选择要应用于Amount列的函数,只需将函数名称指定为AddDataField的AddDataField参数即可。我使用后期绑定主要是为了便于设置,因此我可以轻松省略我不想指定的参数的参数。

代码:

AddDataField