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

おはようございます

マウス関連の選択範囲で使うVBAを調べました
左上は Selection(1)
右下は Selection(Selection.Count)
行数は Rows.Count
列数は Columns.Count
ここから先はVBAでどう書いたらいいでしょうか

対象の範囲はA1:C10

マウスで複数セル範囲が選択された

その範囲がA1:C10に複数含まれる
または
範囲がすべてA1からC10に含まれる

ということは、早い話が、A1:C10内で複数セルが選択されている
Selection(Selection.Count)が2以上

Selection(1)をSelect

と、ここまで考えました

質問者からの補足コメント

  • すみません
    お礼は昼休みになります

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/10/31 07:14
  • これはVBAでは大変ですね
    1列で2行以上をマウスで範囲選択されるケースもあります
    使う人は想定外の操作をするので、VBAは完ぺきにしようと思うと終わりがないです

      補足日時:2017/10/31 07:36

A 回答 (10件)

考え方を逆にしてみました。

この方がスッキリします。
-----------------------------------------------------------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim 行 As Long
Dim 列 As Long
For 行 = 1 To 10
For 列 = 1 To 3
If Not Intersect(Target, Cells(行, 列)) Is Nothing Then
Application.EnableEvents = False
Cells(行, 列).Select
Application.EnableEvents = True
Exit Sub
End If
Next
Next
End Sub
-----------------------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

なんども真剣に対応していただき感謝します
ちょっとシートの配列を変えたりして手間取りました
今日は休みなので気合を入れ直しています

For Nextが処理の前に書いてあったので驚きです
範囲指定をFor Nextで回せるんですね、初めて知りました

こういう技はネットでは検索しても出てこないので大変貴重です
ありがとうございます

しかも、マウス操作で出てくるコードを使っていません
新発見の連続です。ありがとうございます
入門レベルの私にも理解できるコードで難しい処理ができていますので
大変勉強になります
シートに組み込んで動作確認できました
ありがとうございました

お礼日時:2017/11/01 02:19

余計なことかもしれませんが以下の2つを作っておくと、修正作業に一時的に動作を止めたり再開で来たりしますので便利ですよ。


-----------------------------------------------------------------------------------------
Sub イベント割込み再開()
Application.EnableEvents = True
End Sub
-----------------------------------------------------------------------------------------
Sub イベント割込み停止()
Application.EnableEvents = False
End Sub
-----------------------------------------------------------------------------------------
※ 修正作業を終えたら「イベント割込み再開」を行うのを忘れないように!(動作しなかったら「イベント割込み再開」マクロを実行するように言っておいても良いかもしれません)
    • good
    • 0
この回答へのお礼

おはようございます
昨日は大変お世話になりました

Application.EnableEvents = TrueやFalseはマクロで使っています
ここgooで「書き込みの前後に入れろ」と教えていただきました

Application.EnableEvents = False
'マクロで書き込む前に上の1行書く
For Each r In Target
'指定範囲中の入力されたセル(target)を探し回る?
If Target.Count = 1 Then
 処理
else
処理
End If
Next r
'マクロで書き込みが終わったら以下の1行書く
Application.EnableEvents = True

この一行だけをマクロで使うなんて考えもしませんでした

式が間違って時々無限ループになってしまうので
その時はタスクマネジャーを起動してエクセルを終了しています

次エクセルが止まらなくなったら使ってみます
ありがとうございます

お礼日時:2017/11/01 06:02

yoreyoreさんやtom04さんの物だと、例えば「B5」セルを選択している状態で[Ctrl]キーを押しながら「A3」セルを選択

すると、「B5」セルの方が選択されてしまいますが良いのでしょうか?
    • good
    • 0
この回答へのお礼

何度も真剣に心配していただいてありがとうございます
[Ctrl]キーを押しながら・・・は想定してませんでした

一応、2個つながって範囲選択されなければ
私のレベルではこれでいいと思っています

お礼日時:2017/11/01 01:52

おはようございます。

横から失礼します。こんな感じでどうでしょう。
確認ですが「左上」の定義は「一番左の列の一番上のセル」で合ってますか?それとも「一番上の行の一番左のセル」ですか?提示したマクロは前者として実装したつもりですが、もし後者なら100riさんの方で修正してみて下さい。
それから、左上をSelectしてしまうと選択が解除されてしまい、見た目が面白くないので、左上をActivateにしています(Activeセルが移るだけです)。

ちなみに、これって何に応用されるのでしょうか?利用シーンが想像できなかったので、できれば教えて下さい。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim sr As Range
Dim r As Range
Dim tr As Range
Set sr = Intersect(Target, Range("A1:C10"))
If sr Is Nothing Then Exit Sub
If sr.Count <= 1 Then Exit Sub
Set tr = sr(1)
For Each r In sr.Areas
If r(1).Address < tr.Address Then
Set tr = r(1)
End If
Next r
tr.Activate
End Sub
    • good
    • 0
この回答へのお礼

ママチャリさん、こんばんは
お礼が遅くなりました
前にもselect caseの使用を教えていただきました

お陰様でIFばっかりのマクロが見やすく成りました
今は、アドバイスいただいたように、「コードを短く」よりも
「後で分かりやすく」を心がけております

教えていただいたマクロは私の想定していたスタイルで大変参考になります
Is Nothing 大変勉強になりました

上級者の方が頻繁に使うSetとFor Eachがまだ私は使いこなせません
Setは分かりますがFor Eachがどうやってぐるぐる回っているのか
イメージがつかめませんので慣れないといけません

