我正在使用 Delphi 编写一个构建数据透视表的程序。因为我想使用不同计数,所以我必须“添加到数据模型”,这显然会在后台创建一个 OLAP 多维数据集。这意味着我无法使用“正常”Excel_TLB 单元,而必须使用基于 GetActiveOLE 的例程...
我可以连接,我可以构建数据模型,我可以创建数据透视缓存和数据透视表对象,但是当我将字段添加到数据透视表时,我在运行时收到错误,通常是“找不到成员”。
当我单步执行代码时,在创建数据透视表对象后,我可以转到 Excel,并且看到数据透视表的可能列的列表。它们列在“范围”级别下。 (这就是当您为数据透视表“添加到数据模型”时我所期望的)。当我打开记录宏,并手动将字段(类别)添加到过滤器部分时,VBA代码如下所示...
With ActiveSheet.PivotTables("PivotTable1").CubeFields("[Range].[Category]")
.Orientation = xlPageField
.Position = 1
End With
下面是我的德尔福代码。这是最后的注释行不起作用。
procedure Build_Pivot;
var
// Connection Info
SheetName: String;
ConnRange, ConnName, ConnString, ConnCommand: String;
ConnPath, ConnFile : String;
ConnCount : Integer;
XLApp: Variant;
gConnection: Variant;
// Now define variables for the Pivot
myPivotCache: Variant;
myPivotTable: Variant;
StartCellRange: Variant;
fFilter1, fFilter2: Variant;
begin
XLApp := GetActiveOleObject('Excel.Application');
// Create the connection if we are adding to DataModel
// Now parse our gFileName
ConnPath := ExtractFileDir(gFileName); // Global Variable of the FileName
ConnFile := ExtractFileName(gFileName);
SheetName := 'RawData';
ConnRange := '$A:$H';
ConnCount := XLApp.ActiveWorkbook.Connections.Count;
ConnName := 'WorksheetConnection' + IntToStr(ConnCount) + '_' + SheetName + '!' + ConnRange;
ConnString := 'WORKSHEET;' + ConnPath + '[' + ConnFile + ']' + SheetName;
ConnCommand := SheetName + '!' + ConnRange;
gConnection := XLApp.ActiveWorkbook.Connections.Add2(ConnName, '', ConnString, ConnCommand, 7, True, False);
// Create the PivotCache
myPivotCache := XLApp.ActiveWorkbook.PivotCaches.Create(xlExternal, gConnection, 7);
// Create the PivotTable object;
StartCellRange := XLApp.ActiveWorkbook.ActiveSheet.Range['A5', 'A5'];
myPivotTable := myPivotCache.CreatePivotTable(StartCellRange, 'PivotTable1', True, 7);
// I can now see my Pivot Object in Excel
// Now add Filter Fields. I have tried multiple variations, but cannot get anything to work
// fFilter1 := XLApp.ActiveWorkbook.ActiveSheet.PivotTables('PivotTable1').CubeFields('[Range].[Category]');
// fFilter1 := myPivotCache.PivotTable.CubeFields('[Range].[Category]');
// fFilter1 := myPivotTable.CubeFields('[Range].[Category]');
fFilter1.Orientation := xlPageField;
非常感谢任何帮助或想法。
找到答案了。该参数需要作为数组传递,而不是在括号内。该代码有效...
fFilter1 := myPivotTable.CubeFields['[Range].[Category]'];
fFilter1.Orientation := xlPageField;
我需要一些帮助。 Excel 表格包含 3 列。 使用 Delphi 7,我需要构建一个数据透视表。我应该如何开始?我应该从哪里开始?一步步。 谢谢你。