Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vba if语句错误_Vba_Excel - Fatal编程技术网

vba if语句错误

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("

您好,我正在使用下面的代码,但当我试图一次从工作表中删除整个列(多个单元格)时,它显示了错误。代码与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("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即可。