我是一个初学者 – 试图缩短这个代码

我想要列C中的是/否在列d-h中列出一系列的东西:如果没有单元格是灰色的并且显示N / A并且如果是黄色并且出现下拉菜单或者用户可以input取决于柱

我是以正确的方式去做,还是可以更有效地做到这一点? (抱歉,如果有一个明显的答案 – 我是一个真正的初学者)

Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range If Target.Column = 3 Then Set Cell = Target.Offset(0, 1) If Len(Target.Value) = 0 Then Cell.ClearContents Cell.Interior.ColorIndex = 2 Cell.Value = vbNullString Else If Target.Value = "Yes" Then Cell.ClearContents Cell.Interior.ColorIndex = 36 ElseIf Target.Value = "No" Then Cell.ClearContents Cell.Interior.ColorIndex = 16 Cell.Value = "N/A" End If End If End If If Target.Column = 3 Then Set Cell = Target.Offset(0, 2) If Len(Target.Value) = 0 Then Cell.ClearContents Cell.Validation.Delete Cell.Interior.ColorIndex = 2 Cell.Value = vbNullString Else If Target.Value = "Yes" Then Cell.ClearContents Cell.Interior.ColorIndex = 36 With Cell.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="=Numbers" End With ElseIf Target.Value = "No" Then Cell.ClearContents Cell.Validation.Delete Cell.Interior.ColorIndex = 16 Cell.Value = "N/A" End If End If End If If Target.Column = 3 Then Set Cell = Target.Offset(0, 3) 

注:这是列F,但我也需要相同的列G

 If Len(Target.Value) = 0 Then Cell.ClearContents Cell.Validation.Delete Cell.Interior.ColorIndex = 2 Cell.Value = vbNullString Else If Target.Value = "Yes" Then Cell.ClearContents Cell.Interior.ColorIndex = 36 With Cell.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="=Numbers" End With ElseIf Target.Value = "No" Then Cell.ClearContents Cell.Validation.Delete Cell.Interior.ColorIndex = 16 Cell.Value = "N/A" End If End If End If End Sub 

你可以这样做,不要重复代码。 您将指定列来检查联合范围,并且只检查一次是否与该范围相交。

然后,如果您必须删除指定的单元格偏移量,只需将其添加到if Cell.Validation将删除单元格

 Option Explicit Private Sub Worksheet_Change(ByVal target As Range) Dim rngToCheck As Range Set rngToCheck = Union(ActiveSheet.Columns(3), ActiveSheet.Columns(4)) If Not Intersect(target, rngToCheck) Is Nothing Then FormatCell target End If End Sub Sub FormatCell(ByRef target As Range) Dim offRange As Integer, cell As Range For offRange = 1 To 3 Set cell = target.Offset(0, offRange) If Len(target.Value) = 0 Then cell.ClearContents cell.Interior.ColorIndex = 2 cell.Value = vbNullString Else If target.Value = "Yes" Then cell.ClearContents cell.Interior.ColorIndex = 36 If offRange = 2 Then With cell.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="=Numbers" End With End If ElseIf target.Value = "No" Then If offRange = 2 Then cell.Validation.Delete cell.ClearContents cell.Interior.ColorIndex = 16 cell.Value = "N/A" End If End If Next offRange End Sub 

一个build议,从来没有在事件代码,只是让事件调用另一个函数将必要的事情传递给该函数,应该清楚,你必须在函数中指定你想做的事情!

你可以像这样读取我的代码:

工作表更改? 创build一个范围来检查,我们必须看第3和第4列。

检查更改的单元格是否在该范围内(相交方法)。

如果是,将范围传递给FormatCell函数,让他做他想做的事情。