![]() |
Сложная задача по поиску и вхождению
Всем добрый день. Задача сложная,но наверное интересная. В общем не знаю даже как описать то, что нужно сделать, но это делаю каждый день руками.
Прилагается пример, до и как должно быть на разных листах. На вопросы типа выложи оригинал-отвечаю это и есть оригинал.Реальный мой рабочий файл. |
Цитата:
Если вопрос в них - выделяете любую ячейку, жмете F5 - выделить - текущая область (либо выделяете мышкой), потом жмете ctrl+L и получаете фильтры и кучу других плюшек. Если вопрос не в них - поясните пожалуйста, что вы хотите сделать. |
a_axe,
Цитата:
|
Цитата:
|
Не только в "ПредвАрх",но и в "Карточки". Пустые пропускать.Так как видно если нет в одном столбце,то есть в другом.
|
Цитата:
Могу предложить следующий вариант: вашу таблицу необходимо отформатировать как "умную" таблицу эксель: Цитата:
После этого запускаем макрос: Код
Цитата:
Код перебирает все ячейки столбцов "Карточки" и "ПредвАрх", если находит две пустые, стоящие рядом, проверяет что Наименование совпадает с Наименованием предыдущей строки, если да - проверяет над какой из ячеек непустая ячейка и копирует ее в текущую строку, помечая ячейку красным цветом в целях контроля. Форматирование нужно снять потом вручную. |
a_axe, а почему все тоже самое нельзя сделать без "умной" таблицы?
В чем собсно её отличие от той что есть? Цитата:
Цитата:
|
Цитата:
Цитата:
ЗЫ. Ячейки, не попадающие под условие - пропускаются. Добавлено: Например, если вы в середину таблицы вставите еще 17 столбцов, для умной таблицы программу менять не нужно - все как было, так и останется. А если программу написать для просто диапазона - придется проверять и корректировать все ссылки. |
Цитата:
А проверки через if,do while и тп Сначала найти в каком столбце есть,запомнить,проверить есть в следующем вхождение,потом дописать значение и тп |
blackeangel, диапазон не сложный, проверки реализуются в том числе с помощью указанных Вами операторов, алгоритм также может быть таким. Нужно только написать другую программу, поэтому хотелось бы получить ответ на вопрос:
Цитата:
|
Цитата:
|
Iska, я имел ввиду не формулы рабочего листа, а работу VBA кода. Если не реализовывать в коде поиск по заголовкам, а например жестко забить номер столбца (пятый, шестой) и т.д. то при вставке в середину столбцов нужно менять код (например была ссылка на столбец пять, а после вставки он стал шестым - в коде пятерки на шестерки надо менять).
Если таки использовать поиск заголовков с автоматическим определением границ таблицы - так с форматированием в умную таблицу код проще. Есть столбец "Наименование" - хочешь седьмой, хочешь двадцатый столбец - форма обращения одинаковая. Кроме таблиц можно любые данные на листе иметь - а если использовать например UsedRange, то данные не всегда можно иметь в любом месте. У таблицы есть четкие границы, программно их искать не нужно. Про формулы вы написали, это тоже... Абсолютно не утверждаю, что все нужно "кодить" обязательно через них, но в данном случае переделывать лень :) Например в соседней теме на одном листе было 48 таблиц с одинаковыми заголовками. Понятно, что VBA решение можно было и без "умных" таблиц реализовать, но на мой взгляд - через те же именованные диапазоны. По сути таблицы их же и реализуют. Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Хотя мне не понятно для чего нужно её форматировать? Что мешает её пользоваться как есть? |
blackeangel, да не в форматировании дело. Мы получаем взаимосвязанную структуру вместо однородного поля независимых ячеек.
|
Цитата:
Сдаётся мне она облегчает жизнь.Но она ж усложняет тем что за её пределы не вырвишься,да и как понял внутри неё тоже не все гладко... |
Цитата:
Цитата:
|
Форум тупит..вот накидал, но не работает почему то
Поправте что не так? Код:
Sub KD() |
Или я не в ту сторону плыву?
|
Цитата:
Цитата:
Цитата:
Заниматься проверкой Вашего кода не имея сформулированной задачи - не самое разумное предложение. Для начала все-таки сформулируйте задачу, что должна сделать программа, а уже потом давайте разбираться с кодом. |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
1. Не принципиально, но в коде фигурирует название столбца "ПредвАрхив", в примере "ПредвАрх", думаю Вы сами поправили и по факту у Вас одинаково. 2. Строчка If Cells(i, ncolumn2).Value Like Cells(i, ncolumn1).Value Then сравнивает значения ячеек столбца "Обозначение". Поскольку строки не совпадают полностью(например для указанной позиции "Провод" это будут МИЛБ.685614.503-02, МИЛБ.685614.503-03 и т.д.), условие соблюдаться не будет, пока строки не будут полностью одинаковы. Насколько я вижу, в файле таких совпадений не будет нигде. 3. В цикле у Вас идет проверка на совпадение ячеек в текущей строке столбцов "Обозначения" и "Карточки". Если не совпадают, больше никаких проверок этот участок кода не выполняет (в коде ниже - строки между двумя красными строками будут выполняться только если "Обозначения" четко равны "Карточкам".) Если условие выполняется (будем считать, что пункт 2 устранен), то идет проверка синей сточки кода. Если условие соблюдается (в коде оно подчеркнуто), то выполняется следующая строчка кода. Если не соблюдается, то выполняются дальнейшие проверки, в том числе - еще раз выполняется проверка If Cells(i + 1, ncolumn1).Value Like Cells(i, ncolumn1).Value (подчеркнуто второй раз). Это условие заведомо выполняться не будет (в коде это проверено четырьмя строчками выше, и если условие истинно, то в else мы в принципе не попадем). Вероятно, строчки End If не должны идти друг за другом. Вообще этот блок лучше реализовать через select case. Код:
Do While Cells(i, ncolumn1).Value <> Empty |
Время: 07:59. |
Время: 07:59.
© OSzone.net 2001-