質問: シート1 シート2 シート3 ある状態から シート3をコピー追加します。 その際、下記のコードではメッセージボックスには4が表示されます。 やりたいことは、シートコピー時のイベントを捉えることです。 シートのコピー追加をするということは、シートが増えるということ。 つまり、 SheetActivateが実行される前のシートの数と SheetActivateが実行された後のシートの数 この2つが一致しなければ、それはコピーしたということになります。 SheetActivateなんですが一致すれば何も処理はしない。 ``` Sub Workbook_SheetActivate(ByVal Sh As Object) If Worksheets.Count > 0 Then MsgBox Worksheets.Count End If End Sub ``` 本題は、 SheetActivateが実行される前のシートの数 これはどうやって取得することができるでしょうか? コードの0にあたる部分がそれなんですが、どうすれば良いでしょうか。 また、本題で、シートの数を取得するタイミングも関わってくると思いますが、そのタイミングが最適でしょうか。 追記: 単純に If Worksheets.Count > (Worksheets.Count-1) Then ではダメなような、、、 シートはまとめて追加する場合もあるので、 やはりシートコピー前のシート数を取得しないと、、、 もし、If Worksheets.Count > (Worksheets.Count-1) Thenでやるなら1の部分は追加したシートの数にしなくては、、、
回答: ブックを開いたタイミングでシート数をグローバル変数に保持して、あとはシートアクティブのタイミングでチェック、違ってたら変数を更新が通常の流れでしょうか。 静的変数を使ってイベント内だけで完結させたかったのですが、静的変数の初期値が自由に設定できなかったので、グローバル変数にしています。 ``` Dim preWsCnt As Integer Private Sub Workbook_Open() preWsCnt = Worksheets.Count End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object) If preWsCnt <> Worksheets.Count Then preWsCnt = Worksheets.Count MsgBox "シート増減" End If End Sub ```