使用非现有过滤器处理错误

时间:2015-04-17 18:12:01

标签: excel vba error-handling pivot-table

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

我首先想要Excel在0上设置过滤器,然后将一些行复制到另一个表格(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可以包含一些值,如下表所示。列123描述了三种可能的案例。

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

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

第二种情况:它与第一种情况相同,但仅适用于0。最后,只应执行调用b02_articleunit0

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

1 个答案:

答案 0 :(得分:1)

您的问题在这里:

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

当你的代码从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&amp;如果找到,则执行b02_articleunit0,然后在该列中搜索1,如果找到,则执行b02_articleunit1

如果那不是你所追求的,我仍然非常非常迷失。