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;
答案 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