• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

>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 ついでですが、これは何でしょう? 意味のないセンテンスに見えますが…

tamao-chi
質問者

補足

当初ユーザーフォーム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文だけにしてみたのですが、やはりフォームが呼び出されません。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 割り込み失礼します。 >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 とするぐらいしかないと思います。

tamao-chi
質問者

お礼

回答ありがとうございます。 勉強させていただきます。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#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を入れて、どのような動きをしているか確認してみてください

tamao-chi
質問者

お礼

申し訳ありませんでした。 原因が解かりました。 A5、O3共にセルの結合をしているのが原因でした。 そのため、Target.addressが働かなかったようです。 Case "$A$5:$F$5" UserForm2.Show Case "$O$3:$Q$3" UserForm1.Show とすることでフォームを呼び出すことができました。 ありがとうございました。

関連するQ&A