【问题标题】:VBA multiple checkboxes to control multiple pivot tablesVBA 多个复选框来控制多个数据透视表
【发布时间】:2015-07-08 18:26:06
【问题描述】:

再次,我需要一点帮助,我将不胜感激。

基本上,在我的仪表板页面上,我有几个复选框,用于在后台控制大量数据透视表。

我有称为“确定”、“暂定”、“待定”、...的复选框,也对应于数据透视字段中的值。

我在不同的工作表中有许多名为“Hidden_​​1”或“Hidden_​​2”的数据透视表,但都具有相同的结构。

我的想法是,如果有人选中“确定”,它将在名为“状态”的字段中的所有数据透视表中被选中。如果有人“取消选中”此复选框,则枢轴会做出反应。

为此,我使用了我之前创建的代码,并且运行良好:

    Sub checkbox1()
Application.ScreenUpdating = False
On Error Resume Next  
Dim pt As PivotTable, wks As Worksheet
For Each wks In ActiveWorkbook.Worksheets
    For Each pt In wks.PivotTables
        With pt
            If .Name = "Hidden_1" Or .Name = "Hidden_2" Then
                .PivotFields("Status").CurrentPage = "definite"
            End If
        End With
    Next pt
Next wks 
Application.ScreenUpdating = True 
End Sub

但是,此代码仅选择一个值,因此如果有人选中了这些框,我不能同时选择“确定”和“待定”。现在所有复选框都有一个单独的代码,其中只有 .CurrentPage = "checkboxname" 被更改..

我有两个问题:

1) 选择多个值的最佳方法是什么。例如。如果选中了“确定”和“待定”复选框,则数据透视表应该在“状态”字段中选择了两个值“确定”和“待定”

2)“取消选择”值的最佳方法是什么?现在,每次单击复选框时,我的程序 checkbox1 都会运行。而且我希望它仅在我“检查”它时运行。 现在我正在尝试将复选框与单元格链接,例如“确定”有 H10,所以我的代码以以下行开头:

If Range("H10").Value = True Then
'code to select the value in "Status" field
Else
'code to unselect the value in "Status" field
End If

我还应该指出,我不能使用 ActiveX Checkbox,因为我有错误:“无法插入对象”并且我使用了表单控件。我读到这个错误与我安装的补丁有关。

感谢大家的帮助, 马特

【问题讨论】:

  • 如果您想摆脱无法插入对象的错误,请查看support.microsoft.com/en-gb/kb/3025036,它将告诉您如何修复它
  • 亲爱的 Sam,很遗憾,我不允许安装任何修复程序,我需要等到它在公司级别完成。
  • 在该链接上有一个手动说明该做什么。它涉及关闭所有 excel 实例并删除临时文件夹和应用数据中的某些文件
  • 我刚问过我的老板,他不让我这样做。无论如何,我最初的问题仍然是一样的。我也在努力,所以也许我可以自己做。

标签: vba checkbox pivot-table


【解决方案1】:

我研究了一下,找到了这样的解决方案:

Sub checkbox1()
Dim choice1, choice2, choice3, choice4, choice5, choice6, choice7
Dim oPI As PivotItem
Dim pt As PivotTable, wks As Worksheet

If Sheets("Hidden").Range("B6").Value = "True" Then
    choice1 = "Definite"
End If
If Sheets("Hidden").Range("B7").Value = "True" Then
    choice2 = "Tentative"
End If
If Sheets("Hidden").Range("B8").Value = "True" Then
    choice3 = "Hold/Option"
End If
If Sheets("Hidden").Range("B9").Value = "True" Then
    choice4 = "Pending"
End If
If Sheets("Hidden").Range("B10").Value = "True" Then
    choice5 = "Waitlist"
If Sheets("Hidden").Range("B11").Value = "True" Then
    choice6 = "Lost"
End If
If Sheets("Hidden").Range("B12").Value = "True" Then
    choice7 = "Cancelled"
End If
Sheets("Hidden_pivot1").PivotTables("Hidden_1").PivotFields("SalesStatus").ClearAllFilters
Sheets("Hidden_pivot1").PivotTables("Hidden_3").PivotFields("SalesStatus").ClearAllFilters
Sheets("Hidden_pivot2").PivotTables("Hidden_2").PivotFields("SalesStatus").ClearAllFilters
Sheets("Hidden_pivot2").PivotTables("Hidden_4").PivotFields("SalesStatus").ClearAllFilters

For Each wks In ActiveWorkbook.Worksheets
    For Each pt In wks.PivotTables
             With pt
                If .Name = "Hidden_1" Or .Name = "Hidden_2" Or .Name = "Hidden_3" Or .Name = "Hidden_4" Then
                    For Each oPI In pt.PivotFields("SalesStatus").PivotItems
                        Select Case oPI.Name
                                 Case choice1, choice2, choice3, choice4, choice5, choice6, choice7
                                 Case Else
                                oPI.Visible = False
                        End Select
                    Next
                End If
            End With
     Next pt
Next wks
End Sub

这项工作太慢了。如果宏可以添加和删除这些项目,而不是重新创建整个选择,那就更好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多