質問: 入力を監視するセルは下記の範囲で、範囲ごとにやること(処理)は違います 入力は全て整数です(整数が入力されたらその値に応じてマクロで処理します) 入力値のチェックは「入力規則」でやります(if文書くのがたいへんそうなので) 入力範囲は range("b2,d2,h2,j2") range("b3,d3,h3,j3") range("b5:b100") この範囲に値の貼り付けで入力は禁止です、というか、禁止しないと だめなようです(worksheet_changeは) range("h5:h100") この範囲に値の貼り付けで入力は禁止です、というか、禁止しないと だめなようです(worksheet_changeは) もっと増えるかもしれませんが、その時はなんとか教えていただいた例を参考にやってみます いきなりの長文の質問ですみません 用語に不慣れで表現が分かりにくかったら指摘してください よろしくお願いします エクセルはバージョン2013を使っています 最後まで読んでいただきましてありがとうございました
回答: こんにちは。 >application.enableevents = false の効果を知るには、無限ループになるようなコードが 書けないとだめということですね >「そんなコードが書けないのだから、効果を実感できるわけがない」という話ですね >やっと合点しました 私は、そこまで言うつもりはありません。最初は形式的に書いていて、そのうちに分かるようになるということです。実際に、今、「そんなコード」を本当に書ける人がいるのでしょうか? らしきコードを書いてみましたが、これでも、実証はできません。途中でエラーがでてしまいます。止める場合は、escキーを押します。 'a2に値をいれるマクロ private sub worksheet_change(byval target as range) if target.count > 1 then exit sub if target.value = "" then exit sub if target.address(0, 0) <> "a2" then exit sub '以上除外設定 application.enableevents = false target.value = target.value + 1 '値に値を入れるから保護する必要があります。 application.enableevents = true if target.value > 10 then exit sub '再帰になって場合の気休め。実際は働かない exit sub end sub 最近は、pcそのものの性能がよいせいか、忘れてしまう人がいます。無限ループにならないのは、一回のイベントにわずかなタイムラグが出来て、そのタイムラグが、イベントをキャッチする時間の範囲から外れてしまうから、イベントが終了するわけです。 以下の場合は、enableevents =false は、不要です。 マクロで値を入れた時に、再イベントが発生するのです。だから、それを防ぐわけです。 if not intersect(target, range("b2,d2")) is nothing then msgbox target.value msgbox target.address msgbox target.column msgbox target.row end if if not intersect(target, range("b5:b10,d5:d10")) is nothing then msgbox target.value msgbox target.address msgbox target.column msgbox target.row end if >マクロがエラーで止まって、エラーの行が黄色くなって >コードが示されるようなことでは、逆にマクロなんか使わない方がよさそうです 問題は、そういう所ではないのです。 最初は、プログラムそのものを体得していくことだと思います。 上達のポイントは、なんとか、何年掛かってもよいからと思いつつ、完成を目指すことです。 その都度、覚えた技術を反映しながら、自分のコレクションに加えていきます。 また、ネットで勉強するにしても、なるべく一定の人のものを追いかけて、その人がどう考えて、そのコードになったのか考えながらでもよいと思います。ある程度の内容になると、その人の人柄がコードに出てきます。 マクロで、自分がやりたいことができるようになるには、なかなか時間が掛かります。でも、それ以上に、相手の期待に沿うというのは、もっと大変なことです。 最近、質問した人は、私の説明を読んで、すぐに諦めてしまって質問を閉じてしまいました。こちらも事情があって、その人のために、大掛かりなプログラムを簡単に公開したくはありません。人にやる気を起こさせるのも技術かもしれません。中には、長いコードをみただけで、自分の質問とは違います、と断ってしまう人。せっかく作っても、予定に間に合わなかったので、ボツ。エラー処理したコードは、内容が複雑になっているから、それはダメ。 他人のためにマクロを書くと考えていたら、とてもやっていられるものではありません。