Страницы: 1
RSS
Перестал работать макрос. Как понять в чем проблема?
 
Код
Sub Óäàëåíèå_ïîâòîðîâ()
Dim iz As Worksheet
Set iz = ThisWorkbook.Worksheets(1)
vsego = iz.Cells(1, 1).CurrentRegion.Rows.count
For r = vsego To 2 Step -1
If WorksheetFunction.CountIf(Range(iz.Cells(2, 1), iz.Cells(vsego, 1)), iz.Cells(r, 1)) > 1 Then
iz.Activate
iz.Rows(r).Delete Shift:=xlUp
r = r + 1
vsego = vsego - 1
End If
Next r
End Sub

Данный код работал больше двух лет. После НГ сев за работу обнаружил, что повторы не удаляются. В чем проблема понять не могу. Пробовал взять файл в бекапа, на нем так же не работает ничего. Пробовал поставить на виртуалке новый эксель - так же не работает. Загадка. Сейчас в базе 7к строк. Думал, может ограничение на количество строк. Удалил все до 2к (не строки удалял, а очистил содержимое), вроде как стал работать скрипт. Но как-то криво.
Есть ли какая-то консоль, где я могу просмотреть лог работы скрипта, чтобы выложить сюда, может подскажите, что не так и почему не работает.
При запуске скрипта курсор переключается в режим "ожидания", т.е. скрипт работает. Но ничего не удаляет. Файл скинуть не могу из-за конфиденциальности данных. Надеюсь можно как-то через логи понять, что не так.
 
мде... а заменить данные на "неконфиденциальные" нельзя?
Цитата
Tema Zosin пишет: Надеюсь можно как-то через логи понять, что не так.
и где ваши логи?  :D

макрос работает с данными на первом листе той книги, в которой он находится.
не ждёте ли вы результатов его работы в другой книге или не стал ли лист с данными не первым?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Что по мне, так слишком много лишнего. Цикл построен уже правильно - зачем менять значение переменной r?
А vsego я бы определял несколько иначе. В общем, мой вариант:
Код
Sub Del_Doubles()
    Dim iz As Worksheet, vsego As Long, r As Long
    Set iz = ThisWorkbook.Worksheets(1)
    vsego = iz.Cells(iz.Rows.Count, 1).End(xlUp).Row
    For r = vsego To 2 Step -1
        If WorksheetFunction.CountIf(Range(iz.Cells(2, 1), iz.Cells(vsego, 1)), iz.Cells(r, 1)) > 1 Then
            iz.Rows(r).Delete Shift:=xlUp
        End If
    Next r
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Чтобы лишнего не считать
Код
If WorksheetFunction.CountIf(Range(iz.Cells(2, 1), iz.Cells(r-1, 1)), iz.Cells(r, 1)) > 0 Then
 
Цитата

и где ваши логи?  :D
Я же спросил где их взять, чтобы выложить.
Цитата

не ждёте ли вы результатов его работы в другой книге или не стал ли лист с данными не первым?
Нет. Мне казалось, я написал, что два года работал и все было ок. Головой не ударялся.
Цитата
мде... а заменить данные на "неконфиденциальные" нельзя?
Я выложил скрипт, вы можете подставить свои данные. Только в чем смысл? Если все работало, и перестало. Может что-то сбилось.

Цитата
Что по мне, так слишком много лишнего. Цикл построен уже правильно - зачем менять значение переменной r?
А vsego я бы определял несколько иначе. В общем, мой вариант:
А в вашем варианте удаление будет считать, что верхние данные в приоритете от нижних? Мне нужно не простое удаление случайных повторов, а именно впервую очередь снизу, т.к. сверху уже могут быть заполненные ячейки, и когда я снизу добавляю новые данные, они иногда повторяются и скрипт тер повторы.
 
Цитата
Tema Zosin пишет:
А в вашем варианте удаление будет считать, что верхние данные в приоритете от нижних? Мне нужно не простое удаление случайных повторов, а именно впервую очередь снизу, т.к. сверху уже могут быть заполненные ячейки, и когда я снизу добавляю новые данные, они иногда повторяются и скрипт тер повторы.
А Вы возьмите лист, нарисуйте свои данные, внесите все, что надо и запустите скрипт. И увидите. Вы ведь не посчитали нужным объяснить нам что именно Вы ждете от скрипта? И данные для этого нарисовать и выложить тоже не посчитали нужным. Отвечу Вашими словами:
Цитата
Я выложил скрипт, вы можете подставить свои данные.

Я вот знаю принципы работы циклов и знаю как понять снизу он идет или сверху и что при этом удаляет. Вы видимо нет. Я просто взял Ваш код и поправил его таким образом, чтобы он РАБОТАЛ так, как было видно из написания первоначальной процедуры. А как он должен был работать по Вашему хотению - ничего написано не было. Поэтому даже не буду отвечать на этот вопрос - Вы на все остальные вопросы участников форума ответили так, будто Вас тут оскорбили смертно. А вопросы между тем были очень правильными - никто здесь не знает Вашего уровня VBA и поверьте, заданные вопросы не раз являлись ответом на проблемы начинающих программистов в VBA.
Цитата
Tema Zosin пишет:
Цитата

и где ваши логи?  :D
Я же спросил где их взять, чтобы выложить.
Ничего Вы не спрашивали - Вы написали:
Цитата
Надеюсь можно как-то через логи понять, что не так.
или это такая новая форма вопроса?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, см. ЛС.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, спасибо. Действительно Tema Zosin спросил про консоль логов. Поэтому приношу извинения за последний абзац своего последнего сообщения. Все что до него - не отменяется. Хотя про консоль написано все равно без знака вопроса - поэтому и воспринимается иначе. Велик и могуч!

Собственно ответ: лог не ведется, потому что даже не предусмотрен. Если возникает ошибка - она выводится в виде оконного сообщения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Цитата
Ничего Вы не спрашивали - Вы написали:
или это такая новая форма вопроса?
Не нужно выдирать из контекста и защищать людей, которые не удосужились прочитать мой пост.
Цитата
Есть ли какая-то консоль, где я могу просмотреть лог работы скрипта, чтобы выложить сюда, может подскажите
Цитата
Надеюсь можно как-то через логи понять, что не так.


Цитата
Я просто взял Ваш код и поправил его таким образом, чтобы он РАБОТАЛ
Значит в нем все же ошибку нашли?

Очень странно, т.к. до НГ у меня работало все при этом же количестве строк. После НГ - перестало.

Цитата
Вы на все остальные вопросы участников форума ответили так, будто Вас тут оскорбили смертно.
Не нужно впадать в крайность. Я в отличии от большинства людей, что пишут в панике, постарался выдать всю информацию, которая в моей компетенции в первом посте. Если у вас люди сразу не читая задают стандартные вопросы (на автомате, т.к. для большинства это актуально), то не нужно обижаться, что я подчеркнул, что ответ есть в первом посте.

Цитата
все равно без знака вопроса
Там хитрое построение предложения, состояющее из вопросительного и утвердительного. Не уверен, что многие тут сидящие так хорошо знают русские сложные правила, чтобы их соблюдать. Мне после английского еще сложнее обратно адаптироваться под структуру предложений. Стараюсь писать как можно правильнее. Сильне не судите.

The_Prist, огромное спасибо за скрипт. Данный скрипт у меня работает. Не могу сказать корректно ли для моих конкретных требований, но по крайней мере удаляет, в отличии от моего. Мне самому сложно сразу ответить, все ли верно. И сложно разом объяснить все нюансы, т.к. разные ситуации бывают.
Хотя, если поняли в чем проблема была, был бы рад услышать, т.к. не хотелось бы повторения ситуации. Но как понял, проблема в скрипте.

VBA никогда не изучал, только баловался в школе. Больше С++. Сейчас другим занимаюсь. Познания нулевые (хотя, в отличии от большинства, понять могу, особенно, если командам незнакомым описание найду), поэтому ответ вполне устроит простыми словами.
 
Скрытый текст



По поводу кода: я в своем первом сообщении написал Вам некий намек на ту часть, которая вызывала зависание: зачем менять значение переменной r?. Вы же, судя по этому, тоже не очень внимательно мой ответ прочитали, не так ли? И не задали вопрос - "Почему же не надо, ведь раньше с ним все работало?"

