使用VBA

时间:2017-07-27 14:38:51

标签: excel vba excel-vba filter

我正在尝试通过VBA自动过滤Excel表。

该表有多行,目前位于Sheet2的B5:N584中。 该表的第一列将“Country”作为标题,这是我想要应用过滤器的列。我希望该表根据用户输入的国家名称自动过滤。国家/地区名称将位于Sheet2的单元格B3上,现在定义为“= Sheet1!A1”,即用户输入国家/地区。

我希望它的工作方式是: - 用户在Sheet1的单元格A1上写入国家/地区名称。 - 国家/地区自动拉到Sheet2的单元格B3。 - 根据Sheet2的单元格B3的内容,在第一列中过滤表。

这是我写的VBA代码:

    Public Sub Worksheet_Change(ByVal Target As Range)

   If Target.Address = Range("B3").Address Then
       Range("B5:N584").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B2:B3")
   End If

End Sub

在单元格B2上,我写了“国家”,就像在列标题中一样。

我所做的几乎正在发挥作用。唯一的问题是没有自动应用过滤器。单元格A1上的用户输入的国家/地区被拉到Sheet2的单元格B3,但是直到我单击单元格B3的公式栏并单击输入而不更改任何内容时才应用过滤器 - 然后过滤器将应用于下表。

我想知道什么可能阻止表自动检测到单元格B2上有一个新的国家/地区,而无需单击该单元格并按ENTER键。

谢谢。

2 个答案:

答案 0 :(得分:0)

设置工作表以在用户在单元格A1中输入数据时触发代码,以便检测此单元格中的更改并触发代码而不是等待B3更改。

   If Target.Address = Range("A1").Address Then
   Range("B5:N584").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B2:B3")

结束如果

答案 1 :(得分:0)

考虑到您有两张名为Sheet1和Sheet2的表格,而且该表格位于您指定范围内的Sheet2上。

还假设以下情况......

  1. 用户在Sheet1上的A1中输入国家/地区名称。
  2. 在Sheet2 B2上,标题Country与表格中B5中的标题相同。
  3. Sheet2上的B3具有公式= Sheet1!A1
  4. 确保以上所有假设都正确无误,从Sheet1模块中删除更改事件代码,然后将以下代码放在Sheet2模块上。

    Private Sub Worksheet_Calculate()
        Sheets("Sheet2").Range("B5").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Sheets("Sheet2").Range("B2:B3")
    End Sub
    

    修改

    实际上您可以删除工作表引用,因为代码位于Sheet2模块本身上。

    Private Sub Worksheet_Calculate()
        Range("B5").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B2:B3")
    End Sub