2013-02-04 61 views
0

我是VBA中的新成员,所以我无法执行此操作。从已过滤的单元格中选择一个选项

我有21张工作簿。我想在第三张表格(包含一个数据透视表)中选择一个单元格,我可以做到这一点。这个单元格B3包含一个过滤器,我可以从过滤的下拉菜单中选择如何对数据进行分类。它包含我是否想按名字或姓氏或全部过滤。

我通常的惯例是首先选择名字,然后复制过滤的数据并粘贴到另一张纸上。然后回到同一张表并按姓氏过滤,然后复制过滤的数据并将其粘贴到粘贴早期数据的工作表上。

我需要帮助如下:

  1. 如果选择任一或所有复选框,然后取消选择。
  2. 选择过滤器的FIRST_NAME复选框下拉
  3. 取消选择FIRST_NAME框并选择姓氏箱
  4. 最后取消选择姓氏,然后选中所有复选框

我用下面的代码

Public Sub Open_Sheet3() 
Workbooks("MASTER.xlsx").Activate 
ActiveWorkbook.Sheets("Sheet3").Activate 
ActiveSheet.PivotTables("PivotTable1").PivotFields("Technology").CurrentPage = _ 
    "(All)" 
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Technology") 
.PivotItems("Mobility").Visible = False 
.PivotItems("(blank)").Visible = False 
.PivotItems("Enterprise Messaging Tech").Visible = False 
End With 
End Sub 
+1

嗨Nishant,欢迎来到SO!你到底需要什么帮助?如果你基本上想自动化你的线程,开始录制一个宏,手动完成上面的过程 - 然后看看代码(Alt-F11带你到Visual Basic编辑器)... –

+0

嗨,彼得,问题在于我的整个团队都在查看VBA,所以有时候下拉过滤器中的复选框会有不同的选择。所以如果我使用录制的宏,它将只使用我这样做的模式。如果除了录制的宏中的其他复选框被选中,则它会提出问题。 – Nishant

+0

我需要帮助的是以下内容: 1.如果选中了任何或全部复选框,则取消选择它们。 2.在过滤器下拉列表中选择first_name ceckbox 3.取消选择first_name框并选择姓氏框 – Nishant

回答

0

此代码应该做你想做的。只需替换工作表/数据透视表/数据透视字段的名称并填写copyStuff子。

Private Sub YourProcedure() 
    SelectItem "first_name" 
    CopyStuff 

    SelectItem "last_name" 
    CopyStuff 

    SelectItem "all" 'in case you have an element called "all" 
    CopyStuff 

    SelectAll 'In case you mean the "(All)" 'element', i.e. include everything 
    CopyStuff 

End Sub 

Private Sub SelectItem(strItemName As String) 
    Dim i As Integer 

    'Change to your worksheet/pivot talbe/pivot field name! 
    With Worksheets("Sheet 1").PivotTables("PivotTable1").PivotFields("a") 

     .PivotItems(1).Visible = True 'at least one item always needs to be visible 
     For i = 2 To .PivotItems.Count 
      .PivotItems(i).Visible = False 
     Next 
     .PivotItems(strItemName).Visible = True 
     If .PivotItems(1).Name <> strItemName Then .PivotItems(1).Visible = False 

    End With 
End Sub 

Private Sub SelectAll() 
    Dim i As Integer 

    'Change to your worksheet/pivot talbe/pivot field name! 
    With Worksheets("Sheet 1").PivotTables("PivotTable1").PivotFields("a") 
     For i = 1 To .PivotItems.Count 
      .PivotItems(i).Visible = True 
     Next 
    End With 
End Sub 

Private Sub CopyStuff() 
    'Your code goes here 
End Sub 

一些解释:

如果你想取消枢轴领域的项目,你需要确保有至少在任何时候选择的项目。因此,您不能取消选择全部,然后选择您想要的项目 - 而是选择第一个项目,取消选择其他项目,选择您的项目并取消选择第一个项目,除非它是您的项目。这就是SelectItem正在做什么

+0

谢谢彼得......我会给它一个去..我相信它会帮我做我想做的事..... 对不起,如果我的问题不清楚......这是我的第一个问题在堆栈溢出... 感谢您的帮助 – Nishant

+0

不客气!当问题解决后,请不要忘记接受答案来解决问题。 –

+0

嘿彼得运行代码时出现了一些问题。 1.在{Private Sub SelectItem(strItemName As String)} Line {If .PivotItems(1).Name strItemName Then .PivotItems(1).Visible = False}显示错误 2.我把an = after那么错误无法设置可见属性。 3.然后我将它从False更改为True,然后它首先选择第一个值。然后代替第一个选择下一个,然后选择下一个,而第一个可见。 我该怎么办?有什么建议么。 – Nishant

相关问题