[[20180808133200]] 『セル結合を含む行で1行のみ行選択をショートカッメx(ロメ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セル結合を含む行で1行のみ行選択をショートカットキーで実行する方法』(ロメ)

アクティブセルの行を全選択するショートカットキーは" Shift + スペースキー" ですが、

アクティブセルの行のどこかにセル結合されたセルが存在した場合に、"Shift + スペースキー" を実行すると、結合された行部分まで選択されます。

(例)
アクティブセル:A2
B2とB3がセル結合されている

この時 "Shift + スペースキー"を実行すると2行目と3行目が選択されます。

これを2行目のみ選択されるようなキー操作はないでしょうか?

行番号をクリックすればできるのは分かりますが、キーボード操作で実行できないかを探しています。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


かなり操作が複雑ですが・・・2016からは選択解除ができるようになったので、
Shift+Spaceでセル結合を加味した行選択したあとに
Shift+F8
十字キーで解除したい行へ移動
Shift+Spaceで行解除
で出来ました。

複数行解除する場合はShift+F8
十字キーで解除したい行へ移動
Shift+Spaceで行解除
を繰り返すことになりそうです・・・。
非実用的ですね。

仮にVBAを使ってもSelectメソッドの特性として結合セルがあると同じように選択してしまうため無理そうです。

一番良いのはセルの結合なんてものは使わないことですよ。
(名無し) 2018/08/08(水) 14:17


出先で試せないのですが、
 rows(Activecell.row).select
でもダメですか?
(もこな2) 2018/08/08(水) 14:54

もこな2様
繰り返しになりますがSelectメソッドは結合セルが含まれているとShift+Spaceと同様にまとめて選択状態にしてしまうのです。
マクロを録画したときと再生したときで結果が変わってしまうため、ExcelVBAの難問の一つとして昔からよく話題に上がります。
(名無し) 2018/08/08(水) 14:59

(名無し)様
ありがとうございます。
提示の方法でできることを確認しました。

一番良いのはセルの結合なんてものは使わないことですよ。

ほんとにそうなんですよね。
見せるための部分と処理のための部分を分けてやるべきですね。
(ロメ) 2018/08/08(水) 15:09


一旦結合セルを解除してからSelectして、その後復元するという方法があるらしいのでちょっと書いてみました。
ここに来て、OnKeyにSpaceキーを割り当てできないという仕様に気がついたので悔しいですが
Ctrl+Shift+十字キーの→にショートカットキーを設定しています。

このマクロをアドインなり、xlsmのWorkbook_Open()イベントに組み込むなり、Alt+F8で実行するなりするとそこそこ実用的になると思います。

VBAの性質上、元に戻すが使えなくなるので注意してください。

Option Explicit

Sub 行選択開始()

    Application.OnKey "+^{RIGHT}", "行選択"
End Sub

Sub 行選択終了()

    Application.OnKey "+^{RIGHT}"
End Sub

Sub 行選択()

    Dim rng As Range
    Dim adrs As Collection
    Set adrs = New Collection
    '一旦結合解除
    For Each rng In Intersect(ActiveSheet.UsedRange, ActiveCell.EntireRow)
        If rng.MergeCells Then
            adrs.Add rng.MergeArea.Address
            rng.MergeArea.UnMerge
        End If
    Next
    '行選択
    ActiveCell.EntireRow.Select
    '結合復元
    Dim adr As Variant
    For Each adr In adrs
        ActiveSheet.Range(adr).Merge
    Next
End Sub

(名無し) 2018/08/08(水) 15:30


複数行の対応とセル以外選択時のエラー対策を行った改訂版です。

 Sub 行選択()
    If TypeName(Selection) <> "Range" Then Exit Sub
    On Error Resume Next
    Dim rng As Range
    Dim adrs As Collection
    Set adrs = New Collection
    '一旦結合解除
    For Each rng In Intersect(ActiveSheet.UsedRange, Selection.EntireRow)
        If rng.MergeCells Then
            adrs.Add rng.MergeArea.Address
            Debug.Print "UnMerge:" & rng.MergeArea.Address
            rng.MergeArea.UnMerge
        End If
    Next
    '行選択
    Selection.EntireRow.Select
    '結合復元
    Dim adr As Variant
    For Each adr In adrs
        ActiveSheet.Range(adr).Merge
    Next
End Sub
(名無し) 2018/08/08(水) 15:36

Sub 事前準備() '最初に一回だけ実行
    Application.MacroOptions Macro:="main", Description:="", ShortcutKey:="q"
    Application.DisplayAlerts = False
    ThisWorkbook.Save
End Sub

'ctrl + Qで選択する。
Sub main()

    Dim r As Range, c As Range, rx As Range, i As Long, j As Long, m As String, rg(20000)
    Set r = ActiveCell
    i = 0
    For Each c In Rows(r.Row).Cells
        If c.MergeCells = False Then
            m = m & c.Address(0, 0) & ","
        Else
            For Each x In c.MergeArea
                m = m & x.Address(0, 0) & ":"
                    If Len(m) > 200 Then
                        rg(i) = Left(m, Len(m) - 1)
                        m = ""
                        i = i + 1
                    End If
            Next x
            If Len(m) > 0 Then m = Left(m, Len(m) - 1) & ","
        End If
        If Len(m) > 200 Then
            rg(i) = Left(m, Len(m) - 1)
            m = ""
            i = i + 1
        End If
    Next c
    rg(i) = Left(m, Len(m) - 1)
    Set rx = Range(rg(0))
    For j = 1 To i
        Set rx = Union(rx, Range(rg(j)))
    Next j
    rx.Select
End Sub

(mm) 2018/08/08(水) 17:38


mmさんの案は結合セルも無視せず選択する方式ですね!
宣言 Dim x As Range を入れたほうが良いかもです。

セルの分解が発生しない分、元に戻すが破壊されないのは素晴らしいのですが、如何せん処理が重いのが難点ですね。

私のコードは選択後に行の挿入、削除、非表示、書式設定などを行なうことを前提として提案したコードになりますので、行番号をクリックした時と同じように利用できます。

mmさんのコードはそのままでは利用場面が私には思いつきませんが、最後に
Intersect(rx,ActiveSheet.UsedRange).Select
とすれば便利に使えそうです。

ロメさんの目的は分かりませんが、自分に合いそうな方をお使いください。
(名無し) 2018/08/08(水) 18:34


コメント返信:

[ 一覧(最新更新順) ]


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