Страницы: 1 2 3 След.
RSS
Скрыть строку при равенстве значений в двух столбцах
 
Есть задача: нужно сравнить две колонки в экселе и что важное, нужно
организовать так, чтобы значения колонки А(Лист1) сравнивались со значениями в
колонке А(Лист2), если значения равны, то скрить строку листа1
(нужен макрос)
 
Код
Sub h()
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Not Worksheets("Sheet2").Columns(1).Find(What:=Cells(i, 1).Value, LookAt:=xlWhole, MatchCase:=True) Is Nothing Then Rows(i).EntireRow.Hidden = True
Next
End Sub
Изменено: yoozhik - 07.09.2015 12:04:44
 
Альтернатива
Код
Sub HiddenRow()
Dim oSht1 As Worksheet, oSht2 As Worksheet
Dim oRng As Range, vl
  With ThisWorkbook
    Set oSht1 = .Sheets("Лист1"): Set oSht2 = .Sheets("Лист2")
    Set oRng = oSht1.Range(oSht1.Cells(1, 1), oSht1.Cells(Rows.Count, 1).End(xlUp))
    For Each vl In oRng
      If Not IsEmpty(vl.Value) Then
        If vl.Value = oSht2.Cells(vl.Row, 1).Value Then vl.EntireRow.Hidden = True
      End If
    Next
  End With
End Sub

Sub AllRowVisible()
  ThisWorkbook.Sheets("Лист1").Range(Cells(1, 1), Cells(Rows.Count, 1)).EntireRow.Hidden = False
End Sub
 
Сколько всего строк? Это важно - если строк сотни тысяч, то нужен другой код.
 
На моем стареньком рабочем компе Sub HiddenRow выполнялась 45,64 секунды на 10000 строк при несовпадающих 2 записях,
процедура Sub h() выполнялась 53,125 секунд  на 10000 строк при несовпадающих 2 записях.
Если добавить конструкцию
Код
Application.ScreenUpdating = False
........
Application.ScreenUpdating = True
Sub HiddenRow выполнилась за 4,86 секунды
Sub h() выполнялась за 44 секунды
Вывод стандартный поиск (.Find) использовать для таких целей неприемлемо  
Изменено: TSN - 07.09.2015 14:23:15
 
Радикально увеличить скорость работы макроса можно, работая не с ячейками листа (строками) поочерёдно, а собрав в массив (диапазон) номера нужных строк, и затем скрыв их одним махом.
 
TSN, может тут причина не в Find, а в обработке массива в Вашем примере, а в моем построчно ячеек? Не берусь утверждать)
Find использовал для проверки всего столбца на другом листе, подразумевая, что совпадения могут быть в разных строках. У Вас, насколько понимаю, а может и не понимаю (редко пишу что-то под свои потребности, используя ограниченный набор известных мне способов), чтобы проверить совпадения не только по одинаково пронумерованным строкам, а и по всему списку - надо делать цикл в цикле. Это все равно будет быстрее Find? Мне для развития) казалось, что find должен быстрее быть, чем вложенный цикл
 
TSN
как будет макрос, если на листе1, нужно брать для сравнения колонку F, а на листе2 колонку А
 
Цитата
Юрий М написал:
Радикально увеличить скорость работы макроса можно, работая не с ячейками листа (строками) поочерёдно, а собрав в массив (диапазон) номера нужных строк, и затем скрыв их одним махом.
Согласен так будет еще быстрей, но не имея файла примера и полноценного описания желания в ТЗ, я предложил вариант первый пришедший мне в голову, и не претендую на лучший алгоритм.

Цитата
yoozhik написал: а в обработке массива в Вашем примере
Я в моем примере не обрабатывал данные массивом. Использовался диапазон (range) - цикл по ячейкам листа. Ваш вариант имеет право жить.

Цитата
sergey2303 написал: как будет макрос, если на листе1, нужно брать для сравнения колонку F, а на листе2 колонку А
.Cells(1, 1) - обращение к ячейке "A1", где (1, ) - строка, ( ,1) - поле (столбец)
Заменить для сравнения по колонке F
Set oRng = oSht1.Range(oSht1.Cells(1, 6), oSht1.Cells(Rows.Count, 6).End(xlUp))

Для более точного и правильного ответа Приложите файл пример согласно правил форума, с частичными данными которые нужно обработать описанием желаемого результат.
Изменено: TSN - 07.09.2015 15:21:27
 
добавил файл
 
Цитата
sergey2303 написал: добавил файл
С этого НАЧИНАТЬ нужно было )
 
Цитата
Юрий М написал: С этого НАЧИНАТЬ нужно было )
Поддержу.
Отредактированый код в файле
Изменено: TSN - 07.09.2015 15:34:57
 
Если сравнивать нужно десяток строк - то подход совершенно не важен :)
 
TSN
отрабативает сравнение для первой строки
 
Юрий М, а как скрыть одним махом номера строк? как массив сформировать понятно, а как потом прописать, чтоб сразу все скрыть? Чего то в голову приходит только цикл с выделением всех указанных номеров строк.. Без цикла выделить можно?
Изменено: yoozhik - 07.09.2015 16:00:08
 
