次の方法で共有

選択リスト中の特定データを選択した場合だけメッセージを表示させるにはどうしたら良いのでしょうか?

Anonymous
2020-08-12T08:23:21+00:00

初心者ですが、見よう見まねで下記のように打ってみました。

しかし、特定データ”研修”を選択しても、ディスプレイ上に何も表示されません。

正しいコードをご教示頂けると助かります。

なお、この質問はエクセル365で打っていますが、使用したいPCはエクセル2016(windows10)です。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'午後の研修会場

On Error GoTo wkError

If Intersect(Target, Range("F9:BP9")) Is Nothing Then

Exit Sub

Else

If Target.Value = "研修" Then

MsgBox "出張先を、下のセルに入力して下さい。", vbOKOnly

End If

End If

wkError:

Err.Clear

End Sub

Microsoft 365 と Office | Excel | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

ひまじん 17,185 評価のポイント
2020-08-13T07:59:34+00:00

こんにちは。

新たに提示されているコードにはいくつか問題点がありますので、以下に書き出してみました。

  1. Worksheet_Change イベントは『シートモジュール』に記述しなければ起動しません。

Auto_Open と同一モジュールに書いているということは、『標準モジュール』に記述しているように思えるので。 2. Target.Value = "研修" Or "出張" は間違い。

正しくは、

Target.Value = "研修" Or Target.Value = "出張"

と書かなければなりません。 3. If の入れ子の間違い。

提示されているコードのままだと、『 If Not Intersect(Target, Range("F9:BP9")) Is Nothing Then 』が TRUE か FALSE か判断されるのが、『 If Not Intersect(Target, Range("F7:BP7")) Is Nothing Then 』が TRUE の場合だけになってしまいます。

まず1、について確認ですが、もし『標準モジュール』に『 Private Sub Worksheet_Change(ByVal Target As Range) 』以下のコードを記述されているのでしたら、これを『シートモジュール』(例えば Sheet1 のシートモジュール)に移さなければなりません。(『標準モジュール』のほうには、新たに提示されているコードの上から 5行を残します。)

ただし、コードに上記2、3、のような間違いがありますので、まずは『シートモジュール』のコードウィンドウを開いたうえで、下記のようなコードを記述してみてください。(下記をコピー・貼り付けでも構いません。)

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

  If Not Intersect(Target, Range("F7:BP7,F9:BP9")) Is Nothing Then

    If Target.Value = "研修" Or Target.Value = "出張" Then

      MsgBox "出張先を、下のセルに入力して下さい。", vbOKOnly

    End If

  End If

End Sub

※ Option Explicit はモジュール単位で宣言する必要がありますので、必要ならば上記のように記述してください。

※ Range オブジェクトのセル範囲の指定方法にも注目してください。詳しくはネットで検索を。

<『シートモジュール』のコードウィンドウを開く方法。>

図1で左上にある「プロジェクトエクスプローラー」の中の「 Sheet1(Sheet1) 」(赤枠で囲っている箇所)をダブルクリックすればコードウィンドウが開きます。「 Sheet1(Sheet1) 」の ( ) の中にはシート名が入ります。

・図1

以上です。

Windows10 と Excel2016 の組み合わせで動作確認しています。

ご参考になれば幸いです。

この回答は役に立ちましたか?

1 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

4 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2020-08-13T12:24:09+00:00

    ひまじん様

    追伸

    標準モジュールに記述していたコードを消したら、成功しました。

    ありがとうございました。

    感謝感激です。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2020-08-13T10:45:17+00:00

    ひまじん様

    誤りを指摘して頂いたうえ、明快な見本コードまで示して頂き有難うございます。シートモジュールの開き方も教えていただきありがとうございます。

    早速ですが、作成中のエクセル表では、本件マクロを実行したいシートはSheet2であるため、Sheet2のコードウィンドウに記述してみましたが、エクセルの該当セルでリストからデータ選択してもメッセージの表示がでません。エクセル表の選択リストが別シート(Sheet4)にあるのですが関係ありますか?

    基本的な何かの処理が欠けているのでしょうか?

    さらに、ご指南いただけると助かります。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2020-08-13T00:24:55+00:00

    ひまじん様 

    丁寧なご回答をありがとうございます。

    早速、ご回答を参考に、下記のように書いてみました。

    F7:BP7と、F9:BP9の2範囲を参照して、”研修”又は、”出張”を選択した場合にメッセージを表示させたいのですが・・・

    しかし、起動しません。

    私に基本的な知識がないため、書いている場所が違うのかもしれません。

    上5行は本件とは関係のないマクロで使用しているコードです。

    この下に、記入したのですが、場所が違うのでしょうか?

    Option Explicit

    Public FILE_PATH As String

    Sub Auto_open()

    FILE_PATH = ThisWorkbook.Path

    End Sub

    ーーーーーーーーーーーーーーーーーーーーーーーー

    Private Sub Worksheet_Change(ByVal Target As Range)

      If Not Intersect(Target, Range("F7:BP7")) Is Nothing Then

        If Target.Value = "研修" Or "出張" Then

         MsgBox "出張先を、下のセルに入力して下さい。", vbOKOnly

        End If

         If Not Intersect(Target, Range("F9:BP9")) Is Nothing Then

            If Target.Value = "研修" Or "出張" Then

              MsgBox "出張先を、下のセルに入力して下さい。", vbOKOnly

          End If

        End If 

      End If

    End Sub

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. ひまじん 17,185 評価のポイント
    2020-08-12T14:36:43+00:00

    こんにちは。

    Worksheet_SelectionChange イベントは、簡単に言えば『セルの選択が別のセルに変更になった』タイミングで起動されるイベントです。『セルの内容が変更になった』タイミングでは起動しません。

    『セルの内容が変更になった』タイミングで起動させたい場合には、Worksheet_Change イベントを使ってみてください。

    質問文で提示されているコードをそのまま使うならば、以下のように先頭行だけ書き直せばご希望通りの動作になるかと思います。

    Private Sub Worksheet_Change(ByVal Target As Range)

      On Error GoTo wkError

      If Intersect(Target, Range("F9:BP9")) Is Nothing Then

        Exit Sub

      Else

        If Target.Value = "研修" Then

          MsgBox "出張先を、下のセルに入力して下さい。", vbOKOnly

        End If

      End If

    wkError:

      Err.Clear

    End Sub

    ただ、ちょっと気になったのは、余分に思える箇所が多いことです。

    一例ですが、下記のように書くことも出来ますので、こういった書き方も検討されてみてはいかがでしょう。

    (エラー処理は必要ないように思えたので省略しています。)

    Private Sub Worksheet_Change(ByVal Target As Range)

      If Not Intersect(Target, Range("F9:BP9")) Is Nothing Then

        If Target.Value = "研修" Then

          MsgBox "出張先を、下のセルに入力して下さい。", vbOKOnly

        End If

      End If

    End Sub

    尚、コードを書く場合には、上記のようにインデントを付ける(スペースを入れて字下げする)と少し見やすくなるかと思いますよ。(ただし、wkError: のようなラベルには付られませんが。)

    <注意点>

    今回の場合には該当しないと思いますが、Worksheet_Change イベントは、セルの内容を手作業で変更したり、リストから手作業で選んだりした場合には起動しますが、セルに入れた数式の結果が自動的に変更になったとしても起動しません。

    ご注意ください。念のため。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません