【问题标题】:Range not working with Excel table using Autofilter from checkbox criteria范围不适用于使用复选框条件中的自动过滤器的 Excel 表
【发布时间】:2019-06-02 08:15:09
【问题描述】:

我想要做的是使用一个多复选框表单来根据我的“项目”工作表中的表格设置过滤器值。我已经能够成功地对个人进行这项工作,但是我需要做的是采用当前 33 个复选框的任意组合来过滤符合所有选定条件的行。以下是我目前拥有的,并且它一直在范围内。我的范围运行列 K:AQ,其值等于 11 到 43,如下所示。

Private Sub FilterButton_Click()

Dim wb As Workbook: Set wb = ThisWorkbook 
Dim ws As Worksheet
Set ws = wb.Sheets("Projects")
Dim fld As Long
For fld = 11 To 43
Next

If frmSearch.CheckBox1 = True = True Or _
frmSearch.CheckBox2 = True Or frmSearch.CheckBox3 = True Or _
frmSearch.CheckBox4 = True Or frmSearch.CheckBox5 = True Or _
frmSearch.CheckBox6 = True Or frmSearch.CheckBox7 = True Or _
frmSearch.CheckBox8 = True Or frmSearch.CheckBox9 = True Or _
frmSearch.CheckBox10 = True Or frmSearch.CheckBox11 = True Or _
frmSearch.CheckBox12 = True Or frmSearch.CheckBox13 = True Or _
frmSearch.CheckBox14 = True Or frmSearch.CheckBox15 = True Or _
frmSearch.CheckBox16 = True Or frmSearch.CheckBox17 = True Or _
frmSearch.CheckBox18 = True Or frmSearch.CheckBox19 = True Or _
frmSearch.CheckBox20 = True Or frmSearch.CheckBox21 = True Or _
frmSearch.CheckBox22 = True Or frmSearch.CheckBox23 = True Or _
frmSearch.CheckBox24 = True Or frmSearch.CheckBox25 = True Or _
frmSearch.CheckBox26 = True Or frmSearch.CheckBox27 = True Or _
frmSearch.CheckBox28 = True Or frmSearch.CheckBox29 = True Or _
frmSearch.CheckBox30 = True Or frmSearch.CheckBox31 = True Or _
frmSearch.CheckBox32 = True Or frmSearch.CheckBox33 = True Then

ws.Range("K2:AQ1500").AutoFilter Field:="fld", Criteria1:="<>"

End If
End Sub

【问题讨论】:

  • 去掉fld周围的引号,它是一个变量而不是一个实际的字符串。字段编号也是相对的,例如K 将是您的自动过滤器范围中的第 1 列。
  • 这消除了错误,但是它没有通过过滤器返回任何值。我看看我能不能让它工作。谢谢!
  • 好的,例如,如果我将字段值修改为 12,它将选择表中的第 12 列。我将我的 fld 变量改回 11 到 43 但是现在我再次收到范围错误,尽管它只是我更改的字段。如果我能找到解决方案,我会继续努力并更新。如果您有任何想法,请告诉我。谢谢
  • 您的范围是 33 列宽,因此您的循环需要从 1 运行到 33。
  • 当我以这种方式设置它时,我可以毫无错误地运行,但是它什么也没选择。

标签: excel vba checkbox autofilter


【解决方案1】:

您的代码在If frmSearch.CheckBox1 = True = True 处是否没有太多“True” 部分?

试试下面。

Private Sub FilterButton_Click()

Dim wb As Workbook: Set wb = ThisWorkbook 
Dim ws As Worksheet
Set ws = wb.Sheets("Projects")
Dim fld As Long
For fld = 11 To 43
Next

If frmSearch.CheckBox1 = True Or _
frmSearch.CheckBox2 = True Or frmSearch.CheckBox3 = True Or _
frmSearch.CheckBox4 = True Or frmSearch.CheckBox5 = True Or _
frmSearch.CheckBox6 = True Or frmSearch.CheckBox7 = True Or _
frmSearch.CheckBox8 = True Or frmSearch.CheckBox9 = True Or _
frmSearch.CheckBox10 = True Or frmSearch.CheckBox11 = True Or _
frmSearch.CheckBox12 = True Or frmSearch.CheckBox13 = True Or _
frmSearch.CheckBox14 = True Or frmSearch.CheckBox15 = True Or _
frmSearch.CheckBox16 = True Or frmSearch.CheckBox17 = True Or _
frmSearch.CheckBox18 = True Or frmSearch.CheckBox19 = True Or _
frmSearch.CheckBox20 = True Or frmSearch.CheckBox21 = True Or _
frmSearch.CheckBox22 = True Or frmSearch.CheckBox23 = True Or _
frmSearch.CheckBox24 = True Or frmSearch.CheckBox25 = True Or _
frmSearch.CheckBox26 = True Or frmSearch.CheckBox27 = True Or _
frmSearch.CheckBox28 = True Or frmSearch.CheckBox29 = True Or _
frmSearch.CheckBox30 = True Or frmSearch.CheckBox31 = True Or _
frmSearch.CheckBox32 = True Or frmSearch.CheckBox33 = True Then

ws.Range("K2:AQ1500").AutoFilter Field:="fld", Criteria1:="<>"

End If
End Sub

【讨论】:

  • 确实如此,但我认为它仍应评估为 TRUE。
  • 我更正了重复的 True 但是我仍然收到错误 1004“范围类的自动过滤方法失败。”不过,谢谢你抓住它。我已经盯着这个太久了。
【解决方案2】:

所以我不知道您的 UserForm 是什么样的,但如果可以的话,我建议您将这些 CheckBoxes 移到 Frame 中,这样您就可以更轻松地循环它们......就像这样:

Private Sub FilterButton_Click()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet
    Set ws = wb.Sheets("Projects")

    Dim i As Integer

    ' For each child control in the frame
    For i = 0 To Frame1.Controls.Count - 1

        ' If the child control is a check box
        If TypeOf Frame1.Controls.Item(i) Is CheckBox Then

            ' If the CheckBox is checked
            If Frame1.Controls.Item(i).Value Then

                 'Your code here...
                 Debug.Print (i & " " & Frame1.Controls.Item(i).Name)
            End If
        End If
    Next i
End Sub

至于应用过滤器,听起来每个复选框都应该链接到您范围内的列...(意思是 Checkbox1 ==> 'K'?)我会这样做:(替换'您的代码这里'从上面)

' Add a filter to the column at the index of 'i' (+1 so we aren't using base 0)
ws.Range("K2:AQ1500").AutoFilter Field:=i + 1, Criteria1:="<>"

如果您不理解代码,请询问!我很乐意解释任何事情。请记住,复制/粘贴不会教! :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多