使用VBA将值设置为.Function

Bra*_*rad 8 excel vba pivot-table excel-vba

我目前有一个功能集,它将所选枢轴表的所有值更改为平均值.

它工作正常,我已经组装了一个表单,它传递一个工作正常的值.

在这一点上我想做的是让它决定将值转换为什么.

但是,我不断收到Type-Mismatch错误.这是因为它被读作字符串.我该如何调整呢?

Private Sub CommandButton1_Click()
  MsgBox xl & ListBox1.Value
  Dim ptf As Excel.PivotField
  With Selection.PivotTable
    .ManualUpdate = True
    For Each ptf In .DataFields
      With ptf
        .Function = "xl" & ListBox1.Value 'xlAverage works here
        .NumberFormat = "#,##0"
      End With
    Next ptf
    .ManualUpdate = False
  End With
End Sub

Private Sub ListBox1_Click()
End Sub

Private Sub UserForm_Click()
End Sub        

Private Sub UserForm_Initialize() 'Set Values Upon Opening       
  With ListBox1
    .AddItem "Sum"
    .AddItem "Count"
    .AddItem "Average"
    .AddItem "Max"
    .AddItem "Min"
    .AddItem "Product"
    .AddItem "CountNumbers"
    .AddItem "StdDev"
    .AddItem "StdDevp"
    .AddItem "Var"
    .AddItem "Varp"
  End With
End Sub
Run Code Online (Sandbox Code Playgroud)

A.S*_*S.H 4

当然,编译时变量的名称(例如xlAverage)不一定会报告给运行时,它只是一个整型常量。编译后,常量名称消失了。

很多方法可以解决这个问题,但它们可能会从类型库的复杂使用(而且并非在所有平台上都可用)到我下面建议的相对简单的解决方案,该解决方案使用字典来跟踪常量名称之间的映射以及他们的价值观。

Private Sub CommandButton1_Click()
    ' ...
    ptf.Function = GetEnumConsolidationFunction.item(ListBox1.Value)
    ' ...
End Sub

Private Sub UserForm_Initialize()
    Dim dict As Object, s
    Set dict = GetEnumConsolidationFunction
    For Each s In dict.Keys
        ListBox1.AddItem s
    Next
End Sub

' Our key function, fills a dictionary first time it is used
Function GetEnumConsolidationFunction() As Object
    Static dict As Object '<-- static because we want to fill it only once
    If dict Is Nothing Then
        Set dict = CreateObject("Scripting.Dictionary")
        With dict
            .Add "Sum", XlConsolidationFunction.xlSum
            .Add "Count", XlConsolidationFunction.xlCount
            .Add "Average", XlConsolidationFunction.xlAverage
            .Add "Max", XlConsolidationFunction.xlMax
            .Add "Min", XlConsolidationFunction.xlMin
            .Add "Product", XlConsolidationFunction.xlProduct
            .Add "CountNums", XlConsolidationFunction.xlCountNums
            .Add "StDev", XlConsolidationFunction.xlStDev
            .Add "StDevp", XlConsolidationFunction.xlStDevP
            .Add "Var", XlConsolidationFunction.xlVar
            .Add "Varp", XlConsolidationFunction.xlVarP
        End With
    End If
    Set GetEnumConsolidationFunction = dict
End Function
Run Code Online (Sandbox Code Playgroud)

顺便说一句,在这种方法中,您不必映射与变量相同的名称。您可以自由映射任何您想要在列表框中显示的名称;IE"Mimimum", "Standard Deviation", etc..

附注

请注意,您的名称中有一些拼写错误:

CountNumbers-->CountNums

StdDev-->StDev

StdDevp-->StDevP