|
▼こずえ さん:
おはようございます。
「1〜2秒ほど関係のないところ・・・」というのが、処理に1〜2秒ほどかかり
メニューシートのC10〜G10に本来セットされる条件じゃないところに
【印刷】という文字が入ったということならわかりました。
(1〜2秒ほどの間、印刷が繰り返されたということなら、もう少し情報が必要ですが)
イベント処理の最初に kanabun さんのコードでは
If Target.Column <> 3 Then Exit Sub 'C列の Change でなければ抜ける
私のコードでは
Set r = Range("C13:C14,C64:C65,C115:C116,C166:C167,C219:C220,C248:C249,C277:C278,C306:C307")
If Intersect(Target, r) Is Nothing Then Exit Sub
こういうところがありますね。
kanabunさんのコードの意味は、コメントにもあるように変更され、ここにとんできたときの
Target(変更領域のアドレス)がC列でなければ処理しないで抜けます。
私のコードでは、その領域が、Set r = ・・・で指定したセル領域以外なら抜けます。
一方、こずえさんのコードは、シート上のどこが変更されても実行されます。
で、このSub 印_エネ_簡易書留_小() 、お気づきかどうか、変更が3回行われています。
.Offset(.Rows.Count).Resize(2).EntireRow.Insert
.Offset(.Rows.Count + 2).Resize(2).EntireRow.Insert
.Offset(.Rows.Count).Resize(.Rows.Count + 2).EntireRow.Delete
その変更時の、Target はすべて行単位、たとえば 最初のコードなら
$239:$240 というものです。
Target.Column は、この場合、1。また私のコードで規定したセル群は、この$239:$240には
はいっていませんので、処理せず抜けます。
こずえさんのコードは、3か所の変更が起こる都度、イベントプロシジャが実行され
【その時の】セル位置に対して判断が行われ【その時の】C10〜G10の場所に値が入ります。
こういった現象をイベントの連鎖といって、もし、コード実行で、こういうことがありうるなら
それを回避する手立てをいれる必要があります。
kanabunさんのコードや私のコードは、【たまたま】処理が必要だというチェックをしている場所が
変更のあった場所に【ひっかからなかっただけ】で、本来は、イベントそのものを発生させないように
することが必要なんです。
イベントは
Application.EnableEvents = False
これで発生がとまりますので、印_エネ_簡易書留_小()の最初 With句の下あたりに
に、このコードを記述しましょう。
で、このままでは、永久にイベントが発生しなくなりますので、End WIth の前に
Application.EnableEvents = True と記述してください。
kanabunさんや私のコードをお使いになる場合でも、【たまたま】セーフということですから
必ず、このApplication.EnableEvents = False/True の手当てをしておいてくださいね。
|
|