ありがとうございます。
しかし、このサイトでは、少なくとも私たちがあなたを助けようとしているのと同じ程度に自分自身を助けることを期待しています。コメント者は、VBA Object Model
,Application Events
、AddIns
を挙げています。それは、これらのキーワード(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()
イベントでこれを行うこともできますが、どこにいてもかまいません。
私はコードをかなり重くコメントしているので、何をしているのか分かりませんし、それぞれのキーワードを調べることができます。
VBAオブジェクトモデル(設定)を信頼する場合は、VBAをプログラムで書き込むことができます。 'ThisWorkbook_NewSheet'イベントを使用して、このコードを作成時の新しいシートすべてに追加することができます – Tom
' _SheetChange(ByVal Sh Asオブジェクト、ByValターゲットとして範囲)ルーチン内のアプリケーションイベントレベルでコードを1回書くことを検討しますか? ? 'Sh'オブジェクトがあなたの望むシートの1つであるかどうかをテストできますか? – Ambie
アドインを使って、上記と同じ方法でこれを処理することもできます。 –