vba if语句错误
您好,我正在使用下面的代码,但当我试图一次从工作表中删除整个列(多个单元格)时,它显示了错误。代码与if语句配合得很好,只是我不能一次从工作表中删除所有的“M”和“I”字符。 代码如下:vba if语句错误,vba,excel,Vba,Excel,您好,我正在使用下面的代码,但当我试图一次从工作表中删除整个列(多个单元格)时,它显示了错误。代码与if语句配合得很好,只是我不能一次从工作表中删除所有的“M”和“I”字符。 代码如下: Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Column = 18 Then ThisRow = Target.Row If Target.Value = "M" Then Range("
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
End Sub当删除整个目标列时,可以通过在第一条If语句之前插入此行来转义代码:
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
抛出的错误是什么?是哪一行导致的?这一行(
ElseIf Target.Value=“I”Then
)没有任何用途;您的代码显示,如果目标单元格的值为M,则将AB/AC替换为“NA”,否则将其替换为“”。如果Else
的输出是相同的,则不需要该ElseIf
。代码工作正常,但当我删除像“M”这样的值时,它还应该删除已填充的单元格。意味着删除后,所有填充的单元格也应为空。另外,我是否需要在“M”之外再添加一个验证,即不同单元格的“S”以突出显示“NA”,我需要在上述代码中做哪些更改?我不太理解您的问题。不同的细胞是目标细胞还是来源细胞?如果要在列R包含值“S”时创建单独的列表(即不同的目标),请复制For循环中的第一行,然后立即插入它并更新值。如果您希望输出在同一列表中,您可以将新条件添加到IIF条件中,例如IIF(单元格(r,18)=“M”或单元格(r,18)=“S”,“NA”,“U”)
。是的,我需要将“S”放在列r中,带“NA”的单元格将不同,它不会是“AB”和“AC”。好的,下面是您的答案:将For循环中的前两行更改为Range(“Y”&r&“:AD”&r)=IIf(Cells(r,24)=“No”、“NA”、“”)和If(Cells(r,24)=“Yes”),然后按顺序将Range(“Z”&r&“:AC”&r)=“Yes”
。这些行中的第一行表示更宽的范围,因此如果两个条件都不匹配,则使用该行清除所有相关单元格。第二个使用基本的If语句,因为如果条件不匹配(这不是使用IIF的选项),您不想做任何事情。最后,由于目标行是相邻的,您不需要指定每个单元格,只需使用“Y”&r&“:AD”&r即可。