我已经编写了一些VBA代码来创建一个应该自动过滤的数据透视表。有两种可能的过滤器:0
和1
。两者都有可能存在,但也可能只存在其中一种。
我首先想要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
可以包含一些值,如下表所示。列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
创建数据透视表。由于此列仅包含1
,因此不存在过滤器0
。因此,如果我执行试图将过滤器设置为此值的vba代码,则会出现错误。无论如何,在这种情况下,我只想执行调用b02_articleunit1
。否则我的数据就错了。
第二种情况:它与第一种情况相同,但仅适用于0
。最后,只应执行调用b02_articleunit0
。
第三种情况:两次调用都应该执行,因为过滤器包含两个值。
答案 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
。
如果那不是你所追求的,我仍然非常非常迷失。