2

以下 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

谢谢你的帮助!

4

1 回答 1

0

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

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

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

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

 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是正确的,您应该为要全局使用的任何其他(字符串)变量模拟它。尽管如此,请记住,拥有太多全局变量并不是一个好的编码习惯;打算尽可能地依赖局部变量。
于 2013-08-20T14:31:14.193 回答