[[20180221221249]] 『VBA Change イベントで、callについて』(mask) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA Change イベントで、callについて』(mask)

初めまして
どうしても自分で解決できず、過去ログ検索でも解決にたどり着けなかった為、お知恵をお借りしたく書き込みました

シートモジュール

Private Sub Worksheet_Change(ByVal Target As Range)

If Target = Range("A1") Then

   Call テスト
Else
   Exit Sub
End If

End Sub

*

標準モジュール1

Sub テスト()

    ThisWorkbook.Activate

    If Range("A1").Value = "" Then
★       Range("B1") = ""

    Else
      Range("B1") = "☆"
    End If

End Sub

もしA1に何か入力・変更されたらプロシージャテストが実行されて
A1が空欄に変更されたらB1は空欄、そうでなければB1には既定値を…
というようにしたかったのですが、ステップ実行をやってみると
A1が空欄の時、★の行に来た時シートモジュールの最初の行に戻ってしまいます
「理由」も「対策」もわからず途方にくれております・・・

アドバイス頂ければ嬉しいです
どうぞよろしくお願い致します

< 使用 Excel:Excel2007、使用 OS:Windows10 >


 自分で自分を呼び出しているからだろうと
思います
⬇この辺をヘルプで調べてみてください

 Application.EnableEvents = False
 Application.EnableEvents = True
(SoulMan) 2018/02/21(水) 22:30

ご返信ありがとうございます
あ、なるほど、★の時点でイベントが(再度)起こってしまっている、という事なのでしょうか
頭の中をもう一度整理しています
ありがとうございます!
(mask) 2018/02/21(水) 22:37

ほぼ解決してるでしょうけど、別アプローチとして

Private Sub Worksheet_Change(ByVal Target As Range) のほうで、
変更されたのがA1じゃなきゃ、何もせず終了 っていうようにしてもいいかも。。。
(もこな2) 2018/02/21(水) 23:13


もこな2さん、ありがとうございます!
ノットイコールで記述する、という事でしょうか?
(理解力なくすみません)
条件分を色々試してみます!
(mask) 2018/02/22(木) 07:51

そうですね。いろんなやり方あるとおもいますが、

    'TargetがA1じゃなければ、プロシージャを抜ける
    If Target.Address <> "$A$1" Then Exit Sub
    '〜〜処理〜〜

    'TargetがA1なら処理をする
    If Target.Address(RowAbsolute:=False, ColumnAbsolute:=False) = "A1" Then
        '〜〜処理〜〜
    End If

    'TargetにA1が含まれていないなら、プロシージャを抜ける
    If Application.Intersect(Range("A1"), Target) Is Nothing Then Exit Sub
    '〜〜処理〜〜

    'TargetにA1が含まれるなら処理をする
    If Not Application.Intersect(Range("A1"), Target) Is Nothing Then
        '〜〜処理〜〜
    End If

たぶん、どれでもOKな気がします。
※Addressプロパティ使う場合、引数省略すると絶対参照で返してくることには注意した方がよさげです。
※相対参照にしたい場合は、引数をちゃんと付けてあげる必要があります。
※(説明のため、名前付き引数にしましたが、Address(0,0)でもたぶんOK)
(もこな2) 2018/02/22(木) 10:55


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.