|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
||||||
Ошибка Run time error ‘-2147417848 (80010108)’18.07.2013, 21:58. Показов 25160. Ответов 102
Метки нет (Все метки)
Добрый день.
Долгое время работал с макросом в Эксель 2010, ищущем дубли на листе: 1. в пустую ячейку столбца С, следующую за последней заполненной, вставляется слово, по которому идёт поиск дублей (или несколько слов вставляются последовательно в соответствующее кол-во ячеек столбца С, если нужно найти дубли сразу нескольких слов); 2. выделяется ячейка, содержащая это слово (или верхнее из слов, если их несколько), запускается макрос поиска дублей по всем ячейкам столбца С; 3. макрос пробегает все ячейки столбца С и находит дубли; 4. вырезает строку/строки с ячейками от A до Z, где в столбце С был найден дубль поискового слова/слов; 5. вставляет найденные строки в пустые строки в конце файла (т.е. в строки, следующие за строками, содержащими слова, по которым ведётся поиск дублей);
Run time error ‘-2147417848 (80010108)’: Method ‘Paste’ of object ‘_Worksheet’ failed После нажатия Debug выделяется строка ActiveSheet.Paste При этом таки находится дубль 1-ой строки, но удалить никакую строку после этого невозможно - эксель просто не реагирует на попытку удаления строк и макрос поиска дублей больше не работает, а вот все остальные - работают. После перезагрузки экселя можно удалять строки, но при поиске дублей, ситуация повторяется. Огромная просьба: помогите пожалуйста оптимизировать макрос, чтобы данная ошибка не возникала. Сколько сам не бился, не удалось исправить.
0
|
||||||
| 18.07.2013, 21:58 | |
|
Ответы с готовыми решениями:
102
Ошибка VBA: Run time error ‘-2147417848 (80010108)’: Method ‘Paste’ of object ‘_Worksheet’ failed Периодическая Run-time error '-2147417848(80010108)' Ошибка Run-time error '13' |
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 10:44 [ТС] | |
|
Шикарно, то что надо!!!
Быстродействие просто класс! Всего 15 секунд для поиска дублей по 1000 строк. Раньше бы огого сколько искало! Небольшая рихтовочка: "1" надо ставить не в найденых строках, а в с строках с поисковыми кретериями. Она обозначает что дубль к этому критерию был найден. Соответственно, если дубль к критерию не найден, то "1" в строке с критерием ставить не надо ![]() В идеале конечно просто удалять те критерии, к которым дубли найдутся, а к которым не найдутся - оставлять. И да, ОГРОМНОЕ СПАСИБО!!! уже сейчас можно хоть нормально работать
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
| 22.07.2013, 11:21 | |
|
Потом подправлю. Сегодня работы много. Но что у Вас за комп? У меня слабенький ноут 25 000 с тремя критериями прогнал за 11 сек.! Кстати, если он не находит - выдает сообщения через Msgbox.
Добавлено через 17 минут А Вы случайно не используете вариант с AutoFiltr? Вытяните код из вчера отправленной книги с применением dictionary.
0
|
|
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 11:37 [ТС] | |
|
Нашёл критическую ошибку:
Найденные строки нужно не копировать, а переносить! Т.е. найденные строки должны падать вниз файла, не оставляя копий в тех местах, откуда были взяты! (Я в них вношу изменения и получается что где-то остаются валяться строки с устаревшей инфой - только засоряют итак уже намалый файл )Тогда код не будет принимать в внимание ст. А (и/или b,d,g,..). Запустите - и увидите, что в основной таблице останется только одно "слово 12". Поганяйте, присмотритесь. В найденных дублях как раз нужно все дубли найти, если они вдруг отличаются в каком-то поле A-B, D-Z Так что в этом плане всё работает верно ![]() Несколько рихтовочек, которые существенно облегчат работу, если не сложно ![]() 1. Если в строке с критерием для поиска заполнить одно из полей A-B, D-Z, то он не найдёт дубли к этому критерию и выдаст THE CRITERIAS ARE NOT SPECIFIED, что странно, т.к. поиск идёт только по столбцу С, и значение остальных ячеек строки с критерием (по которой идёт поиск) вроде как должны игнорироваться. 2. Проверять поисковые критерии перед поиском дублей и автоматически удалять оттуда знаки пробела или знаки препинания (бывает попадают и дубли не находит). Знаки пробела он и так игнорирует уже сейчас, а вот с запятыми не находит - это не суть важно, как говорится если не лень будет и код не замедлит существенно. ![]() 3. Ну и, если всё же сделаете удаление тех поисковых строк, к которым найдутся дубли, получится вообще конфетка ![]() Комп на Core i3. Я видимо не совсем верно выразился: по 60 000 строк поиск дублей по 1000 критериев - 14 с чем-то секунд искал. По 3-м критериям порядка пары секунд.
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
| 22.07.2013, 11:47 | |
|
Посмотрите пост #40. Выполните замену этого блока (только это). Проанализируйте результат.
0
|
|
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 12:16 [ТС] | |
|
Igor_Tr, делал, но и он не удаляет те строки которые копирует! Просто копирует лишь 1 строку для каждого критерия, затирая остальные, а скопированная строка остаётся.
Мне же нужно скопировать все строки (как это делается в Вашем макросе без исправления), но при этом стереть их всех из тех мест, где они лежали.
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
| 22.07.2013, 12:28 | |
|
Сделайте, как я в последней книге. Фрагмент Вашей таблицы. В ней несколько повторов по нескольким критериям. Укажите критерии. Это будет Before. На другом листе (копии Before) этот Before обработайте вручную что б было видно конечное. Переименуйте копию на AFTER. Важное можете выделить шрифтом, толщиной, цветом. Так мы до чего-то дойдем. А то мой русский... Для магазина он конечно хороший, а здесь часто дает сбой.
0
|
|
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 13:49 [ТС] | |
|
Добавил.
Обратите внимание: 1. на листе After найденные строки присутствуют во всем листе только в одном экземпляре - внизу листа. Из середины листа, где они были, они пропали. 2. на листе After: в столбце Y в строках с критериями 15, 16 и 18, к которым нашлись дубли, появились "1" - выделил жирным красным. 3. на листе Before: значения в ячейках A-B, D-Z в поисковых строках 25 и 31 игнорируются при поиске дублей, т.к. поиск идёт только по значению в столбце С. 4. на листе Before: присутствующие запятые и пробелы в столбце С поисковых строк 25 и 27 при поиске дублей были уничтожены, т.е. был выделен только текст, по которому и производился поиск дублей, как видно на листе After в строках 15 и 16 их уже нет. Другими словами, перед самим поиском дублей по критериям, когда критерии собираются, в них удаляется всё кроме текста (только в столбце С и только в критериях по которым идёт поиск!) - Это необязательно, если сложно реализовать, то не нужно делать. От автоматического удаления пришлось отказаться - при синхронизации двух таких файлов может возникнуть ситуация, когда удалится строка с более новой инфой ![]() Заранее спасибо
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|||||||||||
| 22.07.2013, 15:39 | |||||||||||
|
Давайте медленно и по порядку. Как я понял Ваш пример.
1. Заданы критерии: Слово 12 Слово 11 Слово 864 Слово 14. 2. Код ищет дубли сравнивая все - это видно по рузультатах на листе AFTER по критерию слово 12 (в after, rows 19,20):
3. Из основной таблицы удалить все дубли, а соответствующие уникальные из основной таблицы "вырезать/удалить", но уникальные перенести/сохранить в диапазоне результатов (после указанных критериев). Или куда-то в другое место? (это не проблема!) 4. Для существующих критериев - в "У" вставить 1 (зачем???, но это не проблема) 5. Появилось новое условие: удалить запятые. Что там еще можеть быть? Это что-то может быть только после критерия? Это очень важно, или Вам придется коректно самому править руками. Давайте, этот вариант сделаем как правило: Критерий идет первым и состоит из двух выражений (КакаятоФразаБезПробелов - пробел/пробелы - КакаятоФразаБезПробелов). После него (кроме знаков точка, зпт, две точки и т.д.) - пробел. Пробел может быть и до указанных знаков и указанные знаки не обязательные (но могут быть, и с этим надо повозиться). Например:
Если я теперь правильно понял - сегодня найду время. И последнее.
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 17:20 [ТС] | |
|
1. верно
2. верно, НО! Сравнивать всё он должен только среди тех строк, что уже имелись. Значение полей A-B, D-Z в строчке с критерием, по которому идёт поиск, в учёт приниматься не должны (строка 25 и строка 31 в Before). Т.е. в том примере, что я выложил, если поискать дубль по Слово 12 в строке 25 или Слово 14 в строке 31- он ничего не найдёт. А если очистить A-B в этих строках - найдёт. 3. верно! - Из основной таблицы удалить все дубли, а уникальные перенести/сохранить в диапазоне результатов после указанных критериев 4. Не совсем понял что Вы имеете в виду под словом "существующих". Вставить "1" для тех, для которых нашлись дубли. Нужно это чтобы быстро определить к каким дубли нашлись, а к каким нет - например к Слово 864 дубль не найден и я это сразу увижу (а, представте, поиск по сотне сразу - вдруг к какому не найдут, так я сразу это увижу благодаря тому что "1" в столбце Y не будет. 5. Варианта в столбце С может быть 2: "XXXXXXX" или "XXXXX-XXXX" , где X - какая-то буква латинского алфавита, разумеется длина слов может быть любой (от 4 до 20 символов), т.е. можно удалять из критериев любые другие символы кроме букв латинского алфавита и знака дефис "-", где бы они не находились. С самим столбцом С делать ничего не надо - там и так всё в правильном формате. "Что-то у Вас архитектура листа какая-то сырая, мне кажется." Извеняюсь, это уже меня глючит Автоматическое удаление критериев, к которым найдутся дубли - можно сделать, если не сложно. Тогда пункт номер 4 не нужен.
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
| 22.07.2013, 18:00 | |
|
Мне точно нужно технический переводчик!
![]() Ваш пример. Когда Вы закидываете критерии - кроме них в других ячейках ничего не должно быть для нормальной работы кода. Было договорено - критерии только в С снизу! Теперь (с учетом выше) если Вы возьмете лист ...Ater из Вашего примера и сравните с листом New_...After из этой книги, которую кидаю теперь - все один в один! Участок, который чистит критерии - выделен от '--Cleaning--criteria---- до '==End==Cleaning==== Так же с тем, который доб. 1: от '--ADD--ONE---------- до '==End==ADD==ONE==== А эта команда inELT.Delete удаляет из основной таблицы найденое (которое уже было перенесено в "отчет". Как видите - изменений на 5 минут. Пробуйте. Если нужно удалить из области критериев найденые - там тоже изменения будут, но уже аж на 1 минуту.
1
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|||
| 22.07.2013, 18:24 | |||
|
Может, сейчас уеду. Для того , что б удалить найденные критерии, найдите в коде строку (блок додавания 1)
0
|
|||
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 18:53 [ТС] | |
|
Класс! Если не сложно, добавте удаление из области критериев найденные - наверняка удобней старой системы с 1-ками будет, но и старая пусть закомменченой останется - вдруг пригодится
![]() З.Ы. я ток не понял почему в "Слово 12" остался пробел между Слово и 12 это я немного с примером наглючил, там везде в столбце С надо было пробелы поубирать. Но думаю что и так работать будет ![]() Ясно, огромное спасибо! Завтра буду тестировать, отпишусь подробно!Добавлено через 21 минуту Работает! Но быстродействие упало до адских глубин: 45 секунд на 1 несчастный дубль завтра буду выяснять что именно её так вешает...
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
| 22.07.2013, 19:17 | |
|
Не понял? У Вас везде "Слово N", а не "СловоN". Если менять - тогда везде, в первую очередь - в основной таблице. Я постмотрел код. Пробустил там кучу точок (нужно .Cells а я просто Cells). Исправлю, очистку сделаю через функцию (точно будет быстрее), но основной тормоз, думаю, в удалении уникатов из тела основной таблицы в конце кода (а у Вас там не таблица, а неизвестная картина Пикассо) и кину. Если будет такое, нужно тогда все это делать по другому. А почему нельзя кинуть отчет на другой лист, а в основное таблице оставить найденное? Честно, такой подход, как у Вас, я еще нигде не видел.
0
|
|
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 20:55 [ТС] | |
|
Igor_Tr, в примере я пробел поставил, да. Но в оригинале, как я и сказал, это выглядит как "XXXXXXX" или "XXXXX-XXXX" , где X - какая-то буква латинского алфавита, разумеется длина слов может быть любой (от 4 до 20 символов). Никаких пробелов в столбце С нету.
Я тоже думаю что тормоз в удалении при удалении строки вручную, удаляет секунд 10."А почему нельзя кинуть отчет на другой лист, а в основное таблице оставить найденное? Честно, такой подход, как у Вас, я еще нигде не видел." Потому что это не отчёт, а постоянно обновляемая и дописывающаяся таблица! Я вытаскиваю строку, обновляю в ней инфу, затем следующую или сразу пачкой от нескольких штук до нескольких сотен и т.д.
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|||
| 22.07.2013, 21:52 | |||
|
Если нет пробела - не вопрос (но почему он везде в Ваших примерах?). А вот с удалением - проблема. Дело в том, что когда он удаляет, он как бы перерисовывает весь лист. Чем больше таблица, чем там больше форматирования, примечаний, бантиков-фантиков - тем длиннее процесс. Попробуйте в основной таблице вставить пустую строке где-то всередине. А потом ее и удалите. Увидите тормоза живьем. Поэтому я и применил RemoveDublicate. Это работает быстро, но не удаляет оригинал. Я не понимаю, хоть убейте, все Ваши движения. Получили внизу. Есть. Что Вы сними делаете дальше? Чем они ПОТОМ будут отличаться от строк ДО выборки? Как Вы разбираетесь с этими 60 000? Зачем даты в примечаниях, а не в столбцах? У меня вопросов - море. Не нравится мне Ваша таблица. В ней нет строгости, ритма, жизни...
![]() А что б удалить пробел, похожую строку перепишите вот так
Добавлено через 8 минут
0
|
|||
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 23:29 [ТС] | |
|
Если нет пробела - не вопрос (но почему он везде в Ваших примерах?). - мой косяк в примере
![]() Увидите тормоза живьем. - вижу каждый день ![]() Чем они ПОТОМ будут отличаться от строк ДО выборки? Как Вы разбираетесь с этими 60 000? Зачем даты в примечаниях, а не в столбцах? - да ни чем. В основном меняется дата в столбцах и в примечаниях (да, в столбцах даты тоже есть). Я бы вытащил все макросом 1, запомнил ряды, кинул на другой лист, спокойно обработал, и записал макросом2 в основную таблицу на место старых. Интересно. Со второго чистого листа всё должно вмиг удаляться, а инфа может копироваться по прежнему адресу, откуда была вытащена? Не знал этого. Сделал пример. На листе RDW находится вся таблица, на листе Working_List - мы работаем. Убрал там пробелы, где их быть не может, поставил "-", там где он быть может. Можете написать макрос, чтобы при поиске дублей на листе Working_List он копировал их туда с листа RDW, и макросом "Вернуть дубли" отправлял обратно по адресу на лист RDW, после чего очищал Working_List за исключением 3-х верхних строк, где и расположены макросы? З.Ы. просьба прикрутить макросы на те 2 кнопки что я создал на Working_List ![]() З.З.Ы. в случае, если такой критерий на листе RDW не был найден (например, Слово864), макрос "Вернуть дубли" отправлял такие строки в конец листа RDW?
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
| 22.07.2013, 23:42 | |
|
Здесь, что надо удалить, собрано в одну кучу и удаляется все вместе. Немного даст скорости, но не очень - перерисовка останется. Еще там функция handleCRITERIA. Через RegExp не делал. Поосторожничал. В функции включен вариант когда критерий с пробелом (что б у меня работало).Если Вам нужно будет, этот вариант переведите в коменты, и выведите из коментов другой (он в функции зеленый).
А почему не создадите себе базу, например, Access? Для такого обьема и для Ваших методов/подходов - самый подходящий вариант. И еще. Там у Вас в модулях листов куча всего. Связано это c CheckBox (-ами), CommandButton (-ами) и т.д. И так лист аж прогинается. Определитесь, что Вам главнее. Уберите все лишнее, как говорит "Казански": "Гудочки-свисточки" (а я - бантики-фантики). Уберите ненужную заливку. Ее нужно делать когда что-то конкретно (условное форм-е). Посмотрите что с коментариями. Может, лучше перенести в ячейки (они - как Shapes. Голодные.). Вобщем, постарайтесь по максимуму разгрузить лист. Он Вам только спасибо скажет. И еще. Возможно, это как-раз тот вариант, когда стоило бы задействовать UserForm. Обрабатывать в форме, и возвращать на место (а не удалять). Но я не люблю с ним играться. Попробуйте паралельно. Удачи. ![]() Я не увидел Ваш ответ. И мой файл - тоже v3....
1
|
|
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 22.07.2013, 23:42 [ТС] | |
|
А почему не создадите себе базу, например, Access?
см. личку
0
|
|
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
| 22.07.2013, 23:53 | |
|
Сегодня уже все. Потом посмотрю - уже хочу домой и пиво тоже поближе к дому
По большому счету - это не много работы. Но!!! ЗАЧЕМ!!! ВАМ!!! ДУБЛИ!!!??? Дубли пусть удаляются. работаем с оригиналами. Изменили - загоняем на их место измененные. И дублей нет, и таблица изменяется. Давно так надо было, как минимум!
0
|
|
|
0 / 0 / 0
Регистрация: 18.07.2013
Сообщений: 48
|
|
| 23.07.2013, 00:09 [ТС] | |
|
Igor_Tr, ну так где вы про дубли прочитали?
Так только кнопки называются, для краткости Как я это вижу: На листе Working_List в столбец С вставляем критерии, запускаем макрос1 "Поиск дублей" - получаем копии оригинальных строк, при этом удаляются те критерии, к которым нашлись оригиналы. Вносим все нужные изменения, в том числе и к критерию, по которому ничего не нашлось. Запускаем марос2 "Возврат дублей" - оригиналы возвращаются по адресу прописки, новые критерии - в конец листа RDW. Working_List очищается. Как-то так... это я попробовал развить Вашу мысль ![]() З.Ы. пример чуть выше привёл - пост 56.
0
|
|
| 23.07.2013, 00:09 | |
|
Ошибка Run-time error 76 Ошибка run time error Ошибка run time error 9 Ошибка: Run-time error '5'
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2.
Задача:
Обеспечить запись документа в регистр сведений независимо от. . .
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|