VBA清除只是数据透视表缓存,但保留数据透视表结构

时间:2015-08-28 12:39:21

标签: sql-server vba pivot-table

如何使用VBA清除数据透视表缓存,但不能销毁数据透视表结构?我的数据透视表连接到外部数据源。 SQL源确定哪个用户应该看到哪部分数据。在刷新表时,源会填充表。我想保存Excel文件并使用干净的数据透视表(内部没有数据)进行分发。

结果我想得到这个:

enter image description here

我试验过这段代码并没有成功。在VBA中没有像PivotCaches.Clear这样的东西。

ActiveSheet.PivotTables("PivotTable1").SaveData = False

我发现唯一的好解决方案是使用可以访问SQL Server源的用户刷新表,但不允许查看任何单个数据记录。

这个想法:

int lastr=sheet.getLastRowNum();
 for(int i=1;i<=lastr;i++)
{
 row = sheet.getRow(i);
 cell=row.getCell(0);
 System.out.print(i);
 System.out.println(" "+cell.toString());      
driver.get(cell.toString());
try{
if(driver.findElement(By.xpath("html/body/div[2]/div[2]")).getAttribute("id").equals("newBreadCrumb"))
System.out.println("Pass");
else
System.out.println("Fail"); 
}
catch(Exception e)
{System.out.println("Pass")}

}

似乎不会导致预期的结果。

2 个答案:

答案 0 :(得分:2)

我这样做的方法是刷新一个将返回表结构但有0条记录的查询。因此,如果从视图中选择:

select top 0 * 
from vw_MyPivotData

如果使用存储过程,您可以发送一个参数,确保不会返回任何记录,例如您知道在数据中不存在的过滤器或为了不返回记录而设计的特殊参数

答案 1 :(得分:0)

您不仅可以在不影响数据透视表的情况下清除数据透视表,还可以无情地链接它们。您可以使用相同的结构/模式欺骗PivotCache加载和清空结果集。在关闭文档之前,使用PivotTable.ChangeConnection功能切换连接。

如果excel文件中定义了两个外部连接。一个返回正确的数据,另一个返回相同的结构但没有行。您可以将连接切换到无行版本并以这种方式刷新缓存。如果连接结果集的结构/模式之间存在任何差异,则excel将抛出错误消息。

在分发文件之前,按需更改连接。

Sub PT_cache_clear()
    'change connection'
    Dim con as vartype
    Set con = ActiveWorkbook.Connections("MyNoResultConnection")
    Worksheets(1).PivotTables(1).ChangeConnection (con)
    'refresh the pivot table cache'
    Worksheets(1).PivotTables(1).PivotCache.Refresh
    'clear the cache of any orphaned items'
    Dim pc As PivotCache
    Dim ws As Worksheet
    With ActiveWorkbook
        For Each pc In .PivotCaches
            pc.MissingItemsLimit = xlMissingItemsNone
        Next pc
    End With
End Sub

每次打开工作表时更改为良好的连接

Private Sub Workbook_Open()
    Dim con as vartype
    Set con = ActiveWorkbook.Connections("MyGoodResultConnection")
    Worksheets(1).PivotTables(1).ChangeConnection (con)
    Worksheets(1).PivotTables(1).PivotCache.Refresh
End Sub

您只需在本地PC上设置MyNoResultConnection连接,因为用户不会拨打PT_cache_clear()

<强>更新

每次您可以通过从PivotCache.WorkbookConnection属性获取当前连接名称并比较名称来有条件地设置数据透视表连接,而不是始终更改数据透视表连接。

Worksheets(1).PivotTables(1).PivotCache.WorkbookConnection

注意:

实施此方法的其他方式:

在工作簿打开时使用VBA宏创建连接对象和数据透视表。在工作簿关闭之前删除连接,数据透视表。保存工作簿时,将自动删除缓存。根据外部数据源的设置方式,这种方法可能很困难。可能需要您在VBA代码中存储用户名和密码。