2017-05-16 17 views
0

私はvbaでExcelシートを自動的に作成する必要があります。新しいシートvbaにEventListenerを追加

Onchangeイベントリスナーが必要なセルがあり、毎回シートコードごとに書き込むのではなく、マクロを呼び出すことによって自動的にこのイベントリスナーを作成する方法があるかどうかを知りたがっていますか?

は、私はそれがあまりにもかなりの数の他の人に何らかの関連性があるかもしれませんので、以下のコードは、あなたが正しい方向に始めるべきだと思いますので、私はこの質問に答えるつもりですあなた

+0

VBAオブジェクトモデル(設定)を信頼する場合は、VBAをプログラムで書き込むことができます。 'ThisWorkbook_NewSheet'イベントを使用して、このコードを作成時の新しいシートすべてに追加することができます – Tom

+0

' _SheetChange(ByVal Sh Asオブジェクト、ByValターゲットとして範囲)ルーチン内のアプリケーションイベントレベルでコードを1回書くことを検討しますか? ? 'Sh'オブジェクトがあなたの望むシートの1つであるかどうかをテストできますか? – Ambie

+0

アドインを使って、上記と同じ方法でこれを処理することもできます。 –

答えて

0

ありがとうございます。

しかし、このサイトでは、少なくとも私たちがあなたを助けようとしているのと同じ程度に自分自身を助けることを期待しています。コメント者は、VBA Object Model,Application EventsAddInsを挙げています。それは、これらのキーワード(Googleの検索と言う)を研究するために、ほとんどの人の知恵を超えてはいけません。あなたが「コードを置く場所や何をするのか知らない」と言うだけでは本当に受け入れられません。また、正直に言えば、人々にあなたを助ける動機は特にありません。別の言い方をすれば、その投稿とコメントで

私は、あなたの特定のケースを正確にどのようにコード化するかについて巨大なコメント交換をしたくないです。ここのコードは例であり、私はそれをさらに研究することを期待しています。だからここに行く...

クラスモジュールを挿入して(それがわからない場合は)、名前を付けてください - 私はcAppと呼んでいます。これには、同様に、Applicationオブジェクトにアクセスし、そのイベントをキャプチャすることができるようになります:

Option Explicit 

Private WithEvents mApp As Application 
Private mSheetList As Collection 

Private Sub Class_Initialize() 
    Dim ws As Worksheet 

    'Create instance of the sheet collection 
    Set mSheetList = New Collection 

    'If you wanted to add any existing sheets to be checked for changes, 
    'then you'd do it here. 
    'Just for an example, I'm using any existing sheets whose name contains "LoP". 
    For Each ws In ThisWorkbook.Worksheets 
     If InStr(ws.Name, "LoP") > 0 Then 
      mSheetList.Add ws 
     End If 
    Next 

    'Create instance of Application 
    Set mApp = Application 
End Sub 

Private Sub mApp_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    Dim ws As Worksheet 

    'Test if the changed sheet is in our list. 

    'Check if the Sh object is a worksheet. 
    If TypeOf Sh Is Worksheet Then 

     'Loop through out list of sheets and see if the Sh object is in the list. 
     For Each ws In mSheetList 
      If Sh Is ws Then 

       'Check if the changed range is in the desired range of your sheet. 
       'In this example, we'll say it has to been in the range "A1:B2". 
       If Not Intersect(Target, ws.Range("A1:B2")) Is Nothing Then 
        MsgBox ws.Name & "!" & Target.Address(False, False) & " has changed." 
       End If 

       Exit For 

      End If 
     Next 

    End If 


End Sub 

Private Sub mApp_WorkbookNewSheet(ByVal Wb As Workbook, ByVal Sh As Object) 

    'A new sheet has been created so add it to our sheet list. 
    If Wb Is ThisWorkbook Then 
     If TypeOf Sh Is Worksheet Then 
      mSheetList.Add Sh 
     End If 
    End If 
End Sub 

あなたは、このクラスのインスタンスを作成します。私は、標準Moduleでそれをやった:あなたは、あなたのコード内のどこかにRunMeルーチンを呼びたい

Option Explicit 

Private oApp As cApp 

Public Sub RunMe() 

    'Create instance of your app class 
    Set oApp = New cApp 

End Sub 

Workbook_Open()イベントでこれを行うこともできますが、どこにいてもかまいません。

私はコードをかなり重くコメントしているので、何をしているのか分かりませんし、それぞれのキーワードを調べることができます。

+0

まあ、いくつかの研究の後、コードを完成させる方法を見つけました。ありがとう、それはかなり難しいですが、それは動作します! –

+0

よくできました。それがうれしかった。 – Ambie

関連する問題