[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル結合を含む行で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.