私は、それぞれが同じデータソースにリンクされたピボットテーブルを含む約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枚とまったく同じであるということです。私がエラーハンドラを完全に削除した場合、他のシートのために同じポップアップとラインがハイライトされます...どんな提案も大歓迎です!ありがとう
エラーハンドラのエラーをクリアしません。これを読んで、エラー処理をどのように構造化すべきかを概観してください: –
エラー処理を完全に削除し、エラーが発生した行を教えてください – Absinthe