重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

いろいろ調べながらエクセルの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

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

この回答への補足

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

補足日時:2007/05/30 19:59
    • good
    • 0

こんばんは。



割り込み失礼します。

>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 とするぐらいしかないと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/30 23:57

#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を入れて、どのような動きをしているか確認してみてください
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/30 23:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!