2009-04-06 2 views
2

別のワークブックからワークブックにコピーされているワークシートをキャプチャしようとしています。
Workbook_NewSheet他のブックからシートをコピーすると、イベントが発生しません。 これは、ユーザーが手作業で挿入([挿入] - > [ワークシート]メニューオプション)、またはVBAを使用して新しいシートをThisWorkbook.Worksheets.Addとして追加した場合にのみトリガーされます。Excel VBAのコピー/貼り付けによって追加されるワークシートをキャプチャする方法

私がキャプチャしようとしているのは、基本的に、新しいシートになる貼り付け操作です。

これは、以下のユーザアクションのいずれかからかもしれません:他のブックから(新しいシートを追加します)コントロールキーを保持

  • ユーザーコピーシート/ sのをドラッグすることで

    1. ユーザーコピー、既存のシート

      01:別のブック

    またはVBAコードを以下のいずれかから

  • ユーザ移動シート

    VBA内でこのアクションやマクロの結果をキャプチャする方法がわかっていると、大きな助けになります。

    私はこのようなユーザーの操作を避けたくないので(ワークブックを保護したくないので)、データを検証するために貼り付けたシートを処理したいと思います。同じデータを2枚のシートに保存するのではなく、既存のシートを更新します。

  • 答えて

    1

    私はそれがimplimented持っている方法は

    Private Sub Workbook_WindowActivate(ByVal Wn As Window) 
    ToggleMenuOptions False, 848, 889 
    End Sub 
    
    Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) 
    ToggleMenuOptions True, 847, 848, 889 
    End Sub 
    
    Public Function ToggleMenuOptions(bToggle As Boolean, ParamArray ControlID() As Variant) As Boolean 
    '848 Move or Copy Sheet... 
    '889 Rename Sheet 
    '847 Delete Sheet 
    On Error GoTo lblError 
    Dim oControl As CommandBarControl, oControls As CommandBarControls, iControl As Integer 
    If IsMissing(ControlID) Then 
        ToggleMenuOptions = False 
        Exit Function 
    End If 
    
    For iControl = LBound(ControlID) To UBound(ControlID) 
        For Each oControl In Application.CommandBars.FindControls(ID:=ControlID(iControl)) 
         oControl.Enabled = bToggle 
        Next 
    Next 
    ToggleMenuOptions = True 
    Exit Function 
    lblError: 
        If Err.Number Then 
         ToggleMenuOptions = False 
         Exit Function 
        End If 
    End Function 
    
    Private Sub Workbook_NewSheet(ByVal Sh As Object) 
    MsgBox "Please use Add New Project option in custom Toolbar to add new sheets!!", vbExclamation, "Not Supported" 
    Application.DisplayAlerts = False 
    Sh.Delete 
    Application.DisplayAlerts = True 
    End Sub 
    

    は、だから私のユーザーが文句を言わない、名前の変更シートを追加したり削除したりすることができるようです。これは現在かなりうまく機能しています。

    2

    SheetActivateイベントは、これらすべての状況で発生します。明らかに、他の多くの状況下でも発火するでしょう。これは王様の痛みのように聞こえるかもしれませんが、独自のワークシートコレクションを維持し、コレクションをThisWorkbook.Sheetsコレクションと比較して、何かが追加/削除されたかどうかを確認することができます。

    これを防ぐには、コードで行うのではなく、ブックの構造を保護することを検討してください。

    +0

    これはオプションの可能性があります。ユーザーにいくつかのシートをインポートするオプションを提供したいので、ブックのセキュリティ保護はオプションではありません。古いバージョンのファイルからコピーまたは移動すると、新しいシートが追加されず、代わりに既存のシートが更新されます。コピー/移動されたデータからのデータを含むファイル – Adarsha

    +0

    "SheetActivateイベントはすべての状況下で発生します" 複数のシートをコピーすると1枚目のシートに1回しか焼き付かれません。 別のシートコレクションを維持するのは苦痛です。 PlyメニューからMove/Copyシートオプションを無効にするように選択したので、ユーザーはファイルのあるバージョンから別のバージョンにシートを移動できません。 また、新しいシートを追加して新しいシートをブロックしました。今のところ、私はそのツールを使い終わっています。しかし、次のバージョンのExcelでは、Joelが長年設計したものよりも、より堅牢なイベントをモーダルにすることを期待しています。 – Adarsha

    2

    シートをコピーすると、その名前は常に "(2)"または少なくとも ")"で終わります。私は別々のシートのコレクションを維持せずにこれをやって考えることができる唯一の方法は、シート名(またはシートのコードネーム)の静的配列を維持し、実際のシートにこれを比較することで、この

    Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
        If Sh.Name Like "*(2)" Then 
         Application.DisplayAlerts = False 
         Sh.Delete 
         Application.DisplayAlerts = True 
        End If 
    End Sub 
    
    0

    のようなものにチェックすることができますSheetActivateイベントが発生したときに追加情報を検出するたびにワークブックに表示されます。配列内にリストを保持したくない場合は、隠しシートを使用してリストを格納することができます。これは別のコレクションを維持するよりも多かれ少なかれ痛みであるかどうかは議論の余地があります:)

    0

    私は何か類似の作業をしていますが、ユーザメニューアクションをブロックすることはできません。私はタイプが重要なシートを持っています - 各シートはマスターかスレーブのどちらかです - 各マスターシートはその下のスレーブシートを合計し、これらの式をきれいに保つ必要があります。

    余分な隠しシートにシートのリストを維持するのではなく、リンクされたマスターシートへのシートのインデックスのオフセットとリンクされたマスターシートへの参照を記録する各シートに2つの隠し名前を定義します。つまり、自分のシートがマスターシートの+2タブであれば、シートの活性化/非活性化(この段階ではどちらが良いかわからない)に、挿入、削除、または移動があった場合、このオフセットが変更されます。これは、シートの移動またはコピーによって生じるイベントの大部分またはすべてをカバーします。

    シートが移動されている場合は、ワークブックを繰り返し、すべてのシートの新しいマスター/スレーブインデックス参照を計算します。

    私はこれを合理的に安定させるとコードを投稿しますが、それはさまざまな状況で動作するような仕組みのようです。