使用不存在的过滤器进行错误处理
Error handling with non existing filter
我已经编写了一些 VBA 代码来创建一个应该自动过滤的数据透视表。有两种可能的过滤器:0
和 1
。可能两者都存在,但也可能只存在其中之一。
我希望 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。 1
、2
和 3
列描述了三种可能的不同情况。
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
如果它找到一个。
如果这不是你想要的,我仍然非常非常迷茫。
我已经编写了一些 VBA 代码来创建一个应该自动过滤的数据透视表。有两种可能的过滤器:0
和 1
。可能两者都存在,但也可能只存在其中之一。
我希望 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。 1
、2
和 3
列描述了三种可能的不同情况。
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
如果它找到一个。
如果这不是你想要的,我仍然非常非常迷茫。