- ベストアンサー
SelectionChangeについて
いろいろ調べながらエクセルのVBAを組んだのですが、どこに問題があるのかわかりません。よろしくお願いします。 セルA5を選択した場合ユーザーフォーム2を、セルO3を選択した場合ユーザーフォーム1を呼び出すためのVBAですが、どちらもユーザーフォームが呼び出されません。 どこが原因か教えていただけないでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("a5", "o3")) Is Nothing Then Exit Sub Cancel = True Select Case Target.Address Case "$A$5" UserForm2.Show Case "$O$3" UserForm1.Show End Select End Sub
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>If Intersect(Target, Range("a5", "o3")) Is Nothing Then Exit Sub ???です。Select文があるので以下だけで良いと思います Private Sub Worksheet_SelectionChange(ByVal Target As Range) Select Case Target.Address Case "$A$5" UserForm2.Show Case "$O$3" UserForm1.Show End Select End Sub なおマクロは動いていますか? なんかのはずみでEventが発生しない状態になっていませんか? もし可能性があるなら Sub Macro() Application.EnableEvent = True End Sub を実行してからセルを選択してみてください >Cancel = True ついでですが、これは何でしょう? 意味のないセンテンスに見えますが…
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 割り込み失礼します。 >If Intersect(Target, Range("o3")) Is Nothing Then Exit Sub 確かに、これで、UserForm ひとつを立ち上げるのは問題ありませんが、SelectionChange で、二つのセルを指定し、それに対してイベントを拾うのは、少し、確実性が低いです。それは、Click 自体がイベントではないからです。 その場合は、本来、DoubleClick イベントが良いと思います。 あえて、SelectionChange で行いたいなら、 Select Case Target.Cells(1).Address Case "$A$5" ・ ・ とするか、その手前に、If Target.Count =1 Then ~ End If とするぐらいしかないと思います。
お礼
回答ありがとうございます。 勉強させていただきます。
- zap35
- ベストアンサー率44% (1383/3079)
#01です。そうですか、では以下にしてみて下さい。私のPCでは動きました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Select Case Target.Address Case Is = "$A$5" UserForm2.Show Case Is = "$O$3" UserForm1.Show End Select End Sub なおIntersectで範囲重複を検出するなら If Intersect(Target, Range("a5 , o3")) Is Nothing Then Exit Sub だと思いますよ(Rangeの指定が不適切) いずれにしてもステップ実行するか、ダミーのMsgboxを入れて、どのような動きをしているか確認してみてください
お礼
申し訳ありませんでした。 原因が解かりました。 A5、O3共にセルの結合をしているのが原因でした。 そのため、Target.addressが働かなかったようです。 Case "$A$5:$F$5" UserForm2.Show Case "$O$3:$Q$3" UserForm1.Show とすることでフォームを呼び出すことができました。 ありがとうございました。
補足
当初ユーザーフォーム1のみだったので Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("o3")) Is Nothing Then Exit Sub UserForm1.Show End Sub としていたんです。今でもこれだけならフォームが呼び出されます。 もうひとつフォームを増やした為、Select文で呼び出すフォームを分けたのですが、Select文がうまく働いていないようです。 二つのセル以外を選択した場合の命令も必要かと思い、If文を付けたままにしました。必要ないのですね。勉強になりました。 Cancel = True は、BeforeDoubleClickの場合でも試していたので消し忘れてました。失礼しました。 教えていただいたSelect文だけにしてみたのですが、やはりフォームが呼び出されません。