Страницы: 1
RSS
Удаление строк по значению #Н/Д VBA
 
Имею некий конвертер, в котором нужно сопоставить товары с брендами. Для этого использую формулу ИНДЕКС ПОИСПОЗ. Но после сопоставления появляются #Н/Д. Прошу вас подсказать как в VBA удалить строки со значением ячейки #Н/Д.  

Так же прошу подсказать, как мне всиавить формулу только в таблицу где есть значения. Вопрос связан с тем, что кол-во строк будет постоянно меняться и при протягивании формулы макрорекодер ссылается на диапозон ячеек.
Пример приложил))
 
Как всегда, через запись макросов узнать, что фильтрация  по НД это Criteria1:="#НД", а остальное у Вас вроде бы есть.
Я не волшебник, я только учусь.
 
Вот я тоже только учусь.

Уважаемые, может мне кто-нибудь боле подробно написать что мне сделать?
 
DT01, Составил код из двух частей, первая- немного изменил ваш код, который вставляет столбец с формулой, вторая -  удаляет строки по условию, использовал код отсюда https://www.excel-vba.ru/chto-umeet-excel/kak-udalit-stroki-po-usloviyu/ (посмотрите, там много полезного найдете)
Закомментировал для вас строки, чтобы вы понимали ход процесса.

Ту часть, которая переносила отфильтрованные данные на другой лист- убрал. Так как я понимаю, вы делали это для того, чтобы получить данные без ошибок.
Если вдруг понадобится-добавьте) думаю справитесь)
P/S  Уверен, что можно это все и короче записать, но я не могу)
Код
Sub Delete_row()
Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long 'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim arr
    Dim lngI As Long
    
    lngI = Cells(Rows.Count, 9).End(xlUp).Row'тут определяем последнюю заполненную строку в столбце 9, заносим в переменную

       Sheets("Данные из ВАРМ").Columns(9).Insert Shift:=xlToRight 'вставляем столбец
          Range("I1").Value = "Brand" ' называем его
            Range("I2").FormulaR1C1 = _
             "=IFERROR(INDEX(Номенклатуры!R2C3:R213C3,MATCH('Данные из ВАРМ'!RC[-1],Номенклатуры!R2C2:R213C2,0)),0)" 'тут ошибку заменил на ноль
          Range("I2").AutoFill Destination:=Range("I2:I" & lngI) ' протягиваем формулу до конца диапазона (используем переменную в которой хранится номер последней заполненной строки)
      Range("I2:I" & lngI) = Range("I2:I" & lngI).Value ' тут меняем формулу на значения (не обязательно)
'теперь удаляем нули, которыми мы заменили ошибку #Н/Д

    sSubStr = 0 ' значение которое ищем
       lCol = 9 'столбец в котором ищем
        lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
        arr = Cells(1, lCol).Resize(lLastRow).Value
 
    Application.ScreenUpdating = 0
    Dim rr As Range
    For li = 1 To lLastRow 'цикл с первой строки до конца
        If CStr(arr(li, 1)) = sSubStr Then
            If rr Is Nothing Then
                Set rr = Cells(li, 1)
            Else
                Set rr = Union(rr, Cells(li, 1))
            End If
        End If
    Next li
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub
Изменено: Dyroff - 05.12.2018 23:59:42
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
используйте этот макрос
Код
Sub DelRowWithError()
  On Error Resume Next
  Worksheets(1).Cells.SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
End Sub
вместо 1 - поставьте № нужного вам листа
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх