Страницы: 1 2 След.
RSS
Макрос удаления похожих строк, удаление строк с одинаковым значением поля.
 
Доброго времени суток. Прошу прощения за нубство в VBA. Есть книга с переменным количеством строк. Здесь учет входа и выхода сотрудников из помещения. Нужно удалить все строки (сотрудников) которые вошли и вышли и оставить только тех кто вошел и не вышел. Предполагаю что можно ключевым сделать поле *Номер* т.к. он уникален и столбец *Событие* содержит информацию *Выход по идентификатору* или же *Вход по идентификатору*. Логически можно брать строку по порядку с *Номер* и если в *Событие* *выход* то её удаляем сразу, если *вход*, то ищем строку с таким же *Номер* и значением *выход*, при нахождении удаляем обе строки (со *вход* и *выход*) и так до конца таблицы иначе если есть строка с *Номер* с*вход* и нет *выход* то её оставляем. В итоге должны остаться записи которые имеют только *вход*. Кратко опишу ситуацию. В любой момент времени формируется отчет в Exel за произвольный период, в этом отчете нужно оставить только те записи которые вошли в помещение за этот период но еще не вышли. Еще раз прошу простить, но VBA для меня пока загадка.
 
Можно вот такой формулой в доп.столбце выделить тех, кто вошел, но не вышел.
Код
=--(СУММПРОИЗВ(($E$4:$E$512="Вход по идентификатору")*($G$4:$G$512=G4))-СУММПРОИЗВ(($E$4:$E$512="Выход по идентификатору")*($G$4:$G$512=G4))>0)

После чего отсортировать и удалить.

ЗЫ: Все, у кого есть 1 в доп. столбце - не вышли еще.
Изменено: SkyPro - 24.10.2013 11:54:12
 
Благодарю, но есть нюанс, те строки, в которых начинается просмотр с полем *Выход* получается что не вышли. Например / 23647 /Лесин Игорь Генадьевич №6/ у него значение 1, хотя в ручную проверил, он вышел)) но первое вхождение  началось с подсчета строки с Событием *Вышел*. Но всеравно спасиб за ответ, хотя задача так и не решена, записей в таблице может быть более 1000 строк и в ручную всеравно не перелопатишь, да же с помощью стандартных функций excel. Выручил бы макрос, который удалял бы строки с значением столбца *Событие* = *Выход* если это первое попадание и последующее удаление пары строк если был *Вход* затем *Выход*..,
 
Формула считает "кол-во входов" минус "кол-во выходов". Если вх>вых, то ставит 1.
Код
=--(СУММПРОИЗВ(($E$4:$E$512="Вход по идентификатору")*($G$4:$G$512=G4))>СУММПРОИЗВ(($E$4:$E$512="Выход по идентификатору")*($G$4:$G$512=G4)))

Или там есть "свои нюансы"?

ЗЫ:
Понял, в чем проблема. Но нужно подумать над алгоритмом, а времени нет. Подумаю, если появится возможность и вам еще не дадут ответа.
Изменено: SkyPro - 24.10.2013 13:02:55
 
Скажите, как мог Лесин Игорь Генадьевич №6 войти  в 10:48:51,
не выходя, зайти в 16:41:21 и выйти в 17:00:53   23.10.2013
 
Исходил из того, что число записей по каждому человеку не может быть кратно "2" если человек в "зоне"

осталось добавить обработку последнего времени входа человека ):
Изменено: Ёк-Мок - 24.10.2013 14:20:42
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Благодарю за отклики!
to Kuzmich Скажите, как мог Лесин Игорь Генадьевич №6 войти в 10:48:51,
не выходя, зайти в 16:41:21 и выйти в 17:00:53 23.10.2013
очень просто, список может формироваться в произвольное время, поэтому человек может находится уже в помещении на момент его формирования)))
Отсюда и следует наверное первая необходимость, что до начала процедуры поиска похожей строки (по *Номер*) проверять на статус *Выход...* ячейку *Событие*, если совпадает, то сразу же удалять, если нет, то начать поиск  строки с *Номер* если есть, то удалять обе, если нет, то переходим к следующей строке, что бы взять значение *Номер* и т.д.
to Ёк-Мок Очень интересно, да же синтаксис немного понял, но  наверное именно такой проверки на *Выход* перед началом поиска похожей строки с *Номер* не хватает, что бы пресловутый Лесин Игорь Генадьевич не ставился как присутствующей в помещении, и тогда первая проверка сразу отметет такой косяк, а дальше поиск такого же *Номер* и в положительном случае удаляет текущую строку со строкой в которой найден *Номер*. Тем самым по логике первая запись с *Выход..* удаляется сразу, до поиска/сравнения, последующая будет наверняка (если она есть вообще с такой ячейкой *Номер*) с значением *Вход..*. Жаль, что растерял навык кодирования, логику с переменными могу навоять (блок-схему) а вот в коде выразить не могу, за отсутствием навыка VBA.
Буду признателен за понимание и содействие!
 
С мембером Анашкин Александр Сергеевич №76 трабл - или через забор ходит, или дубль есть (:
Вошёл 4 раза, вышел только 2 раза
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Не-е-е, с такими исходными данными ничего путного не будет:
Батюкова Оксана Владимировна №70 два раза подряд вышла )8
Сначала нужно на баги исходные данные проверять, а уж потом обрабатывать
Попробую, если никто не опередит (8
Изменено: Ёк-Мок - 24.10.2013 16:02:04
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
а если проще сделать. отсортировать по времени и проверять только последнюю запись.. например так:
Код
Public Sub Del()

    Dim ycount As Long
    With ActiveSheet
        .Sort.SortFields.Clear
        .Sort.SetRange .Cells(3, 1).CurrentRegion
        .Sort.SortFields.Add Key:=.Cells(3, 7), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=.Cells(3, 3), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=.Cells(3, 2), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.Header = xlYes
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.SortMethod = xlPinYin
        .Sort.Apply
        ycount = 4
        Do Until .Cells(ycount, 7) = ""
            If .Cells(ycount, 7) = .Cells(ycount + 1, 7) Then
                .Rows(ycount).Delete
            Else
                If .Cells(ycount, 4) = "ВЫХОД ИЗ ЗОНЫ" Then
                    .Rows(ycount).Delete
                Else
                    ycount = ycount + 1
                End If
            End If
        Loop
    End With
End Sub
 
Согласен, косяк в данных....но их не исключить, потому как прога учета не отсеивает повторное прикладывания RF-карты, а женщины - такие женщины)) тогда алгоритм вижу такой. Если текущая строка имеет *Выход...*, тогда её удалить и перейти к следующей, иначе найти следующую строку с таким *Номер* и если она *Вход...*, тогда удалить текущую строку (потому что она не *Выход...* а значит *Вход...*) и искать следующую с *Номер* иначе удалить текущую и найденную. Начать заново.. если не понятно то могу по другому как нить описать идею))
Изменено: iawi - 24.10.2013 16:35:36
 
А на ночь человек может остаться в зоне?
Или вход и выход в течении одного дня?
 
Цитата
Согласен, косяк в данных....но их не исключить
И вы даже не пытаетесь, но готовы, по вашим же словам, "по другому как нить описать идею))"... То есть пусть кто-то за вас ломает голову с ВэХэОДэ, дневными и ночными сменами, и пр.и пр...
ps Еще бы сводными попытать счастие - мин и макс по дням.
pps  Хотя - есть встечная идея, точнее - предложение: объявите конкурс в соответствующем разделе - http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=list&FID=7 ...  ;)
Изменено: Z - 24.10.2013 16:44:02
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
to Z Наверное моя ошибка, что не довел всю суть)))) дело обстоит так, через КПП по РФ-картам проходит толпа народа, днем больше, ночью меньше. Интересует моментальное нахождение в зоне кого либо прошедшего по РФ карте. Т.Е. в любой момент, когда появится необходимость формируется отчет, например за сутки, 12 часов или же несколько часов, не важно, отчет в Exel в представленном выше виде. Хотелось навоять макрос (кнопочку *Личная книга макросов* ) по нажатию на которую на КПП могли видеть фамилии не вышедших сотрудников.  Жаль, что вы считаете что я не пытаюсь научить сотрудников 1 раз прикладывать на входе и 1 раз при выходе РФ карту, это не мои головные боли))) Проблема моя, что я не знаю VBA.
И главное, я прошу помощи, а не оценку моих действий!
 
