2017-02-06 5 views
8

Ich habe derzeit eine Funktion eingerichtet, die alle Werte einer ausgewählten Pivot-Tabelle als Durchschnittswert ändert.Einstellung von .Function mit VBA

Es funktioniert gut, und ich habe ein Formular zusammengestellt, das einen Wert übergibt, der auch gut funktioniert.

Was ich an dieser Stelle tun möchte, ist, dass es entscheidet, worauf die Werte zu setzen sind.

Ich bekomme jedoch immer eine Type-Mismatch Fehler. Dies liegt daran, dass es als String gelesen wird. Wie könnte ich das anpassen?

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 
+3

Ich habe so etwas wie dies in der Vergangenheit versucht und ich am Ende eine Tabelle mit dem Wert der Aufzählung Aufbau die Art der Berechnung (F2 drücken einzustellen und der Suche nach 'XlConsolidationFunction') – R3uK

+0

[Erstellen Sie zwei Spalten in der Listbox, richten Sie Text- und Wertespalten ein] (http://stackoverflow.com/a/11062291/11683), fügen Sie beide Titel hinzu (z. B. '" Sum "') und Wert (z. B. 'xlSum') für jedes Element, verwenden Sie" Value "des ausgewählten Elements in' CommandButton1_Click'. – GSerg

Antwort

3

Natürlich den Namen einer Variablen bei der Kompilierung, wie xlAverage, ist nicht unbedingt gemeldet zur Laufzeit, wo es einfach eine ganze Zahl ist. Nach der Kompilierung sind die Namen der Konstanten verschwunden.

Es gibt viele Möglichkeiten, um diesen, aber sie könnten von der komplizierten Verwendung von Typbibliotheken gehen, die zudem nicht auf allen Plattformen zur Verfügung stehen, auf die relativ einfache Lösung, die ich unten vorschlagen, die ein Wörterbuch verwendet, um zu verfolgen die Zuordnungen zwischen den Namen der Konstanten und ihren Werten.

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 

Übrigens, in dieser Methode müssen Sie nicht die gleichen Namen wie die Variablen zuordnen. Sie können alle Namen frei benennen, die Sie im Listenfeld anzeigen möchten. h. "Mimimum", "Standard Deviation", etc..

p.s.

Bitte beachten Sie, dass Sie einige Fehler in den Namen hatte:

CountNumbers ->CountNums

StdDev ->StDev

StdDevp ->StDevP

0

Ihr Versuch funktioniert nicht, weil Sie die konstanten Werte, nicht die Zeichenfolgen übergeben müssen. xlSum zum Beispiel ist -4157. Sie können herausfinden, was jeder ist wie folgt:

debug.print clng(xlSum) 

Dies sollte für Sie arbeiten:

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 
+0

Wenn es nützlich ist, kann die Enumeration auch im Objektbrowser des VBE durch Suchen im Literaltext erhalten werden. –

0

konnte Sie Erstellen Sie eine Funktion, um den Wert der Namen zurückzugeben, wie zum Beispiel:

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 

Die Änderung Zuordnung:

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