【问题标题】:How do i filter a range in another sheet with VBA without activating the sheet如何在不激活工作表的情况下使用 VBA 过滤另一个工作表中的范围
【发布时间】:2018-09-18 08:17:14
【问题描述】:

早安,

我在使用设置范围时遇到问题,并且在使用非活动工作表中的设置范围时非常令人沮丧。

问题是:

我有一张名为“仪表板”的工作表。 In this sheet i have a Listbox that when selected will filter values (based on listbox.column value) on a Table in another sheet called "Budget".但是,我收到错误 1004(范围类的自动过滤方法失败),在关闭错误后过滤范围。所以它似乎以某种方式工作,但是它给了我错误。

下面的代码是我用来过滤范围的代码。它被插入到“仪表板”工作表对象中。

Private Sub DashboardBudgetlst_Change()

Dim rng As Range
Dim i As Integer

  i = Me.DashboardBudgetlst.ListIndex

    If i >= 0 Then
     If Me.DashboardBudgetlst.Selected(i) And Me.DashboardBudgetlst.Column(0, i) <> "" Then
          Set rng = Budget.Range("B1:E" & lrow(Budget, "A"))
          rng.AutoFilter 1, Me.DashboardBudgetlst.Column(1, i)
          Set rng = Nothing
     End If
   End If

End Sub

该宏将过滤用于图表的范围,因此将过滤我的图表的值。我也不想使用数据透视表,因为它很慢。

进一步探索这个问题。如何使用在另一个工作表中设置的一个工作表中的范围,而无需激活该范围的工作表? (大多数时候我必须在使用该工作表的设置范围之前执行 Sheet.Activate)。

你们知道解决方法吗?为什么设置范围会出现这个问题?

我知道关于范围有类似的问题,但没有一个具有相同规格的问题。

附加信息(编辑):

1-在线出错:

 rng.AutoFilter 1, Me.DashboardBudgetlst.Column(1, i)

2- 列表框索引 >= 0 以确保列表框不为空并且有一个项目被选中。当列表框为空时,listindex = -1。

3- lrow(Budget, "A") 调用以下函数来获取指定工作表中的最后一行:

   Function lrow(SH As Worksheet, col As String)
        lrow = SH.Cells(Rows.Count, col).End(xlUp).Row
   End Function

4- 在错误行之前使用 msgbox rng.address,我收到 $B$1:$E$5 作为地址。

5-我做了一个临时解决方法,使用

On Error Resume Next

6- Me.DashboardBudgetlst.Column(1, i) 的值是要过滤的关键字,取决于选择。列表框的输入范围与我过滤的范围相同。所以我从标题“项目”下的列表中选择列“1”。当我从列表框中选择某些内容时,我希望它按该预算项目过滤,有时可以是“住宿”或我那里的任何其他内容。

7- Debug.Print on :

Debug.Print rng.AutoFilter; 1, Me.DashboardBudgetlst.Column(1, i)

在立即窗口返回列表框中选择旅行费用:

True 1        Travel Expenses

8-一些截图:

仪表板表中的列表框(Excel 视图)

预算表中的范围(Excel 视图)

正在使用的对象(VBA 视图)

它在我关闭过滤器将应用的错误后工作。但是我想知道是否有另一种解决方法,我不确定是否使用“On Error Resume Next”(这对您的代码有害吗?)

【问题讨论】:

  • 你在哪一行得到错误?以及如何“关闭错误”?另外,如果不是&gt;=0llstIndex 会是什么?有-1吗?
  • 还有其他问题。 ...现在还有两个:lrow 是什么?在错误之前rng.Address 的值是多少? (通过在错误前添加一行来查找:MsgBox rng.Address
  • 这个Me.DashboardBudgetlst.Column(1, i)的值是多少?如果工作表 Code Name 确实是“预算”,您似乎正在为另一张工作表设置正确的范围
  • @paulbica 我编辑了问题并在第 6 点回答了你。工作表对象(在 VBA 中)的名称确实是预算。当我使用另一张纸上的设定范围而没有激活该范围中的第二张纸时,这种错误似乎经常发生在我身上,这很奇怪。筛选程序位于工作表仪表板代码中,并筛选预算工作表中的范围。有什么想法吗?
  • 在不选择或激活其他工作表的情况下使用范围的最常见问题是范围没有明确限定: Range("A1") 可以在任何工作表上,但如果不是默认情况下,Excel 将使用 Activesheet (屏幕上可见的工作表。您确实像 Budget.Range("B1... 一样正确地限定了您的范围,这很棒!On Error Resume Next 特别适合初学者因为你不理解或不知道你隐藏的错误 - 所以你的动力也很好!

标签: vba excel named-ranges


【解决方案1】:

我能够复制错误

根据列表框中选择的项目数,问题似乎是触发了多个_Change 事件

我能够通过使用事件标志来停止错误


Option Explicit

Private Sub DashboardBudgetlst_Change()
    Dim rng As Range, i As Long, lstItm As String, crit As String, startIndex As Long

    If Application.EnableEvents = False Then Exit Sub    'If flag is Off exit Sub

    Application.EnableEvents = False    'Turn flag Off
    With Me.DashboardBudgetlst
        i = .ListIndex
        If i >= 0 Then
            If .Selected(i) And .Column(0, i) <> "" Then

                Set rng = Budget.Range("B1:E5") ' & lrow(Budget, "A"))
                rng.AutoFilter 1, .Value

            End If
        End If
    End With
    Application.EnableEvents = True    'Turn flag back On
End Sub

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2014-09-27
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多