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