【问题标题】:Excel VBA Using pivot table data in another workbookExcel VBA 在另一个工作簿中使用数据透视表数据
【发布时间】:2013-08-22 13:41:51
【问题描述】:

以下 Sub 要求用户选择要打开的通用模板,然后要求用户选择源文件(以填充模板)。源文件包含许多工作表和数据透视表。然后,子从数据透视表中选择数据并将其复制到模板中。 我需要源文件是一个变量而不是硬编码的数据透视表源,因为这个标题会根据用户的选择而变化。

问题1:复制数据时只显示REF!而不是实际数据(即使数据存在)。

'Open Generic Report to populate with data
Dim GenericFolderLocation As String
MsgBox "Please select the generic porfolio template..."
GenericFolderLocation = "C:\Users\user.name\Desktop"
   ChDrive GenericFolderLocation

  SelectedFile = Application.GetOpenFilename( _
        fileFilter:="Excel Files (*.xls*), *.xls*", MultiSelect:=False)

        Workbooks.Open (SelectedFile)
        Set test = ActiveWorkbook

Dim SourceFolderLocation As String
Dim FileName As String
Dim SourceFile As String
MsgBox "Please select the data source file..."
SourceFolderLocation = "C\Users\user.name\Desktop"
ChDrive SourceFolderLocation
SourceFile = Application.GetOpenFilename( _
    fileFilter:="Excel Files (*.xls*), *.xls*", MultiSelect:=False)

    Workbooks.Open (SourceFile)
    Set wkbk = ActiveWorkbook

    test.Activate

    'Test1
    'Select empty cell in Chart template 
    Range("C28").Select
    'Populate with pivot table data from sourceFile
    ActiveCell.FormulaR1C1 = _
        "=GETPIVOTDATA(""  Value"",'[wkbk]ActCost_PIVOT'!R3C1,""Team"",""Field1"",""Row Descrption"",""Row1"",""Type"",""DataPoint1"")"

    'Repeat for next cell
    Range("C27").Select
    ActiveCell.FormulaR1C1 = _
        "=GETPIVOTDATA(""  Value"",'[wkbk]CRActCost_PIVOT'!R3C1,""Team"",""Field1"",""Row Descrption"",""Row1"",""Type"",""DataPoint2"")"

[已解决] 问题 2。与问题 1 类似,我想制作诸如“TypeName”或“TeamName”变量之类的东西。我可以像这样在 Sub 之外声明它们吗 -

    Dim TeamName As String

    Sub()

    TeamName = "Tigers"

    End Sub

感谢您的帮助!

【问题讨论】:

  • 您过度使用“SourceFile” 它是子名称、字符串变量和工作簿对象。使用单独的变量。
  • 我已经更改了 Sub 的名称。谢谢你的提示!也就是说,我希望 Workbook A 成为变​​量“SourceFile”,以便在数据透视表代码中我可以从用户选择的任何 SourceFile 中提取。此外,我不想将“工作簿 A”硬编码到数据透视公式中,因为它不会总是被称为“工作簿 A”
  • SourceFile 应该是字符串,而不是变体。 究竟是什么不适合你?
  • 我已将 SourceFile 更改为字符串。现在的确切问题是:填充工作簿 B(即图表文件)。然而,每个值都显示“#REF!”,即使 SourceFile(又名工作簿 A)中有一个值。我认为这与变量 SourceFile...
  • 请看我的回答,一步一步做事(=用变量替换字符串),不会有任何问题。无论如何,依靠如此复杂的公式来处理 VBA 是一种非常低效的方法。针对特定问题的简单公式可能是可以接受的;但当 VBA 对象轻松提供更好的信息时,情况并非如此。从“纯 Excel”迁移到 VBA 的原因之一就是停止使用千里之外的公式。

标签: vba variables excel


【解决方案1】:

在 VBA 中定义全局变量(在任何子/函数之外)没有问题。您为TeamName 提出的建议很好(将变量定义写在给定模块的顶部)。之后您可以在此模块中使用此变量而不会出现任何问题。例如通过这样做:

ActiveCell.FormulaR1C1 = _
        "=GETPIVOTDATA(""  Sum"",'[SourceFile]WorkbookA_PIVOT1'!R3C1,""Team/Branch""," & """" & TeamName & """" & ",""Row Descrption"",""RowName"",""Type"",""TypeName"")"

如您所见,您必须注意引号以防被要求(以逃避它们)。避免混淆的一个技巧是将它们完全分开(“”“”),如上所示。

我想强调的另一个问题是,您可以直接通过 VBA 访问任何 PivotTable 的所有内容(您不需要问题中的公式):

 Dim pivotTable As pivotTable
 Set pivotTable = ActiveSheet.PivotTables("PivotTable Name")

通过pivotTable 变量,您可以完全访问给定数据透视表的所有内容。这代表了 VBA 相对于 Excel 的优势,您应该将其最大化(如果您继续依赖公式,为什么还要使用 VBA?)。

我猜他们在我前面提到的答案中是隐含的,但只是为了确保你有我对你的具体问题的答案:

  1. 使工作簿 A 的名称成为变体:我希望用户选择的文件名为“SourceFile”。这不起作用......不知道为什么...... - >如果你有一个你想要的代码,你可以用一个变量替换一个字符串(例如:“workbookA”),只需插入变量在正确的位置并通过&s 将其与剩余位连接起来。如果有引号,您必须按照上面的建议转义它们。
  2. 与问题 1 类似,我想创建诸如“TypeName”或“TeamName”变量之类的东西。我可以像这样在 Sub 之外声明它们吗 -> 您为 TeamName 建议的代码是正确的,您应该为要全局使用的任何其他(字符串)变量模拟它。尽管如此,请记住,拥有太多全局变量并不是一个好的编码习惯;打算尽可能地依赖局部变量。

【讨论】:

  • 感谢您的回复。我将研究您的建议 - 即 PivotItems 与整个公式。我没有考虑过这种方法。
  • @javaNewb37 好的。这是从新事物开始的正确方法:学习从中可以得到什么,而不是把旧的东西带进来:) 这里有一个你可能会觉得有用的链接(作为你可以轻松完成的示例):@ 987654321@
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2017-02-26
  • 2013-12-18
  • 1970-01-01
  • 2019-12-09
  • 2016-09-09
相关资源
最近更新 更多