Страницы: 1
RSS
Удалить строчку при условии что в ячейке есть определенный текст
 
Здравствуйте. Помогите разобраться, почему макрос удаляет строки через одну ?
Задача состоит в том, чтобы макрос удалял все строки, в которых есть значение "s" в столбце C
Код
Sub del()
Dim rng As Range
    Dim cell As Range
    Dim searchText As String
    
    searchText = "s"
    
    Set rng = ActiveSheet.Range("C1:C50")
    
    Application.ScreenUpdating = False

    For Each cell In rng.Cells

        If InStr(1, cell.Value, searchText, vbTextCompare) > 0 Then

            cell.EntireRow.Delete
        End If
    Next cell

    Application.ScreenUpdating = True
End Sub
 
Код
Sub DelReverse()
Dim rng As Range
    Dim cell As Range
    Dim searchText As String
    
    searchText = "s"
    
    Set rng = ActiveSheet.Range("C1:C50")
    
    Application.ScreenUpdating = False

    'For Each cell In rng.Cells
    Dim arr As Variant
    arr = rng.Value
    
    Dim ya As Long
    For ya = UBound(arr, 1) To 1 Step -1
        If InStr(1, arr(ya, 1), searchText, vbTextCompare) > 0 Then
            rng.Cells(ya, 1).EntireRow.Delete
        End If
    Next

    Application.ScreenUpdating = True
End Sub
 
Цитата
написал:
почему макрос удаляет строки через одну ?
Допустим надо удалить строки 10, 11 и 12. Когда вы удаляете 10-ю строку, 11 строка становится 10-й. В следующей итерации вы переходите на 11-ю, которая по вашему мнению является 12-ой, и удаляете её, миновав 10-ю, которая изначально была 11-ой. Таким образом, вы видите удаление строк "через одну".
 
МатросНаЗебре,
Спасибо. Подскажите еще, пожалуйста, как сделать проверку - если в строке по столбцу C есть буква "s" , но по столбцу B в следующей строке нет текста - то нужно удалить только содержимое ячейки по столбцу B (не удаляя строку), в которой была найдена последняя строка с буквой s в столбце C
 
Код
Sub DelB()
    Dim rng As Range
    Dim rnB As Range
    Dim cell As Range
    Dim searchText As String
    
    searchText = "s"
    
    Set rng = ActiveSheet.Range("C1:C50")
    
    Set rnB = ActiveSheet.Range("B1:C51")
    
    Application.ScreenUpdating = False

    'For Each cell In rng.Cells
    Dim arr As Variant
    arr = rng.Value
    
    Dim brr As Variant
    brr = rnB.Value
    
    Dim ya As Long
    For ya = 1 To UBound(arr, 1)
        If InStr(1, arr(ya, 1), searchText, vbTextCompare) > 0 Then
            If IsEmpty(brr(ya + 1, 1)) Then
                rnB.Cells(ya, 1).Delete
            End If
        End If
    Next

    Application.ScreenUpdating = True
End Sub
 
МатросНаЗебре,
Что-то не то, он теперь не удаляет строки, а просто перемещает содержимое из ячейки B в ячейку C
 
Действительно странно. Более-менее объяснимо было бы, если бы происходило наоборот.
А так?
Код
Sub DelB()
    Dim rng As Range
    Dim rnB As Range
    Dim cell As Range
    Dim searchText As String
    
    searchText = "s"
    
    Set rng = ActiveSheet.Range("C1:C50")
    
    Set rnB = ActiveSheet.Range("B1:C51")
    
    Application.ScreenUpdating = False

    Dim arr As Variant
    arr = rng.Value
    
    Dim brr As Variant
    brr = rnB.Value
    
    Dim ya As Long
    For ya = 1 To UBound(arr, 1)
        If InStr(1, arr(ya, 1), searchText, vbTextCompare) > 0 Then
            If IsEmpty(brr(ya + 1, 1)) Then
                rnB.Cells(ya, 1).Delete Shift:=xlUp
            End If
        End If
    Next

    Application.ScreenUpdating = True
End Sub
 
МатросНаЗебре, Вообще ничего не работает теперь )
 
То, что макрос делает, конечно, не так уж и много, да и смысл этого может показаться стремящимся к ничему, но и нельзя сказать, что это прям совсем ничего.  :D
Если в столбце С есть символ "s", если в столбце B следующая строка пустая, то из текущей строки удаляется ячейка из столбца B.
 
МатросНаЗебре, а все предыдущие строки с буквой S должны удаляться )
 
У вас всё для этого есть.
Код
Sub DelBandReverse()
    DelB
    DelReverse
End Sub
 
МатросНаЗебре, знать бы ещё как это в кучу склеить, чтобы и проверку проводил перед удалением. Я не особо силен в vba
 
Так в сообщении #11 уже склеено.
 
МатросНаЗебре, Оно то склеено, только одно сначала удаляет содержимое ячейки, а второе удаляет эту же строку, потому что в столбце С остается буква S ))
Задача:
1. проверяем, есть ли наличие буквы S в столбце С
2. Если 1 есть, далее проверяем наличие любого текста строкой ниже в столбце B, если там есть текст, и это НЕ слово "СТОП" - удаляем всю строку, если это слово "СТОП" - значит удаляем только содержимое в ячейке в столбце В, и удаляем букву S в той же строке

Прикрепил файл с более понятным описанием
Изменено: Scryde - 01.11.2024 02:24:54
 
Помогите, пожалуйста, кто-нибудь добить эту задачу
Страницы: 1
Наверх