2017-09-07 5 views
0

データ検証用ドロップダウンリストのマクロを作成しました。これは、隣り合う2つの列のセルに、値に応じて、または選択に応じて黄色で塗りつぶします。以下は、これがどのように見えるかの写真です:私は、ドロップダウンリストから、「YES」を選択した後、私は、隣接する二つのセル内のデータを値またはテキストがそのセルに入力されると、セルの背景色を削除するにはどうすればよいですか?

enter image description here

を入力すると、黄色の塗りつぶしは、所定の位置に残っています。以下は、これがどのように見えるかの画像です:

enter image description here

目標:私は黄色がを削除または任意の値に一度「埋められていない」またはテキストは、そのセルに入力されます記入したいと思います。

VBAでこれを行う方法はありますか?私はこれが条件付き書式設定で実行可能であることを認識していますが、これがVBAで実行可能かどうかを見たいと思っていました。以下は

私が叩いている私のコードです:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 


Application.ScreenUpdating = False 

If Target.Count > 1 Then Target.Interior.ColorIndex = xlNone 

If Target.Count > 1 Then Exit Sub 



Select Case Target 

Case "YES" 

    If Target = "YES" Then 
     Target.Offset(0, 1).Interior.ColorIndex = 6 
     Target.Offset(0, 2).Interior.ColorIndex = 6 

     If Target.Offset(0, 1).Value = "NULL" Then Target.Offset(0, 1).ClearContents 
     If Target.Offset(0, 2).Value = "NULL" Then Target.Offset(0, 2).ClearContents 

     If Target.Offset(0, 1).Value = "NULL" Then Target.Offset(0, 1).Interior.Pattern = xlNone 

    If Target.Offset(0, 2).Value = "NULL" Then Target.Offset(0, 2).Interior.Pattern = xlNone 

      If Not Target.Cells.Count = 1 Then 
       Exit Sub 
      If Intersect(Target, Columns(2)) Is Nothing Then 
       Exit Sub 
      End If 
     End If 
    End If 
Case Else 
    If Target = "NO" Then 
     Target.Offset(0, 1) = "NULL" 
     Target.Offset(0, 2) = "NULL" 

     If Target.Offset(0, 1).Interior.ColorIndex = 6 Then Target.Offset(0, 1).Interior.Pattern = xlNone 

    If Target.Offset(0, 2).Interior.ColorIndex = 6 Then Target.Offset(0, 2).Interior.Pattern = xlNone 

      If Not Target.Cells.Count = 1 Then 
       Exit Sub 
        If Intersect(Target, Columns(2)) Is Nothing Then 
         Exit Sub 
        End If 
      End If 
    End If 
End Select 
End Sub 

私はこの問題上の任意の助けをいただければ幸いです!

+0

は、なぜあなたは1 1Columnsと交差するために(2)をテストしています?私は他の多くの質問をしています... –

+0

あなたのコードと誤って使用されたケースステートメントに少し混乱があるようです。 – perfo

答えて

1

思想は、あなたが重複していた:あなたは今、条件付き書式をしたいようHow do I remove a fill color when data gets entered in cells from an adjacent drop down list?

は色だけをオフにするとは対照的に、見えます。

Sheets("NAME").Cells.FormatConditions.Delete 
With Sheets("NAME").Range("B2:C10000") 
    .FormatConditions.Add Type:=xlExpression, Formula1:="=AND(ISBLANK($B2),$A2=""Yes"")" 
    With .FormatConditions(.FormatConditions.Count) 
     .SetFirstPriority 
     With .Interior 
      .ColorIndex = 6 
     End With 
    End With 
End With 

これはExcelで、またはVBA経由でオンにすることができます。これにより、コードの追加と削除が完全に行われます。

+0

新しい形式を追加する前に、条件付き書式設定をオフにすることに注意してください。列の前の$は、範囲内のすべてのセルに式を個別に適用できるようにします。その後、条件付き書式設定では黄色の内部が得られるように、コードから他の色付けを取ります。 – Cyril

+0

これを行う方法を説明し説明するための@Cyrilありがとう!以前の重複した質問に関する混乱についてお詫び申し上げます。この質問は以前の重複した質問に取って代わるものです。とにかく、これは今正しく動作するようです!意図したとおりに動作する黄色を追加したり削除したりするためにコードを完全に置き換えました。 – Nick

+0

@NickRivera心配する人はいません。すべてうまくいってうれしい! – Cyril

0
Option Explicit 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
'*** this assumes your yes no is in col A and you potentially have data in col b and col c *** 
'**declare your variables *** 
Dim Check_Word As String 
Dim Check_Data_ColB As String 
Dim Check_Data_ColC As String 


'** only run the code if something in col A B or C gets changed ***** 

If Target.Column = 1 Or Target.Column = 2 Or Target.Column = 3 Then 

    '**** set check word to the value in col A *** 
    Check_Word = Trim(UCase(Sh.Cells(Target.Row, 1).Text)) 
    '**** set check_data_colB to the value in col B *** 
    Check_Data_ColB = Trim(Sh.Cells(Target.Row, 2).Text) 
    '**** set check_data_colC to the value in col C *** 
    Check_Data_ColC = Trim(Sh.Cells(Target.Row, 3).Text) 

    '*** If the check word is NO or the check word is yes but there is text in col B or C then clear the cells colour *** 
    If Check_Word = "NO" Or (Check_Word = "YES" And (Check_Data_ColB <> "" Or Check_Data_ColC <> "")) Then 
    '*** all other situations result in the cells getting filled in with Yellow **** 
    Sh.Cells(Target.Row, 2).Interior.ColorIndex = 0 
    Sh.Cells(Target.Row, 3).Interior.ColorIndex = 0 
    Else 
    '*** all other situations result in the cells getting filled in with Yellow **** 
    Sh.Cells(Target.Row, 2).Interior.Color = vbYellow 
    Sh.Cells(Target.Row, 3).Interior.Color = vbYellow 
    End If 


End If 
End Sub 
+0

@perfo私はあなたのコードを私の代わりにテストしました。黄色の塗りつぶしでセルにデータを入力すると(ドロップダウンリストから "YES"を選択した後)、黄色の塗りが削除されません。 – Nick

+0

申し訳ありませんが、私のコードは "NO"でそれを削除し、 "YES"で埋めてコード内で入れ替えればうまくいくはずです。 – perfo

+0

私は次のようには思えません。ここでは私がやろうとしていることがあります:ドロップダウンリストから "YES"を選択し、隣接するセルにデータを入力すると、黄色の塗りが消えます。@perfo – Nick

0

このサブは、条件付き書式設定でバックフィルを変更します。希望する範囲に変更することができます。また、任意のVBAせずに条件付き書式設定を行うことができますが、私は、これはあなたが欲しいものだと思う :あなたが応答する変更が1列にあるとき

Sub FormatForValues() 
Dim rngCells As Range 
Set rngCells = Range("D9:D16") 
    rngCells.FormatConditions.Add Type:=xlExpression, Formula1:="=LEN(TRIM(D9))>0" 
rngCells.FormatConditions(rngCells.FormatConditions.Count).SetFirstPriority 
    With rngCells.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .ThemeColor = xlThemeColorDark1 
     .TintAndShade = 0 
    End With 
    rngCells.FormatConditions(1).StopIfTrue = False 
End Sub 
関連する問題