如何使用excel vba宏将变量值插入到getpivotdata公式中

时间:2017-12-19 19:42:27

标签: excel vba

所以我学习了数据透视表很棘手,字符串变量语法也是如此,在VBA中使用引号也是如此。我尝试(并且失败)使用这三个!

我正在尝试从一个非常大/复杂的数据透视表中收集大量作业数据中的一个数据。我想在A1中选择一个作业号,并使用所选的作业号自动更新数据透视表公式以返回一个数字结果。

我目前遇到两个问题:1)获取' getpivotdata'的报价中的作业编号的语法。公式不起作用,2)它在执行代码时从作业号中删除零。

我的代码如下所示,当我执行它时,我希望看到这个公式填充在A2中:

=GETPIVOTDATA("Part Number",' Parts Status '!$A$8,"CHAR_FIELD3","11-008","MATERIAL STATUS MASTER","Avail")

但是得到:

=GETPIVOTDATA("Part Number",' Parts Status '!$A$8,"CHAR_FIELD3",11-8,"MATERIAL STATUS MASTER","Avail")

我的代码在这里

Sub Macro1()

Dim jobnumber As String

jobnumber = Worksheets("Macros test").Cells(1, "A").Value

Sheets("Macros test").Select
    Range("A2").Select
    ActiveCell.FormulaR1C1 = _
        "=GETPIVOTDATA(""Part Number"",' Parts Status '!R8C1,""CHAR_FIELD3""," & jobnumber & ",""MATERIAL STATUS MASTER"",""Avail"")"

2 个答案:

答案 0 :(得分:2)

如果您需要引号,请将其更改为:

"=GETPIVOTDATA(""Part Number"",' Parts Status '!R8C1,""CHAR_FIELD3"",""" & jobnumber & """,""MATERIAL STATUS MASTER"",""Avail"")"

此外,您可以在设置jobnumber后添加临时msgbox,以确保它符合您的想法:

MsgBox(jobnumber)

答案 1 :(得分:1)

我总是使用Chr()函数来处理VB中的引号。双引号是Chr(34),单引号是Chr(39)。您遇到的问题是,虽然jobnumber被定义为字符串,但您没有双引号。结果是Excel删除了公式11-008上的前导零,Excel将其视为Eleven减去8。在jobnumber周围添加双引号(Chr(34))解决了这个问题。

我总是把这些长串打成小块,这样我才能看到我输入的内容。下面的代码使用一个小的私有函数来构建您的透视字符串。

Public Sub PivotTest()

    Dim jobnumber As String

    jobnumber = Worksheets("Macros test").Cells(1, "A").Value

    Sheets("Macros test").Select
    Range("A2").Select
    ActiveCell.FormulaR1C1 = BuildPivotString(jobnumber)

End Sub

Private Function BuildPivotString(ByRef jobNum As Variant) As String
    Dim retVal As String

    retVal = "=GETPIVOTDATA("
    retVal = retVal & Chr(34) & "Part Number" & Chr(34)
    retVal = retVal & ",' Parts Status '!R8C1,"
    retVal = retVal & Chr(34) & "CHAR_FIELD3" & Chr(34) & ","
    retVal = retVal & Chr(34) & jobNum & Chr(34) & ","
    retVal = retVal & Chr(34) & "MATERIAL STATUS MASTER" & Chr(34) & ","
    retVal = retVal & Chr(34) & "Avail" & Chr(34) & ")"

    BuildPivotString = retVal
End Function