使用VBA将值设置为.Function

我目前有一个function设置,将所选的数据透视表的所有值平均更改。

它工作正常,我已经组装了一个表格,通过一个价值,工作得很好。

在这一点上,我想要做的就是让它决定要把价值转化成什么。

然而,我仍然得到一个Type-Mismatch错误。 这是因为它正在被读作一个string。 我怎么能调整呢?

 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 

当然,编译时variables的名称(如xlAverage )不一定会报告给运行时,它只是一个整数常量。 编译之后,常量名称不见了。

很多方法可以解决这个问题,但是他们可能会从复杂的types库的使用中解脱出来,而这些types库在所有平台上都是不可用的,下面我提出一个相对简单的解决scheme,它使用字典来跟踪常量名称之间的映射和他们的价值。

 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 

顺便说一句,在这个方法中,你没有义务映射与variables相同的名字。 你可以自由映射任何想要在列表框中显示的名字; 即"Mimimum", "Standard Deviation", etc..

PS

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

CountNumbers – > CountNums

StdDev – > StDev

StdDevp – > StDevP

您的尝试不起作用,因为您需要传递常量值,而不是string。 xlSum,例如,是-4157。 你可以计算出如下的内容:

 debug.print clng(xlSum) 

这应该为你工作:

 Private Sub CommandButton1_Click() 'Define Constants Const C_SUM As Long = -4157 Const C_COUNT As Long = -4112 Const C_AVERAGE As Long = -4106 Dim ptf As Excel.PivotField With Selection.PivotTable .ManualUpdate = True For Each ptf In .DataFields With ptf Select Case ListBox1.Value Case "Sum" .Function = C_SUM Case "Count" .Function = C_COUNT Case "Average" .Function = C_AVERAGE End Select .NumberFormat = "#,##0" End With Next ptf .ManualUpdate = False End With End Sub 

您可以创build函数来返回名称的值,如:

 Private Function GetFunctionValue(ByVal FunctionName As String) As Long Dim value As Long Select Case FunctionName Case "Sum" value = xlSum Case "Count" value = xlCount Case "Average" value = xlAverage Case "Max" value = xlMax Case "Min" value = xlMin Case "Product" value = xlProduct Case "CountNums" value = xlCountNums Case "StDev" value = xlStDev Case "StDevp" value = xlStDevP Case "Var" value = xlVar Case "Varp" value = xlVarP End Select GetFunctionValue = value End Function 

更改作业:

  With ptf .Function = GetFunctionValue(ListBox1.Value) .NumberFormat = "#,##0" End With