- ベストアンサー
【VBA】 ダブルクリックするとセルの色が変更する
エクセルのA1:A5の範囲でセルをダブルクリックすると(色なし→赤→青→黄色)に変化する方法を教えて下さい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
シートモジュールにコピーしてください。 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
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
#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以外の他のセルをクリックした後で行ってください。
- imogasi
- ベストアンサー率27% (4737/17069)
標準モジュールに 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などではない。 ーー この課題は小生にとっては、難しいと思う。ボロが出たらごめんなさい。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1に訂正と補足 If Target.Row > 1 は If Target.Row >= 1 の間違いです。 ダブルクリックしてセルにカーソルが入らない(セルの編集状態にならない)ようにしてますが入ってもいい場合は Cancel = True を削除してください。
- kkkkkm
- ベストアンサー率66% (1719/2589)
シートモジュールに以下でいかがですか。 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
お礼
有難う御座います。 おかげさまで、作りたかった表ができました。