こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【VBA】 ダブルクリックするとセルの色が変更する

エクセルのA1:A5の範囲でセルをダブルクリックすると(色なし→赤→青→黄色)に変化する方法を教えて下さい。

投稿日時 - 2019-04-19 17:29:52

QNo.9608413

困ってます

質問者が選んだベストアンサー

シートモジュールにコピーしてください。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  With Target
    If Intersect(.Cells, Range("A1:A5")) Is Nothing Then Exit Sub
    If .Interior.Color = vbWhite Then
      .Interior.Color = vbRed
    ElseIf .Interior.Color = vbRed Then
      .Interior.Color = vbBlue
    ElseIf .Interior.Color = vbBlue Then
      .Interior.Color = vbYellow
    ElseIf .Interior.Color = vbYellow Then
      .Interior.Color = xlNone
    End If
  End With
  Cancel = True
End Sub

投稿日時 - 2019-04-20 08:20:53

お礼

有難う御座います。
おかげさまで、作りたかった表ができました。

投稿日時 - 2019-05-09 14:12:50

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#3です。
その後、考えてみると、意に満たない結果になる場合があるので、
配列にA1:A5セルの各々の現状の色コードを持つのをやめて、セルの現状の色から採るように改良した。
標準モジュール部分のコードは、なしにして、Worksheet_BeforeDoubleClickイベントに
ーー
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
colortbl = Array(-4142, 3, 5, 6, 7, 11, 12)
If Application.Intersect(Target, Range("A1:A5")) Is Nothing Then
Else
'セルのぬりつぶしの色の.ColorIndex
i = Target.Interior.ColorIndex
MsgBox "現在の色コード" & i
'---配列の何番目か
For j = 0 To 6
If colortbl(j) = i Then
genclindx = j
MsgBox "現在の色コードは" & genclindx & "番目"
Exit For
End If
Next j
'--1つ右の要素へ
genclindx = genclindx + 1
'---限度超えると折り返し
If genclindx > 6 Then genclindx = 0
Target.Interior.ColorIndex = colortbl(genclindx)
End If
End Sub
テストが終われば、Msgbox行は削除のこと。
colortbl = Array(-4142, 3, 5, 6, 7, 11, 12)  が我流で決めている。
ColorIndexのコードと並び順は適当に。
次のダブルクリックは、一旦範囲A1:A5以外の他のセルをクリックした後で行ってください。

投稿日時 - 2019-04-20 22:31:53

ANo.3

標準モジュールに
Public ci(6)
Sub test01()
For i = 1 To 5
ci(i) = 0
Next i
End Sub
ーー
Sheet1のイベントプロシージァーで
Worksheet_BeforeDoubleClickを選んで下記にする。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
colortbl = Array(-4142, 3, 5, 6, 7, 11, 12)
If Application.Intersect(Target, Range("A1:A5")) Is Nothing Then
Else
i = ci(Target.Row)
MsgBox i
i = i + 1
MsgBox i
ci(Target.Row) = i + 1
If i > 5 Then ci(Target.Row) = 0
Target.Interior.ColorIndex = colortbl(ci(Target.Row))
End If
End Sub
ーーー
まず最初に標準モジュールの
test01
を実行(初期化)
次にエクセルシートSheet1に行って(開いて)、A1:A5のどれかのセルをダブルクリックする。
セルの色が順次に、セル単位で決まった順序に変化してゆく。
ダブルクリックは、一旦前回のダブルクリックのセルから、どこかA1:A5以外にに移って、直後にA1:A5をダブルクリックしてください。
適当数をテストしたらMsgbox行を削除してやり直してください。
=====
なぜ、こういう仕組みを作るか、質問に説明されておらず、趣旨を理解しかねて
作っている。色も質問通りでないかも。
普通セルの色は、セルの値の大小などに従って自動で、付けられる考えが多い。
人間の操作でセルの色を付けることは多くないだろう。
それに過去(直前の)状態を引きずって、色を決める(決定される)などは、
高等過ぎる話と思う。
ーー
セルの色について
http://excel.style-mods.net/topic11.htm
などを見て、Colorindexの値を
colortbl = Array(-4142, 3, 5, 6, 7, 11, 12)
のところを修正してください。
上記では、セルの色決定をColorIndex値を使って指定している。RGBやvbRedなどではない。
ーー
この課題は小生にとっては、難しいと思う。ボロが出たらごめんなさい。

投稿日時 - 2019-04-19 22:29:12

ANo.2

No1に訂正と補足

If Target.Row > 1

If Target.Row >= 1
の間違いです。
ダブルクリックしてセルにカーソルが入らない(セルの編集状態にならない)ようにしてますが入ってもいい場合は
Cancel = True
を削除してください。

投稿日時 - 2019-04-19 18:26:49

ANo.1

シートモジュールに以下でいかがですか。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Application.EnableEvents = False
If Target.Row > 1 And Target.Row <= 5 And Target.Column = 1 Then
If Target.Interior.Pattern = xlNone Then
Target.Interior.Color = vbRed
ElseIf Target.Interior.Color = vbRed Then
Target.Interior.Color = vbBlue
ElseIf Target.Interior.Color = vbBlue Then
Target.Interior.Color = vbYellow
ElseIf Target.Interior.Color = vbYellow Then
Target.Interior.Pattern = xlNone
End If
End If
Cancel = True
Application.EnableEvents = True
End Sub

投稿日時 - 2019-04-19 18:22:43

あなたにオススメの質問