Excel VBA在另一个工作簿中使用数据透视表数据

时间:2013-08-20 13:20:50

标签: excel vba variables excel-vba

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

问题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-

一样在Sub之外声明它们
    Dim TeamName As String

    Sub()

    TeamName = "Tigers"

    End Sub

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在VBA中定义全局变量(在任何子/函数之外)没有问题。您对TeamName的建议是没问题的(在给定模块的顶部写入变量define)。之后您可以在此模块中使用此变量而不会出现任何问题。例如,通过:

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

如您所见,您必须在需要时处理引号(以逃避它们)。如上所示,避免混淆的技巧就是将它们完全放入appart(“”“”)。

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

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

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

我猜他们在我上面提到的答案中含蓄,但为了确保,在这里你能得到我对你具体问题的答案:

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