none
ロックしていないセルがエンターキーでアクティブにならない現象について RRS feed

  • 質問

  • 初めてこちらに投稿いたします。よろしくお願いいたします。

    先日、Microsoftコミュニティにて質問した表題について、こちらで聞いてみるようにアドバイスがありましたので投稿します。

    ロックしていないのに結合しているのでエンターキーではすべての選択可能セルを順送りできず、タブキーか→キーを使わざるをえません。

    これを、エンターキーで操作できるような方法があればと探しております。VBAやその他、なにか案があれば教えていただければありがたいです。

    よろしくお願いいたします。

    以下、Microsoftコミュニティへ投稿したものをコピペします。

    いつも参考にさせていただいています。

    よろしくお願いいたします。


    シート全体を選択→書式設定でロックのチェックボックスを☑(True状態)にした後、

    (画像)

    特定のセルのロックを解除しています。

    特定のセルは横方向に2(あるいは3)セル結合しています。

    結合した状態でアクティブにし、セルの書式設定でロックのチェックを確認すると□(False状態)になっています。

    (画像)

    3行目以下、一行おきに51行目までC列とD列(またはE列)を結合しています。


    シートを保護してEnterキーで選択していくと、

    43行目(※1)まで進み、3行目の最初の結合セル(※1-a)へ戻ってしまいます。


    45行目(※2)をマウスクリックで選択し、エンターキーですすむと、

    47行目(※2-a1)から51行目(※2-a3)まで進み、最初のセルに戻らずに37行目(※2-a4)へ飛びます。

    43行目(※1)まで選択した後、やはり45行目(※2)へ行かずに3行目の最初の結合セル(※1-a)に飛んでしまいます。


    矢印キー(↓)でも同じです。


    何が悪いのか、教えていただけますでしょうか。

    よろしくお願いいたします。

    2019年7月17日 20:08

すべての返信

  • 添付された(?)画像が見えないので想像ですが、エクセルのオプション設定(詳細設定-Enterキーを押した後にセルを移動する)で改行方向が「下」になっていることと、結合セルの末尾のセル位置が関連している気がします。

    右カーソルキーで正常に遷移するなら、エクセルのオプション設定で改行方向を「右」にしてはどうでしょうか?

    2019年7月18日 1:00
  • 以下、Microsoftコミュニティへ投稿したものをコピペします。

    シート全体を選択→書式設定でロックのチェックボックスを☑(True状態)にした後、

    (画像)

    特定のセルのロックを解除しています。

    元画像が見えなかったので、元発言となるコミュニティの投稿ページをリンクしておきます。

    2019/07/16  ロックしていないセルがエンターキーでアクティブにならない (Mickey_xyz さん)

    2019年7月18日 1:37
  • 魔界の仮面弁士様

    リンクのご提示ありがとうございます。おかげさまで画像を拝見できました。

    やはり、改行方向が「下」になっていることと、結合セルの末尾のセル位置が関連していると推測します。

    つまり、C43:E43がアクティブなとき、E43のみがアクティブ判定されているのだと思います。

    この状態でENTERを押すと、E列以降下側には領域がないので、C3に戻ります。

    C51:D51がアクティブなとき、すなわち、D51がアクティブのとき、D列以降は領域がないのでE列へと走査が続き、E列の最初に領域が出現する37行目がアクティブになるのだと思います。

    とはいえ、このことは、リンク先でもすでに言及されていたのですね。

    無駄な回答だったようで失礼しました。
    • 編集済み minmin312 2019年7月18日 2:16
    2019年7月18日 2:12
  • Mickey-msdnprof様、初めまして
    内容は、Microsoftコミュニティで確認しました。

    下記のようなものでいかがでしょうか
    ただし、移動可能なセル(ロックされないセル)は、Select 状態になります。

    VBEで標準モジュールを挿入してそこに

    Option Explicit
    Function TragetAddress() As String
    Dim R As Range, i As Long
    Dim strAddress As String
    Dim tmp As String
    Dim Dictionary As Object, Keys As Variant
        Set Dictionary = CreateObject("Scripting.Dictionary")
        On Error Resume Next

        '    Debug.Print ActiveSheet.UsedRange.Address
        For Each R In ActiveSheet.UsedRange    ' シートの使用領域内の各セルを探索するループ処理
            If R.Locked = False Then       'セルのロックを判定
                tmp = R.MergeArea.Address  '結合セルのアドレス
                Dictionary.Add tmp, tmp    ' 結合セルのアドレス重複を除外
            End If
        Next R
        Keys = Dictionary.Keys
        For i = 0 To Dictionary.Count - 1
            strAddress = strAddress & "," & Keys(i)
        Next i
        Set Dictionary = Nothing
        '左 ,を削除して返す
        TragetAddress = Right(strAddress, Len(strAddress) - 1)
    End Function

    次に対象のシートモジュールに ////////////////////////////

    Option Explicit
     Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     Dim TargetCell
      TargetCell = TragetAddress()
    ' Debug.Print TargetCell
        With Range(TargetCell)
            If Not Intersect(Target(1), .Cells) Is Nothing Then
                Application.EnableEvents = False
                .Select
                Target(1).Activate
                Application.EnableEvents = True
            End If
        End With
     End Sub

    シート保護については、ロックされたセル範囲の選択のチェックをしてください。

    セル範囲SelectでのEnterキーの挙動を利用した物なので使用に合うか分かりませんが

    スキル的にビギナーが作っていますので、試す場合は、バックアップをお願いします。

    追記:Tabキーで移動する運用が良いと思います。機能を覚えるためにも。

    • 編集済み Takumi_Q 2019年7月18日 5:22
    2019年7月18日 5:14