Посмотрите логику кода: цикл построен так, что просматривает строки от самой нижней до второй. Пусть будет от 10 до 2. Если строка 10 содержит значение, которое уже есть во 2-ой - она удаляется. Счетчик цикла® уменьшается на 1(next r). А Вы его принудительно зачем-то увеличиваете на 1(r = r + 1). Что получаем? Правильно, топчемся на месте. Топчемся до тех пор пока условие не станет ложным и кодом не пропустится Ваше никому не нужное увеличение счетчика цикла.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Вы же, судя по этому, тоже не очень внимательно мой ответ прочитали, не так ли? И не задали вопрос - "Почему же не надо, ведь раньше с ним все работало?"
Все верно. Если все работало, а я ничего не менял, то на скрипт последнее подозрение. Было уже так, что в самой таблице включается фильтр экселевский и обработка идет не так (не конкретно этого скрипта). Простой пример: сделал на две строчки текущую дату, кликаю дважды и дата до последней строчки выставляется эта. Если включен фильтр, то вниз на двойной клик ничего не проставляется. А это я тоже не сразу понял. Внизу базы куча строчек без даты, вверху какое-то значение из первых скрыто из-за фильтра, что не меняет низ базы никак, а эксель не хочет проставлять на двойной клик. Задумка непонятна. Думал на подобный "баг", интересовался впервую очередь на такие возможности.
Цитата
Посмотрите логику кода: цикл построен так, что просматривает строки от самой нижней до второй. Пусть будет от 10 до 2. Если строка 10 содержит значение, которое уже есть во 2-ой - она удаляется. Счетчик цикла® уменьшается на 1(next r). А Вы его принудительно зачем-то увеличиваете на 1(r = r + 1). Что получаем? Правильно, топчемся на месте. Топчемся до тех пор пока условие не станет ложным и кодом не пропустится Ваше никому не нужное увеличение счетчика цикла.
В этом и загадка. Почему после 5-7к строчки он перестал работать, зашкаливать стал?
Цитата
А вот насчет вопроса ikki по поводу книги/листа - я с ним согласен, а с Вашим ответом "Мне казалось, я написал, что два года работал и все было ок. Головой не ударялся." очень даже нет,
Вы пришли в магазин сдать ломаный тостер в ремонт и рассказываете: готовил хлеб, он не выбросил, тот подгорел, тостер не работает теперь. Кроме как хлеб ничего не готовил, всегда стоял на кухне. Вы дали всю инфу. Но к вам продолжают приставать "может вы его в ванную уронили и его замкнуло? или может вы в него не хлеб пихнули, а носки сушили?". Я написал сразу, что ничего не менял, это и означает, что ничего не менял. Я понимаю, что множество людей кто пишет на форумах не дают инфы или пишут одно, а на деле другое. В моем случае я выдал сразу все, что мог. И фраза "может другого листа" (про другую книгу вообще не понял к чему, типа я запустил другую таблицу без макроса и он не работает? это совсем глупость было бы тут спрашивать совета) после моей "ничего не менял" как шаблонный вопрос после моего подробного рассказа. Если вы согласны про глупые вопросы от продавца в примере с тостером, то и тут поймете. Если нет, то - ок. Я работал и продавцом и инженером сервиса и клиентом/покупателем был и все это проходил. Для себя извлек уже давно, что лишняя ненужная информация только загружает мозг и тратит время. Те, кто это понимаю, замечают карьерный рост.
Мне никогда не быть службой поддержки, потому что я просто не буду выслушивать людей и их "не работает" без какой-либо попытки описать подробности.
Цитата
И так же не согласен, что мы для помощи Вам должны рисовать Ваши данные,
С чем не согласен? Включи же логику! Ну дал бы я табличку с макросом и строчками с цифрами, которые перед этим бы автопроставлением поставил бы, и зачем это? Я описал все, что делал в первом посте. Свой файл дать не могу. А давать новосозданный - смысл? Я же написал, что изначально грешил на фильтры, спросил про логи, выложил скрипт, чтобы проверили. Вы же нашли ошибку без моего файла? Уберите предрассудки и поймите, что я минимизировал свое время на эту задачу. А если бы вы не пытались спорить и доказать, что я не по шаблону все выполнил, а наоборот бы подхватили мою идею минимальных затрат, то у нас бы вышло быстрое решение! Все зависит от подхода! Я конечно понимаю, что когда вам за 30 и амбиций уже нет, все шаблонно привычно, то менять ничего не хочется. Те кто хочет - двигаются дальше, кто нет - остаются на месте. Это простая психология со второго курса. Просто вы не поняли, что я изначально пытался донести, т.к. большинство людей доносят только "не работает". Я вас прекрасно понимаю и не осуждаю. Но и меня попытайтесь понять. Это как если к вам придет президент, и вы будете ему "будь как дома, расслабься", а он будет официальными высокопочтенными "замашками" пользоваться, да создавать такую атмосферу. Я это к тому, что пришел "сэр" (интеллигент из великобритании) и говорит, что сломался компьютер, а вы - мистер - почините, пожалуйста. Вы ему: "Генри, релекс, все гуд, что не так?" и пошел стандартный разговор. А если к вам приходит ваш друг-сисадмин Квейк3всеДетствоВместеГоняли? И скажет: обновил убунту, tcp-пакеты не доходят, думаешь фаервол неправильно настроил?"  и вы же ему ответите нормально, а не будете "сэр, прошу поподробнее, убунту это ОС, может вы имели ввиду Вин, ведь вероятнее всего у вас просто тема рабочего стола убунту, а фаервол это для вас что?". Я хочу сказать, что принимая всех как новичков, которые шаблонно не дают инфы, вы не видите перед собой того, кто старается минимизировать лишние вопросы.
Цитата
"головой не ударялся"
Бросьте, мистер модератор (простите, если это оскорбительно, я не знаю, как в России применить фразу "Мистер Х"), но вы оценили мою фразу неверно. Я знаю, что тут у нас в России очень многие злые, коррумпированные и эгоистичные и скорее всего фразу вы расценили как "головой чтоли ударился?", но в моем случае шутку я направлял на себя "кажется головой не ударялся", показывая тем самым мысль о том, что ничего передать не забыл. Другими словами: Нет, ничего не менялось, ничего не менял, все проверял, изменений не вносил, на голову ничего не падало, уверен, что амнезии на этот счет нет, все что выше написал - по моей памяти верно.


