【问题标题】:Excel VBA AdvancedFilter via a UserForm ProblemsExcel VBA AdvancedFilter 通过用户窗体问题
【发布时间】:2018-12-13 16:42:59
【问题描述】:

我使用的是 Microsoft Office Pro Plus 2016。我有一个表 (ListObject),它是一个 Sharepoint 链接表和一个自定义用户窗体,其中包含 4 个组合框(区域、国家、IMType 和 LOB)。

我试图应用的逻辑是用户表单将自己呈现给用户,在后台它“取消过滤”列表。然后,最终用户可以在用户表单中选择标准,单击“确定”后,它将组合框的值输入到工作表的“标准”部分,然后执行高级过滤器。下图示例

以下是我要过滤的工作表的屏幕截图

:

诚然,在尝试了很多不同的方法来雕刻这只火鸡后,我已经迷失了我为解决这个问题而编写的各种不同的代码,其中一些我已经粘贴在下面,但我真的很欢迎一个闪亮的骑士穿着韵律盔甲,引导我远离这里的疯狂。我目前有两个问题:

1) 我收到“对象变量或未设置块变量”消息,并且表单使用这段代码初始化。有什么原因吗?

With FilterForm
.StartUpPosition = 0
.Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width)
.Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height)
.Show
End With

发布表单初始化并在用户表单上单击“确定”后,运行以下代码:

Private Sub cmdOK_Click()

Dim myTable As ListObject
Set myTable = ActiveSheet.ListObjects("MIMSPData")

Call AutoFilterCheck

Application.ScreenUpdating = False
Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ""

'    Range("'MIM Policy Governance Tracking'!MIMSPData").AdvancedFilter _
'        Action:=xlFilterInPlace, CriteriaRange:=Range("AI6:BK7"), Unique:=False
Call AdvancedFilteronSPData

Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ComboBox1.Value
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ComboBox2.Value
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ComboBox3.Value
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ComboBox4.Value

'    Range("'MIM Policy Governance Tracking'!MIMSPData").AdvancedFilter _
'        Action:=xlFilterInPlace, CriteriaRange:=Range("AI6:BK7"), Unique:=False
Call AdvancedFilteronSPData

Unload Me
Application.ScreenUpdating = True
End Sub

它引用的 VB 代码(AutoFilterCheck 和 AdvancedFilteronSPData)粘贴在下面,对我来说这是一个较晚的尝试,以解决自动过滤器代码似乎无法正常工作的事实。它们粘贴在下面以供参考:

Sub AutoFilterCheck()

Dim myTable As ListObject
Set myTable = ActiveSheet.ListObjects("MIMSPData")

With ActiveSheet
        .AutoFilterMode = False
        .Range("MIMSPData").AutoFilter
    End With

End Sub

最后一个

Sub AdvancedFilteronSPData()
Dim myTable As ListObject
Set myTable = ActiveSheet.ListObjects("MIMSPData")

    Range("MIMSPData").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("AI6:BK7"), Unique:=False
End Sub

简而言之,我想知道您是否可以查看我正在尝试做的事情(即根据组合框标准在我的 listobject 表上执行高级过滤器,并告知我在哪里错过了一个技巧,因为我一直在这里呆了 2 天,似乎在绕圈子。

非常感谢您的帮助,祝大家圣诞快乐。

【问题讨论】:

  • 对于第一个错误,您只需将 filterform.show 代码放在将显示用户表单的另一部分!
  • 更新:所以我记录了手动执行高级过滤器的步骤(数据 > 高级),我注意到在代码中,它将我的列表对象引用为“外部数据”,见下文。我想知道这是否与我的问题有关?
  • 谢谢 Imran,我会把它放在一个模块中并调用它。好建议:)

标签: excel vba userform autofilter


【解决方案1】:

所以我设法玩弄了代码,因为这样做,我@ve 能够解决我遇到的问题,所以想在这里发布我更新的代码。感谢 Imran 对我遇到的 UserForm 错误的评论。

不同之处似乎在于我引用 Table 对象的方式(而不是接受 Excel 的默认“记录”版本(即

Range("'MIM Policy Governance Tracking'!MIMSPData").AdvancedFilter

我改成:

Range("MIMSPData[#All]").AdvancedFilter

这似乎解决了我的问题。但是,如果那里的任何人都可以找到更好的方法,我会接受建议。我只是 VBA 的兼职涉足者,所以在这里欢迎大师的意见。希望这可以帮助其他人。

Private Sub cmdOK_Click()

'Clear existing entries cell values
Application.ScreenUpdating = False
Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ""

'Filter to show all
Range("MIMSPData[#All]").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("AJ6:AM7"), Unique:=False

'Input new cell values based on current criteria
Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ComboBox1.Value
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ComboBox2.Value
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ComboBox3.Value
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ComboBox4.Value

'Filter to show updated results
Range("MIMSPData[#All]").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("AJ6:AM7"), Unique:=False

Application.ScreenUpdating = True

Unload Me
End Sub

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多