• ベストアンサー

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

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

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

シートモジュールにコピーしてください。 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

sasasasato
質問者

お礼

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

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.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以外の他のセルをクリックした後で行ってください。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.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などではない。 ーー この課題は小生にとっては、難しいと思う。ボロが出たらごめんなさい。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

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

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.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

関連するQ&A