2017-02-06 7 views
8

現在、選択したピボットテーブルのすべての値を平均値に変更する機能が設定されています。VBAを使用した.Functionへの値の設定

正常に動作し、正しく動作する値を渡すフォームをアセンブルしました。

ここで私がしたいことは、値を何にするかを決めることです。

しかし、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 
+3

私は過去にこのような何かを試してみたと私は計算のタイプ(F2キーを押しを設定して検索する列挙の値を持つテーブルを構築し終わりました'XlConsolidationFunction') – R3uK

+0

[リストボックスに2つの列を作成し、テキストと値の列を設定する](http://stackoverflow.com/a/11062291/11683)、両方のキャプションを追加する'' Sum '')と値(例えば 'xlSum')を指定するには、' CommandButton1_Click'で選択した項目の 'Value'を使います。 – GSerg

答えて

3

、コンパイル時に変数の名前、などをxlAverageよう:

debug.print clng(xlSum) 

これはあなたのために働く必要があります:あなたは、次のようにそれぞれが何であるかを作業することができますこれは単純に整数の定数です。コンパイル後、定数名はなくなります。

あり、この周り多くの方法がありますが、それらはさらに追跡するための辞書を使用して、私は以下の提案比較的単純な溶液に、すべてのプラットフォームで利用できないタイプライブラリの複雑な使用から行くかもしれません定数の名前とその値の間のマッピング。

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 

ところで、この方法では、変数と同じ名前を割り当てる必要はありません。リストボックスに表示する任意の名前を自由にマップできます。すなわち"Mimimum", "Standard Deviation", etc..

p.s.

あなたが名前でいくつかのタイプミスがあったことに注意してください:

CountNumbers - >CountNums

StdDev - >StDev

StdDevp - >StDevP

0

文字列ではなく定数値を渡す必要があるため、この試行は機能しません。たとえば、xlSumは-4157です。必ずしも報告されていない、もちろん

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

有用な場合は、リテラルテキストを検索して、VBEのオブジェクトブラウザで列挙を取得することもできます。 –

0

あなたは可能性があり名前の値を返す関数を作成する:

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 
関連する問題