プロが教える店舗&オフィスのセキュリティ対策術

エクセルでの選択範囲の追加について。

エクセル使用中にマウスの左ボタンでドラッグしながら
セルを選択する際に、
Ctrlキーを押しながらやるとどんどん追加していくことができます。

この逆に、選択範囲をマイナスしていく方法はありますか?

まとめて貼り付けとか、まとめて書式変更などで
セルを追加していく途中で間違ったセルを選択してしまって、
また初めから・・・ということがよくあります。

A 回答 (5件)

下記に裏ワザとして載ってました。



http://officetanaka.net/excel/function/tips/tips …

でも結構面倒くさい操作なので、大量に選択した際のミスに
限定した方が良さそうです。

いろいろ検索しましたが、特効薬は無いみたいですね。。
    • good
    • 0

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
' ' ===============================
' ' ============ここまで===========
    • good
    • 0

一旦名前を定義し、「名前の定義」ダイアログボックスの「参照範囲」で書き直せばどうでしょうか。



Excel:名前定義
http://homepage3.nifty.com/gakuyu/excel/name.html


★独自に開発した便利な方法を紹介します。
適当なセルに
(1) = と入力
(2) 目的セルを選択(直接セル番地を入力でも可)
(3) , を入力
(4) 手順(3)(4)を繰り返す

=を入力したセルには
=C5,E5:E6,G5,I5:I6,K5:K8,M5:M6
のようにセル番地が記録されます。
≪途中で変更する場合≫
手順(3)で、該当セルにはカラーリファレンスが表示されます。
カラーリファレンスを、ドラッグすれば拡大、縮小、移動が自在です。
セルに入力されているセル番地を、書き換え、削除しても変更可能です。
F2キーで編集モードにしてから、書き換え、削除を行ってください。

(5) 確定後(1)のセルを選択
(6) Shift+Ctrl+[ とキー操作してセル範囲を選択
    • good
    • 0

きちんと検証していないので常にうまくいく自信はないのですが、下記のコードを実行してみてください。



Sub RemoveLastArea()
Dim oldRng As Range
Dim newRng As Range
Dim n As Long

If TypeName(Selection) <> "Range" Then Exit Sub
Set oldRng = Selection
Set newRng = oldRng.Areas(1)

For n = 2 To oldRng.Areas.Count - 1
Set newRng = Union(newRng, oldRng.Areas(n))
Next n
newRng.Select

Set oldRng = Nothing
Set newRng = Nothing
End Sub
    • good
    • 0

たとえば。


コントロールクリックで「A1:A3」「C1:C3」「E1:E3」の3つのエリアを飛び飛びに選択します。

これを「A1:A3」と「C1:C3」,そしてもう一度「A1:A3」を重ねて選択のようにして,見かけ上2箇所選ばれているようで実は重ねて3箇所選択されている,といった所までは出来ます。
でも選択範囲の数を2つに減らすことは出来ません。


#選択範囲の移動/縮小は「やれば出来る」ので色々手管は紹介されますが,現実問題として大概の場合,やり直した方が簡単です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!