使用不存在的过滤器进行错误处理

Error handling with non existing filter

我已经编写了一些 VBA 代码来创建一个应该自动过滤的数据透视表。有两种可能的过滤器:01。可能两者都存在,但也可能只存在其中之一。

我希望 Excel 首先在 0 上设置过滤器并将一些行复制到另一个 table(这就是 Call b02_articleunit0 所做的)。如果这样做了,我希望 Excel 对过滤器 1 做同样的事情,但不幸的是它不起作用。即使两个过滤器都存在,也只会处理第一个(在本例中为 0)。但它还应该处理第二个过滤器,并在最后用 Call SaveXLS 保存工作簿,如果可以执行,它工作正常。

您对如何优化我的代码有什么想法吗?:

Sub PivotTable()
[...]

Dim pf As PivotField
Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("Abgleich_ME1_ME2")
'Remove existing filter
pf.ClearAllFilters

'Filter on 0
On Error GoTo fehler0:
pf.CurrentPage = "0"
Call b02_articleunit0
Exit Sub
fehler0: Worksheets("Übersicht").Range("D19").Value = "This filter isn't existing! (Filter 0)"
Resume Next

'Filter on 1
On Error GoTo fehler1:
pf.CurrentPage = "1"
Call b02_articleunit1
Exit Sub
fehler1: Worksheets("Übersicht").Range("D19").Value = "This filter isn't existing! (Filter 1)"
Resume Next

Call SaveXLS

End Sub

编辑:由于误会,我会尽量描述我的问题。

Abgleich_ME1_ME2 可能包含一些值,例如下面的 table。 123 列描述了三种可能的不同情况。

1  |  2  |  3  
---------------
1  |  0  |  1  
1  |  0  |  0  
1  |  0  |  1  
1  |  0  |  1  

第一种情况:Abgleich_ME1_ME2中的所有值都是1。将使用作为列 Abgleich_ME1_ME2 的筛选器创建数据透视表 table。因为此列仅包含 1,所以没有过滤器 0。因此,如果我执行试图将过滤器设置为此值的 vba 代码,将会出现错误。无论如何,在这种情况下,我只想执行调用 b02_articleunit1 。否则我的数据会出错。

第二种情况:与第一种情况相同,但只针对0。最后只应执行调用 b02_articleunit0

第三种情况:应该执行两个调用,因为过滤器包含两个值。

您的问题在这里:

On Error GoTo fehler0:
pf.CurrentPage = "0"
Call b02_articleunit0
'-----------------remove this next line---------------------
Exit Sub
'-----------------------------------------------------------
fehler0: Worksheets("Übersicht").Range("D19").Value = "This filter isn't existing! (Filter 0)"
Resume Next

当您的代码 returns 来自 b02_articleunit0 时,接下来它所做的就是退出子例程。

由于您希望在错误处理程序中包含不同的错误消息,请尝试如下操作:

On Error GoTo fehler:
pf.CurrentPage = "0"
Call b02_articleunit0

pf.CurrentPage = "1"
Call b02_articleunit1
Exit Sub

fehler0: 
  Worksheets("Übersicht").Range("D19").Value = "This filter isn't existing! (Filter " & pf.CurrentPage & ")"

Resume Next

这样您就有了一个错误处理程序,它位于您的代码末尾,并根据您的 PivotField 设置动态显示错误。

更新

根据您在 OP 中发布的示例数据,您确实需要找到列中的内容并根据它执行函数调用。也许是这样的:

Dim rng as Range
Dim I as integer

For I = 1 to 3 'assuming they're the first 3 columns, adjust as necessary
  set rng = ActiveSheet.Columns(i).find (What:=0, LookIn:=xlValues, LookAt:=xlWhole)
  if not rng is nothing then
    pf.CurrentPage = "0"
    Call b02_articleunit0
  end if
  set rng = ActiveSheet.Columns(i).find (What:=1, LookIn:=xlValues, LookAt:=xlWhole)
  if not rng is nothing then
    pf.CurrentPage = "1"
    Call b02_articleunit1
  end if
Next
set rng = Nothing

这将遍历 3 列中的每一列,在每一列中搜索 0 并在找到时执行 b02_articleunit0,然后在该列中搜索 1 并执行b02_articleunit1 如果它找到一个。

如果这不是你想要的,我仍然非常非常迷茫。