【问题标题】:Excel VBA pivot table booleanExcel VBA 数据透视表布尔值
【发布时间】:2014-12-16 03:40:39
【问题描述】:

下面的 VBA 代码应该建议用户输入报告的月份,然后相应地更新所有数据透视表。 我面临的问题是,如果用户输入的月份不是枢轴项目之一(即“mayo”i/o“may”),它将弄乱我的数据透视表。所以我想检查输入框中输入的字符串是否是正确的pivotItems之一。

我收到一条错误消息,指出“需要对象” 当我声明我的 bool 时,我没有发现有什么问题。

有什么想法吗?

Sub ChooseMonth55()

Dim MyMONTH As Variant
Dim MyRepMon  As String
Dim Pi As Boolean
    Set Pi = ActiveSheet.PivotTables("PivotTable4").PivotFields("Test Month").PivotItems
    Pi = False
InputBoxMyMONTH:    MyMONTH = Application.InputBox("Enter the MONTH in a full text format")

    MyRepMon = MyMONTH

    Sheets("All results excl not tested").Select

    If MyRepMon = Pi Then
        MyRepMon = True
    End If

    If MyRepMon = True Then

        ActiveSheet.PivotTables("PivotTable4").PivotFields("Test Month").CurrentPage = MyRepMon
        ActiveSheet.PivotTables("PivotTable5").PivotFields("Test Month").CurrentPage = MyRepMon
        ActiveSheet.PivotTables("PivotTable6").PivotFields("Test Month").CurrentPage = MyRepMon
        ActiveSheet.PivotTables("PivotTable7").PivotFields("Test Month").CurrentPage = MyRepMon
        ActiveSheet.PivotTables("PivotTable13").PivotFields("Test Month").CurrentPage = MyRepMon
        ActiveSheet.PivotTables("PivotTable8").PivotFields("Test Month").CurrentPage = MyRepMon

    Else: MsgBox "There is a typo, please enter again the Month"
         GoTo InputBoxMyMONTH
    End If

End Sub

谢谢

【问题讨论】:

  • 设置 Pi 然后让它像这样背靠背地设置为假有什么意义?
  • 这可能是错误的抱歉,我在想我们必须声明布尔值并将其设置为 false 才能使代码正常工作。
  • 什么样的值在这里结束?:'ActiveSheet.PivotTables("PivotTable4").PivotFields("Test Month").PivotItems'??
  • 我想将 Pi 声明为所有可能的枢轴项目,具体来说是一月、二月、五月……
  • 我想确保输入框的结果是我pivot中的月份之一

标签: vba excel


【解决方案1】:

我建议您使用用户窗体和下拉框,或组合框来将用户的输入限制在您知道的工作月份

  • 创建工作表,您可以将其隐藏。插入您希望仅在其上列出的月份。

  • 插入用户表单

  • 为其命名,在其中插入一个 ComboBox 和一个标签。

  • 将“属性”窗口中组合框的行源设置为列出有效月份条目的范围。

现在在 VBA 的资源管理器窗口中右键单击用户表单。 插入此代码:

Private Sub ComboBox1_Change()
    Call ChooseMonth(ComboBox1.Value)
End Sub

您现在可以进一步简化您的原始代码,因为它提取的是准确月份,没有错误,除非您在月份源表上输入错误。

您的代码:

Sub ChooseMonth(myMonth As String)

    Sheets("All results excl not tested").Select

    ActiveSheet.PivotTables("PivotTable4").PivotFields("Test Month").CurrentPage = myMonth
    ActiveSheet.PivotTables("PivotTable5").PivotFields("Test Month").CurrentPage = myMonth
    ActiveSheet.PivotTables("PivotTable6").PivotFields("Test Month").CurrentPage = myMonth
    ActiveSheet.PivotTables("PivotTable7").PivotFields("Test Month").CurrentPage = myMonth
    ActiveSheet.PivotTables("PivotTable13").PivotFields("Test Month").CurrentPage = myMonth
    ActiveSheet.PivotTables("PivotTable8").PivotFields("Test Month").CurrentPage = myMonth

End Sub

【讨论】:

  • 是的,这确实是最好的选择。非常感谢您的帮助。
  • 由于这个确切的原因,我几乎完全依赖用户表单。我一直在努力将用户流程精简到最小的阻力和错误。
  • 附带说明,这也是您通过传递参数调用函数或子函数的方式。在组合框事件中,如果它发生变化,我们将组合框的值传递给您的代码,方法是将我们期望的内容放在子声明的 () 中。 Functions 和 Subs 之间的区别在于,在 Functions 中,您希望将结果传递回被称为 From 的代码中。因此,您可以从一段代码中调用“sum = AddTwoNumbers(x, y)”并期望取回这笔款项。可以这样声明,'Function AddTwoNumbers( x as Long, y As Long) As Long'
【解决方案2】:

试试这个功能。它确定数据透视项目是否位于数据透视表内的特定数据透视字段中。

Public Sub Test_IsItemInPivotField()
  Debug.Print IsItemInPivotField("May", "Test Month", ActiveSheet.PivotTables("PivotTable1"))
  Debug.Print IsItemInPivotField("Mayy", "Test Month", ActiveSheet.PivotTables("PivotTable1"))   
End Sub

Public Function IsItemInPivotField(itemName As String, fieldName As String, pvt As PivotTable)
  Dim pvtItem As PivotItem

  For Each pvtItem In pvt.PivotFields(fieldName).PivotItems
      If pvtItem.Name = itemName Then
          IsItemInPivotField = True
          Exit Function
      End If
  Next

  IsItemInPivotField = False
End Function

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2016-05-10
  • 2015-02-07
相关资源
最近更新 更多