Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6209 / 13646 ツリー ←次へ | 前へ→

【46581】イベント処理Change ごろり 07/2/7(水) 13:12 質問[未読]
【46582】Re:イベント処理Change ひげくま 07/2/7(水) 13:29 回答[未読]
【46583】Re:イベント処理Change ひげくま 07/2/7(水) 13:32 発言[未読]
【46612】Re:イベント処理Change ichinose 07/2/8(木) 7:51 発言[未読]

【46581】イベント処理Change
質問  ごろり  - 07/2/7(水) 13:12 -

引用なし
パスワード
   Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$B$4" And Target.Value <> "" Then Call AAA
  If Target.Address = "$E$5" And Target.Value = 2 Then Call BBB
End Sub

B4に何か入れるとAAAを呼び出す
E5に何か入れるとBBBを呼び出す
という式をつくりました。
しかし、
手でA1とA2をコピーし、B1とB2に貼り付けようとすると
Target.Addressに"$B$1:$B$2"をいれようとしてエラーになります。(型の不
一致)
複数のセルの値をDELETEとしようとしてもエラーになってしまいます。
IF文とは関係ないところに手をつけたのになぜ起こったのか、わからないです


困っています。
教えてください。

Application.EnableEventsは関数のほうに記述してあります。

【46582】Re:イベント処理Change
回答  ひげくま  - 07/2/7(水) 13:29 -

引用なし
パスワード
   ▼ごろり さん:
こんにちは。

>Private Sub Worksheet_Change(ByVal Target As Range)
>  If Target.Address = "$B$4" And Target.Value <> "" Then Call AAA
>  If Target.Address = "$E$5" And Target.Value = 2 Then Call BBB
>End Sub
(略)
>手でA1とA2をコピーし、B1とB2に貼り付けようとすると
>Target.Addressに"$B$1:$B$2"をいれようとしてエラーになります。(型の不
>一致)
>複数のセルの値をDELETEとしようとしてもエラーになってしまいます。
>IF文とは関係ないところに手をつけたのになぜ起こったのか、わからないです
>。

Target が複数のセルを持つ範囲の場合、プロパティとしてValueを指定することはできないようです。
なので、If文で、Target.Value を比較しようとしているところでエラーになっています。

If Target.Address = "$B$4" Then
  If Target.Value <> "" Then Call AAA
End If

と分ければ、複数せる範囲の場合は外側のIf文ではじかれるので大丈夫です。

また、比較の前に、Target.Count が1より大きかったらはじくようにしても大丈夫だと思います。
こっちの方がスマートかな?

【46583】Re:イベント処理Change
発言  ひげくま  - 07/2/7(水) 13:32 -

引用なし
パスワード
   追記です。
>IF文とは関係ないところに手をつけたのになぜ起こったのか、わからないです。

Targetが$B$4や$E$5と関係あるかどうかをIf文で比較しているので、If文と関係ないわけではないですよ。

【46612】Re:イベント処理Change
発言  ichinose  - 07/2/8(木) 7:51 -

引用なし
パスワード
   こんばんは。

>Private Sub Worksheet_Change(ByVal Target As Range)
>  If Target.Address = "$B$4" And Target.Value <> "" Then Call AAA
>  If Target.Address = "$E$5" And Target.Value = 2 Then Call BBB
>End Sub
>
>B4に何か入れるとAAAを呼び出す
>E5に何か入れるとBBBを呼び出す
>という式をつくりました。
>しかし、
>手でA1とA2をコピーし、B1とB2に貼り付けようとすると
>Target.Addressに"$B$1:$B$2"をいれようとしてエラーになります。(型の不
>一致)
>複数のセルの値をDELETEとしようとしてもエラーになってしまいます。
>IF文とは関係ないところに手をつけたのになぜ起こったのか、わからないです
>。
ひげくまさんの回避方法でよいと思いますが・・・。
基本として、VBAの and 演算子の仕様を理解されていないと
こういうコードを書いてしまいます。

VBAの AND演算子は、

条件1 AND 条件2 とあった場合、
条件1がFalseでも 条件2の評価をしてしまいます。

言語のよっては、条件1がFalseなら、条件2は評価しない仕様になっているものも
あります。その場合は、ごろりさんのコードでも良いのですが、
VBAのANDは違うのです。
よって、Target.Value <> ""  これを評価するときにエラーが発生しています。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim crng As Range
  For Each crng In Target
    If crng.Address = "$B$4" And crng.Value <> "" Then Call AAA
    If crng.Address = "$E$5" And crng.Value = 2 Then Call BBB
    Next
End Sub


こんな方法も検討してみてください。
これだとコピーやDeleteにも対応します。

6209 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free