2016-10-07 30 views
1

私は、それぞれが同じデータソースにリンクされたピボットテーブルを含む約10のワークシートを含むExcelファイルに対して以下のサブを実行しています。私は、市場(SC)、市場(AN)、地域(SC)、地域(AN)の2つのバージョンの「市場」と「地域」フィールドを持っています。簡単に切り替えることができます。私は最初に対応するスライサーを前面に持ってきて(他のものを隠すように重ね合わされている)コードを設定してから、それぞれのピボット・テーブルをループし、他の「市場」と「地域」フィールドを交換します(同じ位置を維持します。 )。Excel VBAエラーハンドラが「ランタイムエラー13:タイプが一致しません」

フィールドを識別するために ".SourceName"プロパティを使用しているため、 "値" PivotFieldと文字列を比較するとループが実行されます。このエラーが発生したときに次のフィールドにスキップするように指示するために "On Error Goto next_fld"を入れましたが、これは10枚のワークシートのうちの8枚でしか動作しません - 他の2枚は " 13 'Type Mismatch "と表示され、デバッグ画面に" *** "行がハイライト表示されます。 "On Error Resume Next"を使用すると、IfステートメントがTrueであり、多くの望ましくない操作(さまざまなピボットテーブルが壊れている)が発生することが想定されます。

私は自習しており、エラーハンドラを完全に理解していませんが、このエラーを修正するために私が見つけたリソースから、ハンドラはこれを処理する必要があります8/10ワークシート)。ここで

は私のコードです:

Sub SwapMktRegFields() 

Dim ws As Worksheet, shp As Shape 
Dim i As Integer 
Dim target As String, repl As String 

target = Sheet5.Range("E3").value 

'Identify current field, use other as repl(acement) 
Select Case target 
    'AN slicers selected 
    Case Is = "AN" 
     target = "(AN)" 
     repl = "(SC)" 
     Sheet5.Range("E3").value = "SC" 
    'SC slicers selected 
    Case Is = "SC" 
     target = "(SC)" 
     repl = "(AN)" 
     Sheet5.Range("E3").value = "AN" 
End Select 

'Bring replacement slicers to front (some are in shape groups) 
For Each ws In ThisWorkbook.Worksheets 
    For Each shp In ws.Shapes 
     Select Case shp.Type 
      Case Is = msoGroup 
       For i = 1 To shp.GroupItems.Count 
        If shp.GroupItems(i).Name Like "Market " & target & "*" Or shp.GroupItems(i).Name Like "Region " & target & "*" Then shp.GroupItems(i).ZOrder msoSendToBack 
       Next i 
      Case Else 
       If shp.Name Like "Market " & target & "*" Or shp.Name Like "Region " & target & "*" Then shp.ZOrder msoSendToBack 
     End Select 
    Next shp 
Next ws 



'Replace old PivotFields with replacement PivotFields 

Dim pvt As PivotTable 
Dim fld As PivotField 
Dim orient As Long, pos As Long 

' MY ERROR HANDLER 
On Error GoTo next_fld 
For Each ws In ThisWorkbook.Worksheets 
    For Each pvt In ws.PivotTables 
     For Each fld In pvt.PivotFields 
' *** ERROR ON NEXT LINE WHEN fld IS 'VALUES' 
      If fld.SourceName = "Market " & target And fld.Orientation <> xlHidden Then 
       orient = fld.Orientation 
       pos = fld.Position 
       fld.Orientation = xlHidden 
       With pvt.PivotFields("Market " & repl) 
        .Orientation = orient 
        .Position = pos 
       End With 
      ElseIf fld.SourceName = "Region " & target And fld.Orientation <> xlHidden Then 
       orient = fld.Orientation 
       pos = fld.Position 
       fld.Orientation = xlHidden 
       With pvt.PivotFields("Region " & repl) 
        .Orientation = orient 
        .Position = pos 
       End With 
      End If 
next_fld: 
     Next fld 
    Next pvt 
Next ws 

'A custom function to clear filters and re-apply a default 
ResetPivotFilters 

End Sub 

奇妙な部分がエラーがこのコードで動作する他の8枚とまったく同じであるということです。私がエラーハンドラを完全に削除した場合、他のシートのために同じポップアップとラインがハイライトされます...どんな提案も大歓迎です!ありがとう

+4

エラーハンドラのエラーをクリアしません。これを読んで、エラー処理をどのように構造化すべきかを概観してください: –

+0

エラー処理を完全に削除し、エラーが発生した行を教えてください – Absinthe

答えて

1

ティム、これは非常に役に立ち、私の質問に答えました。

ResetPivotFilters 

Exit Sub 

err_handler: 
Resume next_fld 

End Sub 

と「オンエラー後藤err_handler」への有効ラインを扱う私のエラーを更新:私は、次のように私のコードの末尾を更新しました。今働いている。ありがとうございました!

関連する問題