Показать полную графическую версию : Сложная задача по поиску и вхождению
blackeangel
15-12-2015, 09:32
Всем добрый день. Задача сложная,но наверное интересная. В общем не знаю даже как описать то, что нужно сделать, но это делаю каждый день руками.
Прилагается пример, до и как должно быть на разных листах.
На вопросы типа выложи оригинал-отвечаю это и есть оригинал.Реальный мой рабочий файл.
В общем не знаю даже как описать то, что нужно сделать »
Честно говоря, из изменений вижу только фильтры.
Если вопрос в них - выделяете любую ячейку, жмете F5 - выделить - текущая область (либо выделяете мышкой), потом жмете ctrl+L и получаете фильтры и кучу других плюшек. (http://perfect-excel.ru/publ/excel/razlichnye_instrumenty_excel/umnye_tablicy/10-1-0-33)
Если вопрос не в них - поясните пожалуйста, что вы хотите сделать.
blackeangel
15-12-2015, 10:15
a_axe, Если вопрос не в них - поясните пожалуйста, что вы хотите сделать. »
Вопрос не в них. Если отмотать к наименованию кабель или жгут или провод, то будет видна разница между до и после. Просто реально не могу объяснить. У нас это называется дошлифовать, и все понимают,но человеку со стороны это не объяснить,поэтому я и показываю на примере живом.
кабель или жгут или провод, то будет видна разница между до и после. »
насколько я понимаю, вы хотите заполнить пустые ячейки столбца "ПредвАрх" значением из предыдущей непустой ячейки, при условии что значение в ячейках "Наименование" также будет совпадать? Если да - что нужно делать с ячейками D2, D3, D9-D11, D16, D27, D34 и в соответствие с какими соображениями?
blackeangel
15-12-2015, 10:36
Не только в "ПредвАрх",но и в "Карточки". Пустые пропускать.Так как видно если нет в одном столбце,то есть в другом.
Так как видно если нет в одном столбце,то есть в другом. »
В вашем примере - не всегда.
Могу предложить следующий вариант: вашу таблицу необходимо отформатировать как "умную" таблицу эксель:
жмете F5 - выделить - текущая область (либо выделяете мышкой), потом жмете ctrl+L »
Наименование заголовков должно быть как в вашем примере. Таблица должна иметь название "Таблица1" (изменить можно во вкладке "Конструктор" - Имя таблицы).
После этого запускаем макрос:
Sub ins_art()
Dim myCell As Range
Dim i As Integer
For i = 2 To Range("Таблица1").Rows.Count
If Range("Таблица1[Карточки]").Rows(i) = "" And _
Range("Таблица1[ПредвАрх]").Rows(i) = "" And _
Range("Таблица1[Наименование]").Rows(i).Value = Range("Таблица1[Наименование]").Rows(i - 1).Value Then
If Range("Таблица1[Карточки]").Rows(i - 1).Value <> "" Then
Range("Таблица1[Карточки]").Rows(i).Value = Range("Таблица1[Карточки]").Rows(i - 1).Value
Range("Таблица1[Карточки]").Rows(i).Interior.ColorIndex = 3
ElseIf Range("Таблица1[ПредвАрх]").Rows(i - 1).Value <> "" Then
Range("Таблица1[ПредвАрх]").Rows(i).Value = Range("Таблица1[ПредвАрх]").Rows(i - 1).Value
Range("Таблица1[ПредвАрх]").Rows(i).Interior.ColorIndex = 3
End If
End If
Next i
End Sub
Код перебирает все ячейки столбцов "Карточки" и "ПредвАрх", если находит две пустые, стоящие рядом, проверяет что Наименование совпадает с Наименованием предыдущей строки, если да - проверяет над какой из ячеек непустая ячейка и копирует ее в текущую строку, помечая ячейку красным цветом в целях контроля. Форматирование нужно снять потом вручную.
blackeangel
15-12-2015, 11:59
a_axe, а почему все тоже самое нельзя сделать без "умной" таблицы?
В чем собсно её отличие от той что есть?
Так как видно если нет в одном столбце,то есть в другом. »
В вашем примере - не всегда.
Пустые пропускать.
все тоже самое нельзя сделать без "умной" таблицы? »
Собственно - можно. Чисто технически обращаться к таблице проще и нагляднее - независимо от того, добавляли ли вы туда строки или нет, есть ли данные на листе кроме этой таблицы или нет. Отформатировать ее можно так, что она вообще не будет отличаться от просто ячеек листа. Вопрос встречный - а какие соображения есть, чтобы не форматировать ее как умную таблицу?
В чем собсно её отличие от той что есть? »
В кучке дополнительных плюшек и вафелек, начиная от удобного форматирования, заканчивая структурированными ссылками на содержимое.
ЗЫ. Ячейки, не попадающие под условие - пропускаются.
Добавлено:
Например, если вы в середину таблицы вставите еще 17 столбцов, для умной таблицы программу менять не нужно - все как было, так и останется. А если программу написать для просто диапазона - придется проверять и корректировать все ссылки.
blackeangel
15-12-2015, 16:29
все тоже самое нельзя сделать без "умной" таблицы? »
Собственно - можно. Чисто технически обращаться к таблице проще и нагляднее - независимо от того, добавляли ли вы туда строки или нет, есть ли данные на листе кроме этой таблицы или нет. Отформатировать ее можно так, что она вообще не будет отличаться от просто ячеек листа. Вопрос встречный - а какие соображения есть, чтобы не форматировать ее как умную таблицу?
В чем собсно её отличие от той что есть? »
В кучке дополнительных плюшек и вафелек, начиная от удобного форматирования, заканчивая структурированными ссылками на содержимое.
ЗЫ. Ячейки, не попадающие под условие - пропускаются.
Добавлено:
Например, если вы в середину таблицы вставите еще 17 столбцов, для умной таблицы программу менять не нужно - все как было, так и останется. А если программу написать для просто диапазона - придется проверять и корректировать все ссылки.
А диапазон у нас простой вроде от 2 до последней не пустой строки строки.
А проверки через if,do while и тп
Сначала найти в каком столбце есть,запомнить,проверить есть в следующем вхождение,потом дописать значение и тп
blackeangel, диапазон не сложный, проверки реализуются в том числе с помощью указанных Вами операторов, алгоритм также может быть таким. Нужно только написать другую программу, поэтому хотелось бы получить ответ на вопрос: Вопрос встречный - а какие соображения есть, чтобы не форматировать ее как умную таблицу? »
Например, если вы в середину таблицы вставите еще 17 столбцов, для умной таблицы программу менять не нужно - все как было, так и останется. »
В середину — и в старых версиях проблем не будет. А вот если, как это обычно и бывает, добавлять в конец, перед строкой с «ручными» итогами — все ссылки в этих итоговых формулах придётся расширять для дополнения новой строки в итоги вручную. Я лично буквально молился на появившиеся в 2003-м «Списки».
Iska, я имел ввиду не формулы рабочего листа, а работу VBA кода. Если не реализовывать в коде поиск по заголовкам, а например жестко забить номер столбца (пятый, шестой) и т.д. то при вставке в середину столбцов нужно менять код (например была ссылка на столбец пять, а после вставки он стал шестым - в коде пятерки на шестерки надо менять).
Если таки использовать поиск заголовков с автоматическим определением границ таблицы - так с форматированием в умную таблицу код проще. Есть столбец "Наименование" - хочешь седьмой, хочешь двадцатый столбец - форма обращения одинаковая. Кроме таблиц можно любые данные на листе иметь - а если использовать например UsedRange, то данные не всегда можно иметь в любом месте. У таблицы есть четкие границы, программно их искать не нужно. Про формулы вы написали, это тоже...
Абсолютно не утверждаю, что все нужно "кодить" обязательно через них, но в данном случае переделывать лень :)
Например в соседней теме на одном листе было 48 таблиц с одинаковыми заголовками. Понятно, что VBA решение можно было и без "умных" таблиц реализовать, но на мой взгляд - через те же именованные диапазоны. По сути таблицы их же и реализуют.
Я лично буквально молился на появившиеся в 2003-м «Списки».
Я со списками в 2003 к сожалению не работал :), но как я понял - "умные" таблицы это их продолжение
blackeangel
15-12-2015, 17:25
blackeangel, диапазон не сложный, проверки реализуются в том числе с помощью указанных Вами операторов, алгоритм также может быть таким. Нужно только написать другую программу, поэтому хотелось бы получить ответ на вопрос: Вопрос встречный - а какие соображения есть, чтобы не форматировать ее как умную таблицу? »
Ответ прост-исключить деятельность человека полностью ;)
Iska, я имел ввиду не формулы рабочего листа, а работу VBA кода. »
Понял :).
Я со списками в 2003 к сожалению не работал , но как я понял - "умные" таблицы это их продолжение »
Угу. Расширенное и углублённое.
Ответ прост-исключить деятельность человека полностью »
В таком случае, Вам дорога не в Excel, а в Access или в 1С.
blackeangel
15-12-2015, 19:14
В таком случае, Вам дорога не в Excel, а в Access или в 1С.
Эээ...неее...именно Эксель, будь другие варианты конечно бы запользовал ;)
но в данном случае переделывать лень :)
Вот это и объясняет...
Хотя мне не понятно для чего нужно её форматировать?
Что мешает её пользоваться как есть?
blackeangel, да не в форматировании дело. Мы получаем взаимосвязанную структуру вместо однородного поля независимых ячеек.
blackeangel
15-12-2015, 22:57
blackeangel, да не в форматировании дело. Мы получаем взаимосвязанную структуру вместо однородного поля независимых ячеек.
Тогда тот же вопрос только про взаимосвязанную структуру.
Сдаётся мне она облегчает жизнь.Но она ж усложняет тем что за её пределы не вырвишься,да и как понял внутри неё тоже не все гладко...
Тогда тот же вопрос только про взаимосвязанную структуру. »
Для того, чтобы приложение «понимало», что вот это — набор взаимосвязанных ячеек, составляющих одно целое, Таблицу, вот это — шапка этой Таблицы, вот эти ячейки — её тело, к ним можно привязать итоги, как общие, так и промежуточные, на основе изменений вот в этом столбце. И так далее. Вся суть автоматизации (упрощённо) заключается в выявлении сущностей и установлении взаимных связей между ними. А Вы говорите «для чего?».
Но она ж усложняет тем что за её пределы не вырвишься,да и как понял внутри неё тоже не все гладко... »
А зачем вообще «вырываться» и что именно «не гладко»?
blackeangel
16-12-2015, 09:55
Форум тупит..вот накидал, но не работает почему то
Поправте что не так?
Sub KD()
Application.ScreenUpdating = False
i = 2
sWhatFind1 = "Обозначение"
sWhatFind2 = "Карточки"
sWhatFind3 = "ПредвАрхив"
Cells.Find(What:=sWhatFind1, After:=ActiveCell, SearchOrder:=xlByColumns).Activate
ncolumn1 = ActiveCell.Column
Cells.Find(What:=sWhatFind2, After:=ActiveCell, SearchOrder:=xlByColumns).Activate
ncolumn2 = ActiveCell.Column
Cells.Find(What:=sWhatFind3, After:=ActiveCell, SearchOrder:=xlByColumns).Activate
ncolumn3 = ActiveCell.Column
Do While Cells(i, ncolumn1).Value <> Empty
If Cells(i, ncolumn2).Value Like Cells(i, ncolumn1).Value Then 'проверка на наличие основного исполнения
If Cells(i + 1, ncolumn1).Value Like Cells(i, ncolumn1).Value Then 'проверка на наличие другого исполнения
Cells(i + 1, ncolumn2).Value = Cells(i, ncolumn1).Value 'пишем в пустую ячейку значение основного исполнения
Else
If Cells(i, ncolumn3).Value Like Cells(i, ncolumn1).Value Then
If Cells(i + 1, ncolumn1).Value Like Cells(i, ncolumn1).Value Then
Cells(i + 1, ncolumn3).Value = Cells(i, ncolumn1).Value
End If
End If
End If
End If
i = i + 1
Loop
Application.ScreenUpdating = True
End Sub
blackeangel
16-12-2015, 10:26
Или я не в ту сторону плыву?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.