[[20260630151728]] 『セルに入力後、次の入力セルへ移動するには』(ざっくばらん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『セルに入力後、次の入力セルへ移動するには』(ざっくばらん)

お願いします。
A1セルに値を入力後、改行すると次のB5セルに移動する方法を調べたら次のようなプログラムを知りました。

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo ExitHandler

    ' 例: A1セルで入力後にEnterを押したらB5へ移動
    If Not Intersect(Target, Me.Range("e4")) Is Nothing Then
        Application.EnableEvents = False
        Me.Range("e6").Select
    End If

ExitHandler:

    Application.EnableEvents = True
End Sub

上記のプログラムで移動することはできたのですが、
更にB5セルに入力した後、C10セルへ移動させたい場合はどのように
プログラムすればよいのでしょうかよろしくお願いします。

< 使用 Excel:unknown、使用 OS:unknown >


提示済みのコードを利用するとすれば

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo ExitHandler

    If Target.CountLarge > 1 Then Exit Sub

    Application.EnableEvents = False

    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Range("B5").Select
    ElseIf Not Intersect(Target, Range("B5")) Is Nothing Then
        Range("C10").Select
    End If

 ExitHandler:
    Application.EnableEvents = True

End Sub

(もうすぐ7月) 2026/06/30(火) 16:03:30


ありがとうございます。
コードの意味が分からないので、そのまま使用しました。
うまくいきました 助かりました。
(ざっくばらん) 2026/06/30(火) 16:08:31

解決した?ようですが、ちょっと気になったのでコメントします。

■1
>コードの意味が分からないので、そのまま使用しました。
さすがに危なすぎます。
一応、マクロを使ってファイルやシステムを破壊をすることも可能なので、よくわからないのをそのまま採用するのはセキュリティの観点から避けるべきです。
また、セキュリティ以外にコードを記述した以上、責任者はあなたなので、想定外の動作になったときに何がマズイかわかってないと非常に困ったことになるとおもいます。
したがって、わからない命令はネットで調べてみて、それでもわからなければ追加質問するなりすることをお勧めします。

 ---------------------------------------
 以下は興味がある場合だけ読んでみてください。
 ---------------------------------------

■2
最初のコードを疑似コードにしてみると、以下のような命令になっています。

 Private Sub このワークシートでセルの書き換えがあったときに発動するマクロです(ByVal Target As Range)

    もしも 書き換えのあったセルにE4セルが含まれていたら
        イベントの発生を一時的に無効にして
        E6セルを選択しなさい
    もしもの話はおしまいです

 ExitHandler:
    イベントの発生を有効にします
 End Sub

したがって、上記で「A1セル」の数字を書き換えたあと「B5セル」が選択されたということであれば、ただの勘違いでしょう。

仰る条件であれば、以下のようになるはずです。(必要のない部分は削っています(■5を参照))

    Private Sub Worksheet_Change(ByVal Target As Range)
        '▼A1セルを含むセル(範囲)が書き換えられたか判定
        If Not Intersect(Target, Range("A1")) Is Nothing Then
            Range("B5").Select
        End If
    End Sub

■3
今回であれば、書き換えのあったセルがB5のときの処理を追加したいのですから、単純にIF〜End IFのセットを別途追加すればよいです。

    Private Sub Worksheet_Change(ByVal Target As Range)
        '▼A1セルを含むセル範囲が書き換えられたか判定
        If Not Intersect(Target, Range("A1")) Is Nothing Then
            Range("B5").Select
        End If

        '▼B5セルを含むセル範囲が書き換えられたか判定
        If Not Intersect(Target, Range("B5")) Is Nothing Then
            Range("C10").Select
        End If
    End Sub

■4
なお、ChangeイベントはTargetが複数セルになることがあり得ます。
よくあるところでは、セル範囲をまとめてクリアしたり、コピペしたりする場合が該当します。
(もちろん、複数セルを選択した状態で入力し Ctrl + Enterで確定しても複数セルの書き換えになります)

この点について、もうすぐ7月さんのコードでは↓の部分で単一セルのみを書き換えた場合以外は即終了になっています。

 If Target.CountLarge > 1 Then Exit Sub

また、上記を消したとしても、IF関数で分岐させていますので(一度に)書き換えられたセル範囲にA1セルが含まれている場合は、B5が含まれているかどうかの判定には進みません。

採用するならば、そういったところも理解されたほうがよいとおもいます。

■5
このほか、今回のケースでは↓は不要です。

 Application.EnableEvents = False

マクロ中にセルに書き込むような命令があれば、その動作が自分自身を呼び出して、呼び出されたものが自分自身を呼び出して・・・という状態に陥るため、イベント発生のチェックを一時的に無効にする必要がありますが、今回はSelectしているだけなので関係ありません。

(もこな2) 2026/06/30(火) 18:47:19


コメント返信:

[ 一覧(最新更新順) ]


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