2016-06-16 165 views
-1

嗨我正在处理下面的代码,但它显示错误,当我尝试从工作表中一次删除整个列(多个单元格)。该代码与if语句正常工作,只是我不能从表单中一次删除所有“M”&“我”字符。 下面是代码:vba if语句错误

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
If Target.Column = 18 Then 
    ThisRow = Target.Row 
    If Target.Value = "M" Then 
     Range("AB" & ThisRow) = "NA" 
    ElseIf Target.Value = "I" Then 
    Range("AB" & ThisRow) = "" 
    Else 
    Range("AB" & ThisRow) = "" 
    End If 
    If Target.Value = "M" Then 
     Range("AC" & ThisRow) = "NA" 

    ElseIf Target.Value = "I" Then 
    Range("AC" & ThisRow) = "" 
    Else 
    Range("AC" & ThisRow) = "" 
    End If 
     End If 
End Sub 

更新代码

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim r As Integer, lastRow As Integer 

If (Not Target.Column = 24) Then Exit Sub 
If (Target.Columns.Count > 1) Then Exit Sub 

lastRow = Cells.SpecialCells(xlCellTypeLastCell).Row 

Application.ScreenUpdating = False 
For r = Target.Row To Target.Row + Target.Rows.Count - 1 
    Range("Z" & r & ",AA" & r & ",AB" & r & ",AC" & r) = IIf(Cells(r, 24) = "Yes", "NA", "") 
    Range("Y" & r & ",Z" & r & ",AA" & r & ",AB" & r & ",AC" & r & ",AD" & r) = IIf(Cells(r, 24) = "No", "NA", "") 
    If (r = lastRow) Then Exit Sub 
Next r 
Application.ScreenUpdating = True 

末次

+1

什么是抛出的错误,哪条线导致它? – RGA

+0

这条线('ElseIf Target.Value =“I”Then')没有目的;你的代码表明,如果目标单元格的值是M,则将AB/AC替换为“NA”,否则将其替换为“”。如果Else的输出是同一个东西,那么你不需要'ElseIf'。 – Dave

回答

1

您可以逃脱的代码时,整个目标列由之前的第一如果在插入该行删除声明:

If (Target.Rows.Count > 1) Then Exit Sub 

您也可以同时更新两种靶细胞和使用IIF语句来计算值简化代码:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim r As Byte 
    If (Target.Rows.Count > 1) Then Exit Sub 

    If Target.Column = 18 Then 
     r = Target.Row 
     Range("AB" & r & ",AC" & r) = IIf(Target.Value = "M", "NA", "") 
    End If 
End Sub 

更新编辑多行:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim r As Integer, lastRow As Integer 

    If (Not Target.Column = 18) Then Exit Sub 
    If (Target.Columns.Count > 1) Then Exit Sub 

    lastRow = Cells.SpecialCells(xlCellTypeLastCell).Row 

    Application.ScreenUpdating = False 
    For r = Target.Row To Target.Row + Target.Rows.Count - 1 
     Range("AB" & r & ",AC" & r) = IIf(Cells(r, 18) = "M", "NA", "") 
     ' repeat above line for further checks 
     Range("AE" & r & ",AF" & r) = IIf(Cells(r, 18) = "S", "NA", "") 

     If (r = lastRow) Then Exit Sub 
    Next r 
    Application.ScreenUpdating = True 
End Sub 
+0

代码工作正常,但是当我删除像“M”这样的值时,它也应该删除已填充的单元格。意思是在删除它所有填满的单元格之后也应该是空白的。 – Striker

+0

我也可以知道是否需要添加一个除“M”之外的验证,即不同单元格的“S”以突出显示“不适用”我需要在上述代码中做出哪些更改? – Striker

+0

我不太明白你的问题。这些不同的细胞是目标还是来源?如果要在列R包含值“S”时创建单独的列表(即不同的目标),则将第一行复制到For循环中,之后立即插入并更新值。如果您希望输出在同一个列表中,您可以将新条件添加到IIF条件中,例如'IIf(Cells(r,18)=“M”或Cells(r,18)=“S” NA“,”“)'。 – lonestorm