2016-06-16 4 views
-1

Привет, Я работал с приведенным ниже кодом, но он показывает ошибку, когда я пытаюсь удалить весь столбец (Несколько ячеек) сразу с рабочего листа. код отлично работает с утверждением if, я просто не могу удалить все «M» & «I» символы сразу с листа. Ниже приведен код:vba if statement error

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

+1

Что такое ошибка брошена и какая линия вызывает это? – RGA

+0

Эта строка ('ElseIf Target.Value =" I "Then') не имеет никакой цели; Ваш код говорит, что если значение ячейки Target равно M, замените AB/AC на «NA», иначе замените его на «». Вам не нужно, чтобы 'ElseIf', если вывод из' Else' - это то же самое. – 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 

Update редактировать несколько строк:

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

Код работает нормально, но когда я удаляю значения типа «М», он также должен удалить ячейки, которые были заполнены. Средства после удаления всех заполненных ячеек также должны быть пустыми. – Striker

+0

Также я могу узнать, нужно ли мне добавить еще одну проверку, кроме «M», т. Е. Для «S» для разных ячеек, чтобы выделить «NA», какие изменения мне нужно внести в этом выше коде? – Striker

+0

Я не совсем понимаю ваш вопрос. Являются ли разные клетки объектом или источником? Если вы хотите создать отдельный список (т. Е. Другую цель), когда столбец R содержит значение «S», затем скопируйте первую строку внутри цикла For, вставьте ее сразу после этого и обновите значения. Если вы хотите, чтобы результат находился в том же списке, вы можете просто добавить новое условие к условию IIF, например, 'IIf (ячейки (r, 18) =" M "ИЛИ ячейки (r, 18) =" S "," NA "," ")'. – lonestorm