Цитата
sergey2303 написал: отрабативает сравнение для первой строки
Я изначально не понял полноценно задачу. Моя процедура сравнивает построчно данные с двух листов и скрывает строку если данные в строках равны.
Вам необходимо скрыть все строки на Листе1 если в строке есть совпадение с данными Листа2.
Освобожусь от текущей работы перепишу процедуру.
 
TSN
да, необходимо скрыть все строки на Листе1 если в строке есть совпадение с данными Листа2
 
yoozhik
Код
Dim num$
num = "4:4,6:6,10:10"
    Range(num).EntireRow.Hidden = True
 
Цитата
sergey2303 написал:
да, необходимо скрыть все строки на Листе1 если в строке есть совпадение с данными Листа2
Измененная процедура.
Замените процедуру Sub HiddenRow на эту и тестируйте
Код
Sub HiddenRow1()
Dim oSD As Object, arr(), x As Long
Dim oSht1 As Worksheet, oSht2 As Worksheet, oRng As Range, vl

Set oSD = CreateObject("Scripting.Dictionary")
    oSD.comparemode = 1
Application.ScreenUpdating = False
  With ThisWorkbook
    Set oSht1 = .Sheets("Лист1"): Set oSht2 = .Sheets("Лист2")
    arr = oSht2.Range(oSht2.Cells(1, 1), oSht2.Cells(Rows.Count, 1).End(xlUp)).Value ' данные листа2
    For x = LBound(arr) To UBound(arr):  If Not oSD.exists(arr(x, 1)) Then oSD.Add arr(x, 1), 0
    Next x
    Erase arr
    Set oRng = oSht1.Range(oSht1.Cells(1, 6), oSht1.Cells(Rows.Count, 6).End(xlUp)) ' цикл по колонке F листа1
    For Each vl In oRng
      If Not IsEmpty(vl.Value) Then: If oSD.exists(vl.Value) Then vl.EntireRow.Hidden = True
    Next
  End With
Application.ScreenUpdating = True
Set oRng = Nothing: Set oSht1 = Nothing: Set oSht2 = Nothing
Set oSD = Nothing
End Sub
Теперь у Вас есть два разных решения  :)
Изменено: TSN - 07.09.2015 16:38:01
 
V, спасибо) вышло вот так:
Код
Sub h()
For i = 1 To Cells(Rows.Count, 6).End(xlUp).Row
If Not Worksheets("Лист2").Columns(1).Find(What:=Cells(i, 6).Value, LookAt:=xlWhole, MatchCase:=True) Is Nothing Then
num = num & i & ":" & i & ","
End If
Next
num = Left(num, Len(num) - 1)
Range(num).EntireRow.Hidden = True
End Sub
 
V, адресами являются строки, так что можно EntireRow заменить на Rows. (покороче будет)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
TSN
ошибка "Subscript out of range (Error 9)"
: Set oSht2 = .Sheets("Лист2")
 
sergey2303, значит у Вас нет листа с названием "Лист2"
 
yoozhik,длина строки num имеет значение. А если код работает на рабочем файле - значит строк скрывать нужно немного, тогда любой код подойдёт.
 
yoozhik
Лист2 есть,
даже если в макросе прописать
Код
Set oSht1 = .Sheets(1): Set oSht2 = .Sheets(2)
таже самая ошибка
 
Hugo, подойдет любой, да, я ж не спорю)
мне интересно просто, если сформировать массив с номерами строк num(), то как потом разом скрыть все? если через строковую переменную, то получилось, а если номера строк будут в массиве?
 
sergey2303, я стащил код от TSN, потестил на Вашем примере, все работает. ошибка "Subscript out of range (Error 9)"  показывает, что Вы пытаетесь сослаться на что-то несуществующее
Set oSht2 = .Sheets("Лист2") - видимо, на "Лист2"
 
yoozhik
на примере работает.
а на рабочем файле ошибка
 
Цитата
sergey2303 написал: а на рабочем файле ошибка
Как называются листы на рабочем файле ?
Subscript out of range (Error 9) - Ошибка возникает при ссылке на несуществующий элемент коллекции, массива. В данном случае на несуществующий лист
Изменено: TSN - 08.09.2015 01:50:18
 
TSN
мой рабочий файл изначально комне попадает(каждий день) с листом, имя 380*, я макросом добавляю два листа - Лист1 и Лист2, в итоге получается  так 380*, Лист1, Лист2.(имя листа 380* каждий день меняется, и дет привязка к дате, т.е 380ddmmyyyy? например, 38008092015)
затем нужно сравнивать и скривать. А если сравнить и закрасить по времени будет одинаково по сравнении с сравнить и скрить?
Код
Set oSht1 = .Sheets(1): Set oSht2 = .Sheets(2)
Изменено: sergey2303 - 08.09.2015 09:13:49
Страницы: 1 2 3 След.
Наверх