Спасибо еще раз за код.
 
Все хорошо. Все правильно.
Цитата
Tema Zosin пишет:
и поймите, что я минимизировал свое время на эту задачу.
Цитата
Tema Zosin пишет:
Ну дал бы я табличку с макросом и строчками с цифрами, которые перед этим бы автопроставлением поставил бы, и зачем это?

Может для того, чтобы минимизировать время желающих помочь вам в решении вашей задачи?
 
Цитата
Tema Zosin пишет:
Ну дал бы я табличку с макросом и строчками с цифрами...
И правильно бы поступили. Всегда старайтесь прикрепить проблемный файл - меньше потом писать придётся.
 
Цитата
Tema Zosin пишет:
что ничего передать не забыл
я так и понял. что всё, что вы знаете - рассказали честно.
вот только знаете вы мало. и не только в VBA.
а апломба у вас много.
стало неприятно и скучно.
(неинтересно - было с самого начала. макрос примитивный, задача простая, отвечать можно лишь из желания помочь, помогающему ваша "великая проблема" не даст ровным счётом ничего).

итого - ваша сказка "всё работало, но после НГ вдруг сломалось" так и не подтвердилась.
у вас БЫЛ неправильный, не всегда работающий макрос, таковым он и ОСТАЛСЯ.

цикл хоть и немного непривычно (и неоптимально) организован , но по сути правильный.
а вот в этом месте
Код
vsego = iz.Cells(1, 1).CurrentRegion.Rows.count

и
Код
vsego = iz.Cells(iz.Rows.Count, 1).End(xlUp).Row

ваш макрос и макрос The_Prist'a различаются.

если бы вы отреагировали нормально, я бы предложил вам проверить - являются ли все 5-7к ваших данных неразрывным диапазоном. думаю, что нет (раз уж лист не перемещен).
так что - пока у вас был неразрывный диапазон с данными - макрос "работал".
а как только в данных появилась пустая строка - макрос тоже "работал", но только в диапазоне от первой до этой пустой строки. и дубликаты проверял только в пределах этого диапазона.

пс.минимизируя своё время на такую примитивную ерунду, просмотрел ваше "бла-бла-бла", не касающееся Excel и VBA по диагонали. поэтому и прокомментировать не могу.
I'm sorry.
Изменено: ikki - 18.01.2013 19:26:19
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Все ясно. Удачи с подобными рассуждениями.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх