[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル結合を含む行で1行のみ行選択をショートカットキーで実行する方法』(ロメ)
アクティブセルの行を全選択するショートカットキーは" Shift + スペースキー" ですが、
アクティブセルの行のどこかにセル結合されたセルが存在した場合に、"Shift + スペースキー" を実行すると、結合された行部分まで選択されます。
(例)
アクティブセル:A2
B2とB3がセル結合されている
この時 "Shift + スペースキー"を実行すると2行目と3行目が選択されます。
これを2行目のみ選択されるようなキー操作はないでしょうか?
行番号をクリックすればできるのは分かりますが、キーボード操作で実行できないかを探しています。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
複数行解除する場合はShift+F8
十字キーで解除したい行へ移動
Shift+Spaceで行解除
を繰り返すことになりそうです・・・。
非実用的ですね。
仮にVBAを使ってもSelectメソッドの特性として結合セルがあると同じように選択してしまうため無理そうです。
一番良いのはセルの結合なんてものは使わないことですよ。
(名無し) 2018/08/08(水) 14:17
rows(Activecell.row).select でもダメですか? (もこな2) 2018/08/08(水) 14:54
一番良いのはセルの結合なんてものは使わないことですよ。
ほんとにそうなんですよね。
見せるための部分と処理のための部分を分けてやるべきですね。
(ロメ) 2018/08/08(水) 15:09
このマクロをアドインなり、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
    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さんのコードはそのままでは利用場面が私には思いつきませんが、最後に
Intersect(rx,ActiveSheet.UsedRange).Select
とすれば便利に使えそうです。
ロメさんの目的は分かりませんが、自分に合いそうな方をお使いください。
(名無し) 2018/08/08(水) 18:34
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
 Modified by kazu.