Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Макрос удаления строк / 18 сообщений из 18, страница 1 из 1
14.10.2015, 11:38
    #39076343
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
Подскажите, как написать макрос для удаления строк с одного листа если нет совпадений записей с записями на другом листе?
Есть список всех товаров склада на 2 листе, а на первом листе список товаров которые уже заканчиваются, и нужно чтобы на листе 2 остались только те товары которые есть на листе 1.
...
Рейтинг: 0 / 0
14.10.2015, 11:51
    #39076365
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
...
Рейтинг: 0 / 0
14.10.2015, 12:06
    #39076398
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
Как бы это делалось вручную без построчного сравнения?
Заводим на первом листе доп. столбец, где, используя функцию ВПР(), в зависимости от наличия или отсутствия аналога на втором листе ставим или нет некий признак. Фильтруем список по этому признаку, оставляя только записи с признаком "отсутствует". Дружно выделяем отфильтрованные строки и удаляем. Снимаем фильтр. Удаляем ненужный уже дополнительный столбец.
Как это превратить в макрос?
Включить запись макроса, выполнить указанные выше действия, остановить запись и "причесать" полученный код.
Задача выполнена.
...
Рейтинг: 0 / 0
14.10.2015, 12:13
    #39076409
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
ВПР это единственный вариант?
...
Рейтинг: 0 / 0
14.10.2015, 12:22
    #39076423
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
С ВПР получила совпадения, а как поставить признак?
...
Рейтинг: 0 / 0
14.10.2015, 12:39
    #39076458
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
vasilina,
1 Вариант . ВПР возвращает НД, если записи не найдено в Лист2. Таким образом, все что НД - это Вам нужно оставить. Фильтруете по условию "не равно НД". Т.е. снимаете галочку с НД, все остальное удаляете.

2 Вариант
Как удалить строки по условию Копируете код. Если Лист2 с товарами к удалению так и называется - то даже менять ничего не надо. Если лист называется иначе, то меняете в строке:
Код: vbnet
1.
With Sheets("Лист2")


Лист2 на имя своего листа. Главное, чтобы товары с первой строки начинались.
А далее переходите на лист1(из которого надо удалить строки) и запускаете код. Он удалит строки, в первом столбце которых есть значение из списка товаров на Лист2.
...
Рейтинг: 0 / 0
14.10.2015, 12:40
    #39076459
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
А там, где НЕсовпадения - там что? Если всё сделано правильно, должно быть #Н/Д. Вполне себе пригодное для фильтра значение.
...
Рейтинг: 0 / 0
14.10.2015, 13:04
    #39076485
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
Скопировала макрос без изменений, и вместо того чтобы удалить данные которых нет на 1 листе, удалились все записи на листе 1.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub Del_Array_SubStr()
    Dim sSubStr As String    'искомое слово или фраза
    Dim lCol As Long    'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim avArr, lr As Long
 
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))
    If lCol = 0 Then Exit Sub
    Application.ScreenUpdating = 0
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    'Получаем с Лист2 значения, которые надо удалить в активном листе
    With Sheets("Лист2") 'Имя листа с диапазоном значений на удаление
        avArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
    End With
    'удаляем
    For lr = 1 To UBound(avArr, 1)
        sSubStr = avArr(lr, 1)
        For li = lLastRow To 1 Step -1
            If CStr(Cells(li, lCol)) = sSubStr Then Rows(li).Delete
        Next li
    Next lr
    Application.ScreenUpdating = 1
End Sub
...
Рейтинг: 0 / 0
14.10.2015, 13:07
    #39076490
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
Нашла еще вот такой макрос, но мне не понятно что в нем поменять для своей задачи
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub t()
    Set Sh1 = Sheets(1)
    Set sh2 = Sheets(2)
    lrow1 = Sh1.Cells(Sh1.Rows.Count, "A").End(xlUp).Row
    lrow2 = sh2.Cells(sh2.Rows.Count, "A").End(xlUp).Row
    j = 1
        Do While j <= lrow2
            sh2.Cells(j, 2).FormulaR1C1 = "=COUNTIF(Лист1!C1,Лист2!RC[-1])"
            If sh2.Cells(j, 2) = 0 Then
                sh2.Rows(j).Delete
                row2 = sh2.Cells(sh2.Rows.Count, "A").End(xlUp).Row
            Else:
                sh2.Cells(j, 2).Clear
                j = j + 1
            End If
        Loop
End Sub
...
Рейтинг: 0 / 0
14.10.2015, 13:29
    #39076526
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
vasilinaи вместо того чтобы удалить данныеСкопировать мало. Надо правильно применить.
Лист2 должен в первом столбце содержать значения для удаления. На первом листе значения к сравнению так же должны быть на первом листе.
...
Рейтинг: 0 / 0
14.10.2015, 13:34
    #39076537
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
они итак в первых столбцах, в прикрепленном файле на листе 1 в столбце 1 данные для сравнения, лист 2 столбец 1 данные для удаления
...
Рейтинг: 0 / 0
14.10.2015, 13:35
    #39076538
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
vasilinaи вместо того чтобы удалить данные которых нет на 1 листе, удалились все записи на листе 1Все, понял. Да, код делает ровно противоположное.
В Вашем случае ВПР, записанная на втором листе вполне поможет. Прописываете ВПР:
Код: vbnet
1.
=ВПР(A1;Лист1!A:A;1;0)


