2015-07-10 63 views
1

我正在研究選擇數據透視表的一部分併發送該提取的過程。VBA - GetPivotData - 無法捕獲運行時錯誤1004

一切正常,但我一直有一個運行時錯誤1004我不能趕上(,以避免它,並不斷循環)等我的循環不順暢工作...

這裏是有問題的一部分:

On Error GoTo 0 
    On Error GoTo NextSale 
    If IsError(pt.GetPivotData("Amount", Pf.Name, Pi.Name, "Sales_Opp", PiO.Name)) Then GoTo NextSale 
    Set Rg = pt.GetPivotData("Amount", Pf.Name, Pi.Name, "Sales_Opp", PiO.Name) 
    On Error GoTo 0 

    Set RgT = Union(RgT, Rg) 
NextSale: 

因爲pt.GetPivotData("Amount", Pf.Name, Pi.Name, "Sales_Opp", PiO.Name)將拋出一個運行時錯誤1004,當組合中不存在數據,我只是想避免被封鎖在洛杉磯歡聲笑語。

我搜索了,但沒有設法解決這個問題... IsError()On Error GoTo不起作用。我甚至在選項選中(工具 - >選項 - >常規 - >錯誤捕獲),我已經很上Break on Unhandled Errors ...

下面是完整的代碼:

Sub testPt() 
Dim Pt As PivotTable, _ 
    Pf As PivotField, _ 
    Pi As PivotItem, _ 
    PiO As PivotItem, _ 
    Ws As Worksheet, _ 
    TpStr As String, _ 
    RgT As Range, _ 
    Rg As Range 

Set Ws = ThisWorkbook.Sheets("PT_All") 

For Each Pt In Ws.PivotTables 
    For Each Pf In Pt.PivotFields 
     If Pf.Name <> "Sales" Then 
     Else 
      For Each Pi In Pf.PivotItems 
       Set RgT = Pi.LabelRange 
       For Each PiO In Pt.PivotFields("Sales_Opp").PivotItems 

        On Error GoTo 0 
        On Error GoTo NextSale 
        If IsError(Pt.GetPivotData("Amount", Pf.Name, Pi.Name, "Sales_Opp", PiO.Name)) Then GoTo NextSale 
        Set Rg = Pt.GetPivotData("Amount", Pf.Name, Pi.Name, "Sales_Opp", PiO.Name) 
        On Error GoTo 0 

        Set RgT = Union(RgT, Rg) 
NextSale: 
       Next PiO 
       RgT.Select 
       MsgBox RgT.Address 
      Next Pi 
     End If 
    Next Pf 
Next Pt 

End Sub 

回答

2

我有一種感覺,它是在第二次失敗儘管是例行公事,而不是第一次。
它已經成功地捕獲了第一個錯誤,但由於沒有Resume xxxxxx語句,它仍然在嘗試執行錯誤處理,當它碰到下一個錯誤時。不允許嵌套的錯誤處理,所以錯誤。

擺脫On Error Goto 0線,同時,將另一On Error

On Error GoTo Err_Handlr 

然後,就在End Sub之前,添加以下內容:

Unexpected_Err: 
Exit Sub 

Err_Handlr: 
If err.number=1004 
    Resume NextSale 
Else 
    Msgbox "Can't handle " & err.description 
    Resume Unexpected_Err 
end if 

請注意,我在尋找預期的錯誤數量 - 這意味着如果其他部分中斷,我至少可以得到有關它的信息,而不是通過任何其他可能發生的副作用而失去控制

+0

Thx爲您的輸入,我不知道有關將退出錯誤處理的'Resume'部分,以便完成一些調整,我學會了一個關於錯誤處理非常有用,非常感謝! ;) – R3uK

1

問題可能是與範圍錯誤處理(或缺乏)有關。

下面的代碼是未經測試,但你應該能夠找出其中的錯誤在於它和它適應您的要求......

Sub testPt() 
    Dim Pt As PivotTable, _ 
     Pf As PivotField, _ 
     Pi As PivotItem, _ 
     PiO As PivotItem, _ 
     TpStr As String, _ 
     RgT As Range, _ 
     Rg As Range 

    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("PT_All") 

    For Each Pt In ws.PivotTables 
     For Each Pf In Pt.PivotFields 
      If Pf.Name = "Sales" Then 
       For Each Pi In Pf.PivotItems 
        Set RgT = Pi.LabelRange 
        For Each PiO In Pt.PivotFields("Sales_Opp").PivotItems 
         Set Rg = Nothing 
         On Error Resume Next 
         Set Rg = Pt.GetPivotData("Amount", Pf.Name, Pi.Name, "Sales_Opp", PiO.Name) 
         On Error GoTo 0 
         If Not RgT Is Nothing Then 
          If Not Rg Is Nothing Then Set RgT = Union(RgT, Rg) 
         Else: If Not Rg Is Nothing Then Set RgT = Rg 
         End If 
        Next PiO 
       Next Pi 
      End If 
     Next Pf 
    Next Pt 

    If Not RgT Is Nothing Then 
     RgT.Select 
     MsgBox RgT.Address 
    Else: MsgBox "RgT is empty" 
    End If 

End Sub 
+0

Thx用於輸入,但是我的問題不在範圍內,它與'GetPivotData'函數在沒有匹配的情況下會拋出一個錯誤...因此,您的代碼在給定Set Rg = Pt.GetPivotData(「......」,就像我的一樣......但你的確處理好了這個範圍! ;) – R3uK

+0

更新爲嘗試繞過錯誤... – Tragamor