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

时间:2011-01-11 22:15:17

标签: excel refresh pivot-table

背景

我在Excel中有三张纸。

  1. 带有数据透视表的摘要表,该数据表从<#li>下面的#2中提取数据
  2. 从SQL Server数据库中提取数据的数据表。 (拉出类别类型和美元价值)
  3. 一张工作表,其中包含一个用于刷新数据的按钮,最理想的是数据透视表。
  4. 问题: 当我单击按钮时,数据表正确刷新,但数据表没有。此工作簿自动在凌晨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>
    

    非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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"),具体取决于工作簿的构建方式。

答案 1 :(得分:1)

我一直处于相同的情况,我发现这是由于在连接上启用了背景查询。

我在此配置的大部分工作表中都包含以下内容,以强制设置禁止后台查询。

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

答案 2 :(得分:0)

我认为这不是一个好主意 - 你真的应该使用Analysis Services来刷新数据。

数据库/查询有多大?

我在5tb数据库中使用了Excel数据透视表,它总是提供亚秒级的结果。因为我使用过Analysis Services。