2013-08-20 68 views
2

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

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

感谢您的帮助!

+1

您正在过度使用“SourceFile”它是一个子的名称,一个字符串变量和一个工作簿对象。使用单独的变量。 –

+0

我已更改Sub的名称。谢谢你的提示!也就是说,我希望工作簿A是一个变量“SourceFile”,以便在数据透视表代码中,我可以从用户选择的任何SourceFile中抽取。此外,我不想将“工作簿A”硬编码到数据透视公式中,因为它不会总是被称为“工作簿A” – javaNewb37

+1

“SourceFile”应该是一个字符串,而不是变体。什么*确切*不适合你? – Joe

回答

0

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

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. 制作工作簿中的名称变体:我想要的文件用户选择被称为“SourceFile”。这是行不通的......不知道为什么...... - >如果你有一个代码工作,你可以用一个变量替换一个字符串(例如:“workbookA”),只需插入变量在正确的地方,并通过& s与其余的位连接起来。如果有引号,你必须按照上面的建议逃离它们。
  2. 与问题1类似,我希望将“TypeName”或“TeamName”变量设为类似。我可以像这样在Sub之外声明它们吗?>您为TeamName提出的代码是正确的,您应该为其他想要全局使用的(字符串)变量进行模拟。尽管如此,请记住,拥有太多全局变量并不是一个好的编码习惯;打算尽可能依靠局部变量。
+0

谢谢你的回应。我会研究一下你的建议 - 即PivotItems与整个公式。我没有考虑过这种方法。 – javaNewb37

+0

@ javaNewb37行。当从新的东西开始时,这是正确的方式:学习你可以从中获得什么,而不是将旧东西带入:)在这里你有一个你可能会觉得有用的链接(作为你可以轻松做的一个样本):http ://msdn.microsoft.com/en-us/library/hh243933(v = office.14)的.aspx – varocarbas

相关问题