2017-02-10 61 views
3

シート(Excel)が削除されたときにマクロをトリガーしようとしています。 2010年以降、異なる削除イベントがあります。シート/グラフイベントの削除VBA

アプリケーションレベル:Application.SheetBeforeDeleteイベント。

ブックレベル:Workbook.SheetBeforeDeleteイベント。

ワークシートレベル:Worksheet.BeforeDeleteイベント。

初心者としては最後の2つをうまく適用できませんでしたが、最初のものを適用しようとしました。

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object) 
Call Macro 
End Sub 

これはシートで正常に機能しますが、グラフ(チャートのみを含むシート)では機能しません。

私の目標は、私のシートの名前がSheetname(1)、..(2)なので、自分のカウンタを調整し、おそらくシートの名前を変更することです。

私は多くを検索しましたが、私が従うことができる例は見つかりませんでした。

ご協力いただければ幸いです。

+0

これはバグだと思われます。確かにそれは私のように見えます。 – Rory

答えて

2

これは実装の見た目のようですが、このイベントはデザインに従って実装されている必要があります。実際、SheetsコレクションはWorksheetsコレクションとChartsコレクションの和集合です。イベントの名前はWorkbook_SheetBeforeDeleteWorkbook_WorksheetBeforeDeleteではなく)なので、イベントはすべてSheetsに適用する必要があります。すなわち、WorksheetsChartsの両方に適用する必要があります。

Workbook_SheetDeactivateなどの他のイベントは、グラフとワークシートの両方で発生します。これにより、エラーが確認されますが、Workbook_SheetDeactivateイベントを悪用して回避策が示唆されています。

コードモジュールThisWorkbookに2つの手順を追加できます。 checkChartDelete()は、チャートが削除されているかどうかをチェックし、適切なアクションを開始します。それはApplication.OnTimeによって呼び出される必要があるので、静的変数chartNameToCheckでそのパラメータを取得します。

' Code Module ThisWorkbook 
Option Explicit 
Private chartNameToCheck As String 
Private Sub checkChartDelete() 
    On Error Resume Next 
    Dim x: Set x = Sheets(chartNameToCheck) 
    If Err.Number <> 0 Then 
     '********************************************** 
     ' call or do here the action on chart deleted ' 
     '********************************************** 
     MsgBox "chart deleted: " & chartNameToCheck 
    End If 
    chartNameToCheck = "" 
End Sub 

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 
    If TypeName(Sh) <> "Chart" Then Exit Sub 
    chartNameToCheck = Sh.name 
    Application.OnTime Now, "ThisWorkbook.checkChartDelete" 
End Sub 
+0

説明とコードをありがとう、それは完全に動作します。 – Bambuchka

+0

Sub chartNameToCheckが別のモジュールに配置されていると、変数chartNameToCheckを使用できないことに気付きました。これを克服する手段はありますか? – Bambuchka

+1

@Bambuchka 'chartNameToCheck'静的変数と' checkChartDelete'ルーチンの両方を標準コードモジュールに移動することができます。彼らはパブリックにする必要があります(すでにそうですが、WBの中でよりプライベートな方がよいかもしれません)。そして、敗北したコールをこのApplicationに変更する必要があります。今すぐ "checkChartDelete"( 'ThisWorkbook.'を削除してください) –

関連する問題