все, что #Н/Д - удаляете через обычный фильтр.
Для удаления же кодом надо код переписывать и искать вхождение.
...
Рейтинг: 0 / 0
14.10.2015, 13:40
    #39076544
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
Вот код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Sub DelIfNotExist()
    Dim arr, dic As Object, rr As Range, lr As Long, s As String, lLastR As Long
    Application.ScreenUpdating = 0
    
    Set dic = CreateObject("scripting.dictionary")
    dic.comparemode = 1
    With Sheets("Лист1") 'Имя листа с диапазоном значений на удаление
        arr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
    End With
    For lr = 1 To UBound(arr, 1)
        s = arr(lr, 1)
        s = Trim(s)
        If Len(s) Then
            If dic.exists(s) = False Then
                dic.Add s, 0&
            End If
        End If
    Next
    'удаляем с листа2
    With Sheets("Лист2")
        arr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
        For lr = 1 To UBound(arr, 1)
            s = arr(lr, 1)
            s = Trim(s)
            If Len(s) Then
                If dic.exists(s) = False Then
                    If rr Is Nothing Then
                        Set rr = .Cells(lr, 1)
                    Else
                        Set rr = Union(rr, .Cells(lr, 1))
                    End If
                End If
            End If
        Next
    End With
    If Not rr Is Nothing Then
        rr.EntireRow.Delete
    End If
    Application.ScreenUpdating = 1
End Sub
...
Рейтинг: 0 / 0
14.10.2015, 13:47
    #39076550
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
А если данные находятся не в первых столбцах то поменять для первого листа
arr = .Range(.Cells(1, "номер нужного столбца"), .Cells(.Rows.Count, 1).End(xlUp)) и там же для второго, так?
...
Рейтинг: 0 / 0
14.10.2015, 13:52
    #39076554
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
vasilina,

почти:
.Range(.Cells(1, "номер нужного столбца" ), .Cells(.Rows.Count, "номер нужного столбца" ).End(xlUp))
...
Рейтинг: 0 / 0
14.10.2015, 14:12
    #39076571
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
Сделала вот так, но удаляет не все, на листе1 83 записи, а на листе6 после запуска макроса осталось 257 записей, где не так поменяла? И еще как сделать чтобы не 1 строки начал проверку а с 11?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Sub DelIfNotExist()
    Dim arr, dic As Object, rr As Range, lr As Long, s As String, lLastR As Long
    Application.ScreenUpdating = 0
    
    Set dic = CreateObject("scripting.dictionary")
    dic.comparemode = 1
    With Sheets("Лист4") 'Имя листа с диапазоном значений на удаление
        arr = .Range(.Cells(5, 8), .Cells(.Rows.Count, 8).End(xlUp))
    End With
    For lr = 1 To UBound(arr, 1)
        s = arr(lr, 1)
        s = Trim(s)
        If Len(s) Then
            If dic.exists(s) = False Then
                dic.Add s, 0&
            End If
        End If
    Next
    'удаляем с листа2
    With Sheets("Лист6")
        arr = .Range(.Cells(11, 8), .Cells(.Rows.Count, 8).End(xlUp))
        For lr = 1 To UBound(arr, 1)
            s = arr(lr, 1)
            s = Trim(s)
            If Len(s) Then
                If dic.exists(s) = False Then
                    If rr Is Nothing Then
                        Set rr = .Cells(lr, 1)
                    Else
                        Set rr = Union(rr, .Cells(lr, 1))
                    End If
                End If
            End If
        Next
    End With
    If Not rr Is Nothing Then
        rr.EntireRow.Delete
    End If
    Application.ScreenUpdating = 1
End Sub
...
Рейтинг: 0 / 0
14.10.2015, 14:21
    #39076580
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
vasilina,

вообще-то, код надо тогда менять. Вы приложили пример данных - я под него код написал. Если не в состоянии поменять или сделать самостоятельно, то лучше и выкладывать файлы с реальной структурой данных.

Вторая часть кода сейчас удаляет совсем не то, что ожидаете.
Правильно вместо этого блока:
Код: vbnet
1.
2.
3.
With Sheets("Лист6")
        arr = .Range(.Cells(11, 8), .Cells(.Rows.Count, 8).End(xlUp))
        For lr = 1 To UBound(arr, 1)


написать так:
Код: vbnet
1.
2.
3.
With Sheets("Лист6")
        arr = .Range(.Cells(1, 8), .Cells(.Rows.Count, 8).End(xlUp))
        For lr = 11 To UBound(arr, 1)


А насчет записей больше, чем ожидалось - откуда мне знать? Может у Вас там записи повторяются. На выложенном Вами в теме файле первоначальный код правильно работает и удаляет все, что надо.
...
Рейтинг: 0 / 0
14.10.2015, 14:38
    #39076606
vasilina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макрос удаления строк
Спасибо за помощь, буду дальше разбираться сама
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Макрос удаления строк / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]