在Access VBA中从四个Excel工作表创建四个单独的数据透视表

时间:2018-07-15 05:12:44

标签: vba ms-access runtime-error pivot-table

我有四个从Access导出的Excel工作表。我为这些工作表之一创建了一个完整的查询(数据透视表和数据透视表)。我需要再创建3个单独的数据透视表,所有这些数据透视表都放在同一个工作簿中。

我试图将其分解为子函数,所以我保存了Excel工作簿并关闭它,结束了子函数,然后通过打开Excel工作簿并使用许多相同的查询来建立新的数据透视表缓存来开始另一个工作。

建立新的数据透视缓存时出现错误

  

1004应用程序或未定义错误

请参见下面的代码。 (它在创建第一个数据透视表的上一个子函数中使用时有效。)

Set xlPC = xlbook.PivotCaches.Create(xlDatabase, "Superdash_tbl", xlPivotTableVersion15)
xlSheet.Select
xlbook.TableStyles("PivotStyleMedium2").Duplicate ("CM Style - Dk Blue")
'''''The above line is what is causing the error''''''

我认为For循环不起作用,因为每个数据透视表的结构和标签都不同。

如何包含这四个数据透视表中的每一个?

2 个答案:

答案 0 :(得分:1)

  

这个答案可能更直接 ,因为[我认为]我了解您的问题-但是,我的other answer代表我认为自动完成包括或更多数据透视表。

简短答案:创建第二个数据透视表就像创建原始数据透视表一样。

您似乎正在尝试寻找一种方法来复制现有的数据透视表,从而导致您使用the TableStyle.Duplicate method(在您的示例中)。但是,正如documentation所说的那样:

  

复制TableStyle对象并返回对新副本的引用。

...此方法与数据透视表无关。 (请记住,数据透视表和表不是同一件事。)


无论创建第一个数据透视表所采取的步骤是什么,都需要在新的目标位置再次运行它们,您将拥有另一个数据透视表。

虽然我不建议以编程方式构建枢纽表,但我不建议复制或更改枢纽表的任何方法。因此,我建议构建自动化模板。 / p>

请参阅包含Pivot Table object文档的链接,包括可用于数据透视表的所有适用方法。如果要使用大量数据透视表查看相同的数据,可以考虑重新使用数据透视表缓存,但是全方位的程序化数据透视表非常先进,因此易于编码。


更多信息:

答案 1 :(得分:0)

我的建议是,与其尝试在每次数据更新时都尝试以编程方式进行所有这些复杂的设计和格式化,不如将其翻转并使用当前数据集手动创建一个漂亮的自定义模板,从而 创建模板 ,因此只需覆盖隐藏的“数据标签”(使用VBA或预定的),所有格式都可以自动更新 ),并随时更新数据。

我知道这不是您想要的解决方案,但是无论如何我还是建议您这样做。您不会相信我过去以这种方式自动处理过多少个报告和“仪表盘”。

为“设置并忘记它”自动Access⇒Excel报告创建模板

  1. 设置一个或多个查询,这些查询返回Excel报告所需的数据“全部” 。您可能要按重要字段进行排序,但此时顺序和格式无关紧要。

    The data in an Access Query

  2. 将数据导出到 Excel文件中。由于某些原因, Excel本身会创建文件,如果该文件将用作模板。

      

    只有一行代码可以从Access导出到Excel

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "myQueryname", _
                                  "c:\yourPath\newFilename.xlsx", True, "myWorksheetName"
    

    ...但是,重要的是 Excel创建文件,我添加了几次检查以确保文件不存在并且已正确导出:

    Sub ExportToExcel()
        On Error GoTo xferErr
        Const queryName = "qryMyExportQuery1" 'your source query
        Const out_fileName = "c:\myPath\MyDashboard.xlsx" 'this file to created
        Const out_sheetName = "Data" 'worksheet name to create within the file
    
        If Dir(out_fileName) <> "" Then 
            If MsgBox("Start fresh by deleting: " & vbLf & out_fileName & vbLf & vbLf & _
                "Yes = Delete file; No = export data to existing file.", vbYesNo + _
                vbQuestion, "Delete existing Excel file?") = vbYes Then Kill out_fileName
        End If
    
        'Export data to Excel:
        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _
            queryName, out_fileName, True, out_sheetName
    
        If Dir(out_fileName) <> "" Then 'confirm file exists
            MsgBox "File created!"
        Else
            MsgBox "Something went wrong!"
        End If
        Exit Sub
    xferErr:
        Select Case Err
            Case 80: MsgBox "Permission Denied (You might have " & _
                                out_fileName & " open right now."
            Case Else: MsgBox "Error " & Err & vbLf & Err.Description
        End Select
    End Sub  
    
  3. 打开新创建的文件。请注意,数据位于上面指定的名称的工作表上。

    imported

    从现在开始,每次将相同的查询导出到该文件 (或该文件的副本)时,数据将清除现有数据(仅从此选项卡中)并完全替换之前的数据。

您可以制作新的工作表并引用此工作表上的单元格/行/列,但要避免进行任何更改。 (可以通过调整列宽等简单的方法来查看)。

设置完报告后,您可以隐藏Data标签,而不必担心,甚至没人知道它在那里! (Access不在乎导出数据时该选项卡是否可见。)


我很快就将这个(难看但实用)的示例与样本数据一起进行了处理。 (显然,当您不必以编程方式进行格式化时,对格式等进行挑剔会容易得多!)

所有这些计算和对象都是基于另一个选项卡计算的。
finished

  • 每当您重新运行查询时,此处的所有内容都会自动更新,而无需交互。您可以直接发送或发布此文件的静态副本,而隐藏“数据”标签。

-或者,您可以将'Data'工作表移动到单独的文件中,并将其存储在共享位置,所有来自“仪表板模板”的链接都指向该文件。这样,收件人就可以只添加书签或保存一个文件,并且每次打开文件时,它将始终显示最新数据。

这种方法是可取的,因为,除其他原因外,您可以随时撤回或替换数据,而不必担心浮动的过时静态副本。

像这样更新报告可以做很多事情。 Here are other ideas用于高级仪表板。

  

注意:备份副本 总是很重要,但是,当您学习如何编写代码以自动删除或覆盖代码时,这一点尤其重要。每当您对模板进行任何更改时,请复制一两个!


更多信息: