• ベストアンサー

エクセルVBAで元のデータと変わった時に色を・・・

いつも皆様には大変お世話になっております 早速の質問ですが エクセルVBAで元のデータの入っているセルが色をつけておりまして その元のデータが変わった時にその色を無しにしたいという状況です。 色を変えたいセルはC49からC70までのセルなので Private Sub Worksheet_Change(ByVal Target As Range) For n = 49 To 70 If Cells(n, 3) <> "" Then Target.Interior.Color = xlColorIndexNone End If Next End Sub 一応こんな感じで作ってみたのですが・・・ 上記マクロで謎が2点ありまして (1)なぜかセルのデータを変えたときに薄い青の色がつく (2)どのセルのデータを変えても反応してしまう の2点です まだ(2)の反応してしまうのは何となくわかるのですが(どう直していいかはわかりません;;) (1)の薄い青色がつくのが謎です・・・xlColorIndexNoneって書いているのに・・・ マクロでダブルクリックしたらとか、シートを替えるとといった様なマクロは動かしているのですが、セルのデータを変えて動くようなマクロはまだ作っていないため何かとバッティングしている様な事は無いと思うのですが・・・ 皆様よろしくお願いいたします。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

#2です。 これではどうでしょうか? Dim x Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("C49:C70")) Is Nothing Then Exit Sub x = Target.Value End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C49:C70")) Is Nothing Then Exit Sub If Target.Count > 1 Then MsgBox "一回にセルはひとつにしてください。", vbCritical, "Σ( ̄ロ ̄lll) " With Application .EnableEvents = False .Undo .EnableEvents = True End With Exit Sub End If If Target.Value <> x Then Target.Interior.ColorIndex = 0 End If End Sub

その他の回答 (3)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

2)どのセルのデータを変えても反応してしまう については、 すでに回答出ていますが、わかりやすく書くと If Target.Column=3 Then If Target.Row>48 Then If Target.Row<71 Then Target.Interior.Color = xlColorIndexNone End If End If End If Next

nanny
質問者

お礼

お返事ありがとうございます! ん~なるほど~こうやって見るとわかりやすいですね^^ まだまだ勉強不足な自分ですががんばってやってみたいと思います! ありがとうございます

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

Dim x Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("C49:C70")) Then x = Target.Value End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C49:C70")) Then If Target.Value <> x Then Target.Interior.ColorIndex = 0 End If End If End Sub では?

nanny
質問者

補足

お返事ありがとうございます! マクロコピー&ペーストして入れてみましたがエラーが出ちゃいます 実行時エラー13 型が一致しませんと出てしまいます If Intersect(Target, Range("C49:C70")) Then の部分で出ているようです。Intersectの使い方がいまいちよくわかっていないので、 エラーをどう処理すればいいかもピン!と来ていません。もしよろしければまたお願いします。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>(1)の薄い青色がつくのが謎です・・・xlColorIndexNoneって書いているのに・・・ 無色にするなら「xlColorIndexAutomatic」とします。 >(2)どのセルのデータを変えても反応してしまう 「Target」を捕捉していないからです。 通常は、IF文等で「どこに変化があったのか」を判断して処理に入ります。 For文では適切ではありません。 >その元のデータが変わった時にその色を無しにしたいという状況です。 お作りになったものではこの判断は出来ていませんね。 空白かそうでないかの判断のみです。 「データが変わった時」という判断は元の値を記憶して居てこそ可能な事です。「単純な仕様」と思いがちですがVBAに慣れた人であればこのような「特殊な仕様」は避けます。 Worksheet_Changeイベントはセルの変化を受け取ってくれる便利なイベントですが、セルに同じ値が入っても機能するので「変化」は判断できません。

nanny
質問者

お礼

早速のお返事ありがとうございます。 xNoneじゃだめなのですね ん~深いですね~・・・ もっと勉強がんばります!

関連するQ&A

専門家に質問してみよう