从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表

Posted

技术标签:

【中文标题】从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表【英文标题】:Auto Refresh Excel 2007 Pivot Table after data in separate sheet updated from SQL Server DB 【发布时间】:2011-06-07 11:42:37 【问题描述】:

背景:

我在 Excel 中有三张工作表。

    带有数据透视表的汇总表,可从下面的 #2 中提取数据 从 SQL Server DB 中提取数据的数据表。 (拉出一个类别类型和一个美元值) 具有用于刷新数据和理想情况下数据透视表的按钮的工作表。

问题: 当我单击按钮时,数据表会正确刷新,但数据透视表不会。该工作簿在早上 5 点自动运行,并将结果以 PDF 格式发送给人们,因此我必须想办法在 PDF 生成、发送和工作簿关闭之前刷新数据透视表。

我尝试过的: 首先,当按钮被点击时,它会运行:

ActiveWorkbook.RefreshAll
Application.CalculateFull

它确实正确地更新了数据表,而不是枢轴。

我试过了:

在上述两个命令之间和之后添加以下命令均无济于事:
Sheets("Summary").PivotTables("PivotTable6").PivotCache.Refresh
Sheets("Summary").PivotTables("PivotTable6").RefreshTable
我曾尝试两次(背靠背)运行这两个命令,如下所示:
ActiveWorkbook.RefreshAll
Application.CalculateFull
ActiveWorkbook.RefreshAll
Application.CalculateFull

希望它能够在第一次运行中获取数据,并在第二次运行中成功进行数据透视刷新。没用。

我试图让 Excel 认为我关闭并重新打开工作簿,然后重新运行刷新:
 ThisWorkbook.Saved = True
 Workbooks(1).Activate
 ActiveWorkbook.RefreshAll
 Application.CalculateFull

我尝试这样做的原因是因为在运行工作簿后(枢轴不刷新)我保存并关闭。我重新打开(枢轴仍然错误,数据是正确的),我重新运行,(数据再次正确并且相同),现在枢轴是正确的。所以我希望模拟这个。

在这一点上,我想不出其他任何事情。我正处于我认为 Excel 无法做到这一点的地步。还有一件事。最初我们将数据直接从 SQL Server DB 导入数据透视表,但我们不断收到这些错误,因此我们将采取不同的方法:

已删除部分:/xl/pivotTables/pivotTable1.xml 部分。 (数据透视表) 已删除部分:/xl/pivotTables/pivotTable5.xml 部分。 (数据透视表) 已删除记录:来自/xl/workbook.xml 部分(工作簿)的工作簿属性
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
     <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <logFileName>error014800_01.xml</logFileName> 
        <summary>Errors were detected in file 'T:\Reports\RP\Archive\Historical Excel\01-11\RP_01-07-11.xlsm'</summary> 

        <removedParts summary="Following is a list of removed parts:">
            <removedPart>Removed Part: /xl/pivotTables/pivotTable1.xml part. (PivotTable view)</removedPart> 
            <removedPart>Removed Part: /xl/pivotTables/pivotTable5.xml part. (PivotTable view)</removedPart> 
        </removedParts>

        <removedRecords summary="Following is a list of removed records:">
           <removedRecord>Removed Records: Workbook properties from /xl/workbook.xml part (Workbook)</removedRecord> 
        </removedRecords>
     </recoveryLog>

非常感谢任何帮助。

【问题讨论】:

虽然看看是否有修复会很有趣。我想通了为什么数据透视表总是坏掉。我从查询中删除了一个日期字段,它停止破坏我的数据透视表。基本上反复试验删除所有字段并添加回来,直到它坏了。不确定这一领域有什么奇怪的地方。 【参考方案1】:

您可以使用工作表更改事件来触发数据透视表的刷新。

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo ErrHandler
    Application.EnableEvents = False

    'Check to see if the worksheet range raising this event overlaps the range occupied by our data dump
    If (Not (Intersect(Target, ActiveSheet.ListObjects("DATA_TABLE_NAME_HERE").Range) Is Nothing)) Then

        'If it does, then refesh the pivot tables that depend on this data (not automatic, name each table pivot table explicity)
        ActiveSheet.PivotTables("PIVOT_TABLE_NAME_HERE").RefreshTable

    End If

ErrHandler:
    Application.EnableEvents = True
End Sub

您可能需要将ActiveSheet 替换为Sheets("whatever"),具体取决于您的工作簿框架。

【讨论】:

【参考方案2】:

我遇到过同样的情况,我发现这是由于在连接上启用了后台查询。

我在我的大多数工作表中都包含以下配置,以强制设置禁止后台查询。

Sub SetNoBackgroundQuery()
      Dim i As Integer
      Dim j As Integer
      i = ThisWorkbook.Connections.Count
      If i = 0 Then End
      For j = 1 To i
        ThisWorkbook.Connections(j).ODBCConnection.BackgroundQuery = False
    '    Debug.Print ThisWorkbook.Connections(j).Name

  Next j
End Sub

【讨论】:

以上是关于从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 更新移动到单独的列

如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据

当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?

使用 SQL Server DTS 包有条件地在目标表中插入/更新行

从 sql server 获取选定的值到 php 中的下拉列表

如何从 SQL Server 中的 SELECT 更新?