1)ショートカットキー
「アクティブセルの移動」
下 Enter … 選択範囲内で下方向([オプション]で変更可)に移動する。
上 Shift + Enter … 選択範囲内で上方向([オプション]で変更可)に移動する
右 Tab … 選択範囲内で右方向(単列なら下)に移動する。
左 Shift + Tab … 選択範囲内で左方向(単列なら上)に移動する。
隅 Ctrl + . (ピリオド) … アクティブ領域の四隅を右回りで移動する。
隣 Ctrl + Alt + → … 選択範囲内の右にある領域へ移動する。
隣 Ctrl + Alt + ← … 選択範囲内の左にある領域へ移動する。
「アクティブ領域のリサイズ)」
Shift + 方向キー … アクティブ領域を指定した方向に(1行または1列単位で)拡張(縮小)する。
Ctrl + Shift + 方向キー … データが連続した範囲で指定した方向の端までアクティブ領域を拡張(縮小)する。
手作業での修正なら、これ位↑使えれば十分だと思います。
#ショートカットキーはあちこちで紹介されていますから、Webで一覧を手に入れてExcelシートで管理するのがお奨めです。
リサイズは出来る、他の領域内に隠すことも出来る、消す事は出来ない。
2)InputBox から、任意のセル範囲(最大4領域)を指定して、選択中のセル範囲から”マイナス”するマクロ。
「選択範囲を部分解除するマクロ」を簡略化したものに、コピー待機状態を損なわず実行できるようオプションを加えました。
【コピー元のセル範囲を取得する関数】を別途用意すれば、コピー待機状態を損なわず実行できるようになります。
紹介例。
【Excel VBAにて、セルのコピー範囲を知る方法を教えて下さい。(選択範囲ではありません)】
http://oshiete1.goo.ne.jp/qa4535701.html
にて、回答No.1、2の回答者さんが Win32APIを使った方法を紹介されています。
【K窓 Excel技 <Excel Tips>】
http://homepage2.nifty.com/kmado/kvba.htm
の中から
『E03M121 切り取り又はコピーされたセル範囲を取得する』
にある、kGetRangeCopyCut()関数で試してみてください。
自作は間に合わなかったので私も使わせて戴きましたが、ここでは紹介という形を取らせていただきます。
この関数を(同じプロジェクトの 別モジュール!!に)貼り付けたら、
下の記述から、オプションと書いてある行のコメントブロックを外せば、コピーモードにも対応します。
お試し用に、ショートカットキー(Alt + a)から動作させるように書いています。
(「↓ お試し用」から「↑ お試し用」までの9行は無くても使えます。)
XL2003以前のVer.での確認で、ツールバーのボタンに直に登録する方法でも動作しました。
Visual Basic Editor 画面からの実行も問題ないようです。
問題は、特定のダイアログやコントロールを表示させると、コピー待機状態がキャンセルされる、ということです。
例えば、Application.InputBox メソッド を InputBox()関数に代え(範囲を文字列で指定することになりますが)て、
それに合わせて書き直せば、コピーモードの問題からは開放されます。
色々なアプローチがあるでしょうから、応用はお任せします。
' XL2000、2003にて動作確認済み。
' 新規の標準モジュール に 次々行以下を(全文!! 過不足なく!! 排他!!) コピペ して
' Auto_Openを実行してショートカット(Alt + a)を設定。
' ' ============ここから===========
Option Explicit
Option Private Module
DefStr S: DefLng N
Const S_SHORTCUT = "%a" ' ↓ お試し用
' ' ===============================
Sub auto_open()
Application.OnKey S_SHORTCUT, "cjCullAreas"
End Sub
' ' ===============================
Sub auto_close()
Application.OnKey S_SHORTCUT, ""
End Sub ' ↑ お試し用
' ' ===============================
' ' 選択範囲の部分解除 ... Alt + a で動作
Sub cjCullAreas()
Const S_TTL = "選択セル範囲の部分解除"
Dim vCull
Dim rBuf As Range, r As Range, rPos As Range, rRet As Range
Dim sTmp, sRef
Dim nCCpM, nWR, nWC
Dim nTop, nLeft, nBottom, nRight
If Not TypeName(Selection) Like "Range" Then Exit Sub
With Selection
If .Count = 1 Then
MsgBox "単一セルには使えません", 64, S_TTL
Exit Sub
End If
sTmp = .Areas(.Areas.Count).Address
End With
With Application
nCCpM = .CutCopyMode
If nCCpM = xlCopy Then
' Set rBuf = kGetRangeCopyCut() ' オプション
If rBuf Is Nothing Then
nCCpM = 0
If MsgBox("このまま実行するとコピー元範囲を見失います。続行しますか?", 33, S_TTL) _
= vbCancel Then Exit Sub '
End If
End If
Do
vCull = VBA.Array(.InputBox("選択解除するセル(最大4領域)を選択して OK" _
, S_TTL, sTmp, , , , , 8))
If Not TypeName(vCull(0)) Like "Range" Then
MsgBox "キャンセルされました", 64, S_TTL
Exit Sub
ElseIf vCull(0).Areas.Count > 4 Then
MsgBox "解除指定できるのは 一度に 4つ 迄の領域", 48, S_TTL
Else
Exit Do
End If
Loop
nWR = .Rows.Count: nWC = .Columns.Count
For Each r In vCull(0).Areas
With r
nTop = .Row: nLeft = .Column
With .Cells(.Cells.Count)
nBottom = .Row: nRight = .Column
End With
End With
sTmp = Empty
If nTop > 1 Then sTmp = sTmp & ",R1:R" & nTop - 1
If nLeft > 1 Then sTmp = sTmp & ",R" & nTop & "C1:R" & nWR & "C" & nLeft - 1
If nBottom < nWR Then sTmp = sTmp & ",R" & nBottom + 1 & "C" & nLeft & ":R" & nWR & "C" & nRight
If nRight < nWC Then sTmp = sTmp & ",R" & nTop & "C" & nRight + 1 & ":R" & nWR & "C" & nWC
If sTmp <> "" Then
sTmp = Mid$(sTmp, 2)
sTmp = .ConvertFormula(sTmp, xlR1C1, xlA1, xlRelative)
sRef = sRef & " (" & sTmp & ")"
End If
Next r
If sRef <> "" Then Set rPos = Range(Trim$(sRef))
If Not rPos Is Nothing Then Set rRet = .Intersect(Selection, rPos)
End With ' ' <<< With Application ...
If Not rRet Is Nothing Then
If rRet.Areas.Count > 8192 Then
MsgBox "実行後の領域数が 8192 を 超えてしまうので中止します", 48, S_TTL
Else
rRet.Select
End If
End If
If nCCpM <> 0 Then rBuf.Copy '
Set rPos = Nothing: Set rRet = Nothing: Set rBuf = Nothing: vCull = Empty
End Sub
' ' ===============================
' ' ============ここまで===========