А нельзя эту хрень извините научить чтоб срабатывала в течении например минуты только один раз? Как у нас билеты в транспорте...
Тогда и друга по своему пропуску будет лень проводить :)
Ну или при анализе все близкие по времени входы объединять/выкидывать, особенно если между ними не было выхода.
 
Так?
 
to Hugo)) не все так просто))) во первых это режимная территория. Во вторых  могут проходить по 3 человека, поэтому интервал не назначить. И время не важно, главное оставить записи которые вошли и не вышли!!!
 
Файл не смотрел - некогда вникать.
Но по логике применим словарь - если вход, то добавляем в словарь, если выход - удаляем. В итоге выводим содержимое словаря.
При таком подходе повторы роли не играеют.
 
Глянул. Но не проверял :)
Код
Option Explicit

Sub tt()
    Dim a(), i&

    a = [a3].CurrentRegion.Value

    With CreateObject("Scripting.Dictionary"): .comparemode = 1
        For i = 2 To UBound(a)
            Select Case Left(a(i, 5), 2)
            Case "Вх"
                .Item(a(i, 8)) = 0&
            Case "Вы"
                If .exists(a(i, 8)) Then .Remove (a(i, 8))
            End Select
        Next

        [m1].Resize(.Count, 1) = Application.Transpose(.keys)
    End With

End Sub
 
Исходил из условия, что последняя дата и время по каждому человеку и определяют его присутствие/отсутствие в зоне. На ошибки в исходных данных в таком случае чихать (8
Изменено: Ёк-Мок - 24.10.2013 17:54:42
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
А например Малиновская Екатерина Арвовна №64?

Согласитесь, на словаре всё как-то проще выглядит :)
Ну и скорость работы на другом уровне.
Изменено: Hugo - 24.10.2013 18:07:38
 
Ребята, добрый день! Ещё раз благодарю вас за содействие!
to Ёк-Мок Есть все равно недочеты после обработки, например *Артемьев Денис Владимирович №25* (0:41:03 и последняя запись 0:32:08). Возможно потому что список заполняется (отсортирован) с нынешней даты по убыванию.
to Hugo Чувак, пока в ручную просматриваю результат работы этого макроса, и нет нареканий))))
 
офф
Цитата
to Hugo Чувак
высшая степень уважения? :О
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ну так там нечему ломаться и негде ошибиться, он прост как сатиновые трусы - если вход, то человек внутри (кладём в словарь). Если выход - значит снаружи (выкидываем из словаря).
Соответственно множественные входы-выходы на алгоритм не влияют.
Как вариант - если внутри, то в item словаря пишем строку таблицы, если вышел - её стираем (в item).
Затем в конце пробегаем по словарю и всем у кого есть номер строки по этому номеру пишем метку что он внутри.
Или в item можно писать/стирать время входа - тогда в конце можно сразу получить список фамилий и время входа.
 
iawi, действительно,- у Вас более подходящего слова не нашлось?
 
to ikki
to Юрий М ))) смотрю тут любят по обсуждать написанные слова, хотя по теме не слова((( )))
to Hugo Огромная благодарность, действительно логика со словарем гораздо быстрее и точнее работает., еще раз спасибо, ЧУВАК (надеюсь это слово тебя не смущает)) )!!!
Всех благодарю!!! Тему можно закрыть!
 
Взял да руками посчитал. И вот: сейчас в зоне 42 человека. Мой список только 17 человек, у Hugo 70 человек. Макрос от Jom не смог запустить... Приз взял sva! Вир гратулирен дих!
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Ну не знаю - вторая же "Алупова Галина Васильевна №79" почему не зафиксирована у sva?
 
До человека не доходит. Но это и естественно...
iawi загляните сюда, прям Ваш портрет:
http://www.excelworld.ru/forum/5-1079-1
Я сам - дурнее всякого примера! ...
 
Цитата
to Юрий М ))) смотрю тут любят по обсуждать написанные слова, хотя по теме не слова
Просто подбирайте слова - повежливее нужно быть. А по теме - не могу же я во ВСЕХ темах принимать участие в обсуждении - в других ответил, тем более, что тут есть помощники.
Если будете продолжать в том же духе - получите бан.
Страницы: 1 2 След.
Наверх