「左上」の定義の件ですが、すいません、私にはどちらも同じことの
ように思えてしまいます。
理由は、私には違いが分からないだけで単に無知だからです

何に応用するかですが

列をその時の必要(見たい・今は見なくていいから非表示にして、表を画面に収めたい)などの理由で表示・非表示切替できるようにしています
その時にロックしてない列をまたいで範囲選択してDeleteしないように
するためです(うまく説明できていません)

お礼日時:2017/11/01 01:25

こんにちは!



横からお邪魔します。
>対象の範囲はA1:C10
というコトは・・・

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A1:C10")) Is Nothing Then
Target(1).Select
End If
End Sub

こんな感じをお望みなのでしょうか?m(_ _)m
    • good
    • 1
この回答へのお礼

こんにちは
前にも何度かお世話になっています
仕事の合間にお礼させていただきます

「ちょっと待ってください、いい加減にしてください」と言いたくなるほど
あまりに簡素で力抜けしました。
本当にまいりました。

要するにあれですね。
「指定範囲に引っかかったら(どういう範囲を選択しても)Target(1).Select」
なんですね

今までの苦労は何だったんでしょうか
教えていただく私が言うのは大変大変失礼ですが、「お見事」の一言しかありません

早速やって見ましたが、どういう範囲選択であっても、指定範囲に選択範囲が
一部でも入っていれば見事に目的を達成しております
セルを一個選択したらちゃんと選択できます
ありがとうございました

ああ、見事過ぎて疲れがどっと出ました
笑っちゃいます

お礼日時:2017/10/31 10:39

目的がはっきりしませんが、シートモジュールに次のようなコードを書くと、似たようなことになります。



例:Sheet1のモジュールに
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Selection(1).Select
End Sub
    • good
    • 0
この回答へのお礼

こんにちは
午前の休憩時間中に気づきましたが時間が足りませんでした

教えていただいたことに範囲指定を追加したら、ちゃんと狙った動きをしてくれました
ありがとうございました

私は途中を難しく考えすぎていました
判断→Selection(1).Select を考えて、判断でつまずきました

よくよく考えたら、「セルを一個しか選択させない」のですから
範囲指定→判断不要→Selection(1).Select だけで良かったんですね

そういう発想ができませんでした
お陰様で簡単なマクロで済みました
ありがとうございました

お礼日時:2017/10/31 12:17

A1:C10の範囲では複数のセルを選択出来ないようにするだけでしたら以下のようなもので良いと思います。


-----------------------------------------------------------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row <= 10 Then
If Target.Column <= 3 Then
If Target.Count >= 2 Then
Application.EnableEvents = False
If Target.Areas.Count = 1 Then
Target(1).Select
Else
If Target.Areas(1)(1).Row = Target.Areas(2)(1).Row Then
If Target.Areas(1).Column < Target.Areas(2)(1).Column Then
Target.Areas(1)(1).Select
Else
Target.Areas(2)(1).Select
End If
Else
If Target.Areas(1)(1).Row < Target.Areas(2)(1).Row Then
Target.Areas(1)(1).Select
Else
Target.Areas(2)(1).Select
End If
End If
End If
Application.EnableEvents = True
End If
End If
End If
End Sub
-----------------------------------------------------------------------------------------
※ 後から[Ctrl]キーを押しながら範囲外が選択された場合は、範囲内の処理が優先されます。
    • good
    • 0

「範囲をA1:C10に絞る」ですが、この範囲外が後から選択された場合はどうするのでしょうか?


また範囲内と外を跨いだ選択が有った場合はどうするのでしょうか?例えば「B5」セルが選択された状態で [Ctrl]キーを押しながら「B2:D4」セルを選択した場合など…
    • good
    • 0
この回答へのお礼

指摘していただいてありがとうございます

「範囲をA1:C10に絞る」ですが、この範囲外が後から選択された場合はどうするのでしょうか?
範囲外はマクロ完成後にロックする予定でいます
質問しておきながら無責任ですが、対処法をあまり自分でもよく分かっていません

マクロはどんなセル選択にも対応しようとすると頭が痛くなりますね
だから、職場に数多くあるエクセルはマクロで自動化されてないのだと思います

なのに、マクロを知らない私がちょっとケチをつけたばっかりに請け負うことに
なってしまって後悔してます
しかし、うまく解決できるとマクロは面白いのでついつい手を出してしまいます

お礼日時:2017/11/01 01:47

No.1 の訂正



すみません。No.1のコードでは [Ctrl]キーを使った複数セルの選択の場合、後から選択した方が右上でも元の方が選択されてしまいます。
    • good
    • 0
この回答へのお礼

何度も真剣に対応していただきありがとうございます
私のレベルではセルを縦横2個以上選択されなければ目的は達成できます
2個以上選択された時の処理ができないからです

本当はSub Worksheet_Changeで対処したいのですが
私の能力では対処できないので逃げることにしました

お礼日時:2017/11/01 01:36

確認ですが、2つ以上のセルを選択したら1番右上のみの選択に変更する。

つまり複数セルを選択出来ないようにすると言う事でしょうか?それでしたら
-----------------------------------------------------------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count >= 2 Then
Application.EnableEvents = False
Target(1).Select
Application.EnableEvents = True
End If
End Sub
-----------------------------------------------------------------------------------------
この回答への補足あり
    • good
    • 0
この回答へのお礼

おはようございます
こんなに速く回答もらえてうれしいです

私の文章がごちゃごちゃしててわかりにくいのですが
範囲をA1:C10に絞るのはどう書いたらいいでしょうか?

お礼日時:2017/10/31 07:10

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