Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Office (Word, Excel, Outlook и т.д.) (http://forum.oszone.net/forumdisplay.php?f=115)
-   -   Сложная задача по поиску и вхождению (http://forum.oszone.net/showthread.php?t=309224)

blackeangel 15-12-2015 09:32 2584984

Сложная задача по поиску и вхождению
 
Всем добрый день. Задача сложная,но наверное интересная. В общем не знаю даже как описать то, что нужно сделать, но это делаю каждый день руками.
Прилагается пример, до и как должно быть на разных листах.
На вопросы типа выложи оригинал-отвечаю это и есть оригинал.Реальный мой рабочий файл.

a_axe 15-12-2015 10:04 2584991

Цитата:

Цитата blackeangel
В общем не знаю даже как описать то, что нужно сделать »

Честно говоря, из изменений вижу только фильтры.
Если вопрос в них - выделяете любую ячейку, жмете F5 - выделить - текущая область (либо выделяете мышкой), потом жмете ctrl+L и получаете фильтры и кучу других плюшек.
Если вопрос не в них - поясните пожалуйста, что вы хотите сделать.

blackeangel 15-12-2015 10:15 2584995

a_axe,
Цитата:

Цитата a_axe
Если вопрос не в них - поясните пожалуйста, что вы хотите сделать. »

Вопрос не в них. Если отмотать к наименованию кабель или жгут или провод, то будет видна разница между до и после. Просто реально не могу объяснить. У нас это называется дошлифовать, и все понимают,но человеку со стороны это не объяснить,поэтому я и показываю на примере живом.

a_axe 15-12-2015 10:30 2585005

Цитата:

Цитата blackeangel
кабель или жгут или провод, то будет видна разница между до и после. »

насколько я понимаю, вы хотите заполнить пустые ячейки столбца "ПредвАрх" значением из предыдущей непустой ячейки, при условии что значение в ячейках "Наименование" также будет совпадать? Если да - что нужно делать с ячейками D2, D3, D9-D11, D16, D27, D34 и в соответствие с какими соображениями?

blackeangel 15-12-2015 10:36 2585007

Не только в "ПредвАрх",но и в "Карточки". Пустые пропускать.Так как видно если нет в одном столбце,то есть в другом.

a_axe 15-12-2015 11:39 2585025

Цитата:

Цитата blackeangel
Так как видно если нет в одном столбце,то есть в другом. »

В вашем примере - не всегда.
Могу предложить следующий вариант: вашу таблицу необходимо отформатировать как "умную" таблицу эксель:
Цитата:

Цитата a_axe
жмете 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 2585029

a_axe, а почему все тоже самое нельзя сделать без "умной" таблицы?
В чем собсно её отличие от той что есть?
Цитата:

Цитата a_axe (Сообщение 2585025)
Цитата:

Цитата blackeangel
Так как видно если нет в одном столбце,то есть в другом. »

В вашем примере - не всегда.

Цитата:

Цитата blackeangel (Сообщение 2585007)
Пустые пропускать.


a_axe 15-12-2015 12:19 2585034

Цитата:

Цитата blackeangel
все тоже самое нельзя сделать без "умной" таблицы? »

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

Цитата blackeangel
В чем собсно её отличие от той что есть? »

В кучке дополнительных плюшек и вафелек, начиная от удобного форматирования, заканчивая структурированными ссылками на содержимое.

ЗЫ. Ячейки, не попадающие под условие - пропускаются.

Добавлено:
Например, если вы в середину таблицы вставите еще 17 столбцов, для умной таблицы программу менять не нужно - все как было, так и останется. А если программу написать для просто диапазона - придется проверять и корректировать все ссылки.

blackeangel 15-12-2015 16:29 2585144

Цитата:

Цитата a_axe (Сообщение 2585034)
Цитата:

Цитата blackeangel
все тоже самое нельзя сделать без "умной" таблицы? »

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

Цитата blackeangel
В чем собсно её отличие от той что есть? »

В кучке дополнительных плюшек и вафелек, начиная от удобного форматирования, заканчивая структурированными ссылками на содержимое.

ЗЫ. Ячейки, не попадающие под условие - пропускаются.

Добавлено:
Например, если вы в середину таблицы вставите еще 17 столбцов, для умной таблицы программу менять не нужно - все как было, так и останется. А если программу написать для просто диапазона - придется проверять и корректировать все ссылки.

А диапазон у нас простой вроде от 2 до последней не пустой строки строки.
А проверки через if,do while и тп
Сначала найти в каком столбце есть,запомнить,проверить есть в следующем вхождение,потом дописать значение и тп

a_axe 15-12-2015 16:44 2585147

blackeangel, диапазон не сложный, проверки реализуются в том числе с помощью указанных Вами операторов, алгоритм также может быть таким. Нужно только написать другую программу, поэтому хотелось бы получить ответ на вопрос:
Цитата:

Цитата a_axe
Вопрос встречный - а какие соображения есть, чтобы не форматировать ее как умную таблицу? »


Iska 15-12-2015 16:47 2585148

Цитата:

Цитата a_axe
Например, если вы в середину таблицы вставите еще 17 столбцов, для умной таблицы программу менять не нужно - все как было, так и останется. »

В середину — и в старых версиях проблем не будет. А вот если, как это обычно и бывает, добавлять в конец, перед строкой с «ручными» итогами — все ссылки в этих итоговых формулах придётся расширять для дополнения новой строки в итоги вручную. Я лично буквально молился на появившиеся в 2003-м «Списки».

a_axe 15-12-2015 17:14 2585158

Iska, я имел ввиду не формулы рабочего листа, а работу VBA кода. Если не реализовывать в коде поиск по заголовкам, а например жестко забить номер столбца (пятый, шестой) и т.д. то при вставке в середину столбцов нужно менять код (например была ссылка на столбец пять, а после вставки он стал шестым - в коде пятерки на шестерки надо менять).
Если таки использовать поиск заголовков с автоматическим определением границ таблицы - так с форматированием в умную таблицу код проще. Есть столбец "Наименование" - хочешь седьмой, хочешь двадцатый столбец - форма обращения одинаковая. Кроме таблиц можно любые данные на листе иметь - а если использовать например UsedRange, то данные не всегда можно иметь в любом месте. У таблицы есть четкие границы, программно их искать не нужно. Про формулы вы написали, это тоже...
Абсолютно не утверждаю, что все нужно "кодить" обязательно через них, но в данном случае переделывать лень :)
Например в соседней теме на одном листе было 48 таблиц с одинаковыми заголовками. Понятно, что VBA решение можно было и без "умных" таблиц реализовать, но на мой взгляд - через те же именованные диапазоны. По сути таблицы их же и реализуют.
Цитата:

Я лично буквально молился на появившиеся в 2003-м «Списки».
Я со списками в 2003 к сожалению не работал :), но как я понял - "умные" таблицы это их продолжение

blackeangel 15-12-2015 17:25 2585159

Цитата:

Цитата a_axe (Сообщение 2585147)
blackeangel, диапазон не сложный, проверки реализуются в том числе с помощью указанных Вами операторов, алгоритм также может быть таким. Нужно только написать другую программу, поэтому хотелось бы получить ответ на вопрос:
Цитата:

Цитата a_axe
Вопрос встречный - а какие соображения есть, чтобы не форматировать ее как умную таблицу? »


Ответ прост-исключить деятельность человека полностью ;)

Iska 15-12-2015 18:56 2585176

Цитата:

Цитата a_axe
Iska, я имел ввиду не формулы рабочего листа, а работу VBA кода. »

Понял :).


Цитата:

Цитата a_axe
Я со списками в 2003 к сожалению не работал , но как я понял - "умные" таблицы это их продолжение »

Угу. Расширенное и углублённое.


Цитата:

Цитата blackeangel
Ответ прост-исключить деятельность человека полностью »

В таком случае, Вам дорога не в Excel, а в Access или в 1С.

blackeangel 15-12-2015 19:14 2585186

Цитата:

Цитата Iska (Сообщение 2585176)
В таком случае, Вам дорога не в Excel, а в Access или в 1С.

Эээ...неее...именно Эксель, будь другие варианты конечно бы запользовал ;)

Цитата:

Цитата a_axe (Сообщение 2585158)
но в данном случае переделывать лень :)

Вот это и объясняет...

Хотя мне не понятно для чего нужно её форматировать?
Что мешает её пользоваться как есть?

Iska 15-12-2015 22:13 2585238

blackeangel, да не в форматировании дело. Мы получаем взаимосвязанную структуру вместо однородного поля независимых ячеек.

blackeangel 15-12-2015 22:57 2585255

Цитата:

Цитата Iska (Сообщение 2585238)
blackeangel, да не в форматировании дело. Мы получаем взаимосвязанную структуру вместо однородного поля независимых ячеек.

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

Iska 16-12-2015 00:03 2585268

Цитата:

Цитата blackeangel
Тогда тот же вопрос только про взаимосвязанную структуру. »

Для того, чтобы приложение «понимало», что вот это — набор взаимосвязанных ячеек, составляющих одно целое, Таблицу, вот это — шапка этой Таблицы, вот эти ячейки — её тело, к ним можно привязать итоги, как общие, так и промежуточные, на основе изменений вот в этом столбце. И так далее. Вся суть автоматизации (упрощённо) заключается в выявлении сущностей и установлении взаимных связей между ними. А Вы говорите «для чего?».

Цитата:

Цитата blackeangel
Но она ж усложняет тем что за её пределы не вырвишься,да и как понял внутри неё тоже не все гладко... »

А зачем вообще «вырываться» и что именно «не гладко»?

blackeangel 16-12-2015 09:55 2585324

Форум тупит..вот накидал, но не работает почему то
Поправте что не так?
Код:

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 2585332

Или я не в ту сторону плыву?

a_axe 16-12-2015 12:28 2585362

Цитата:

Цитата blackeangel
Поправте что не так? »

Цитата:

Цитата blackeangel
не знаю даже как описать то, что нужно сделать »

Оно и есть - Вы не сформулировали задачу. Ровно отсюда и выплывают все проблемы. Да еще подтвердили, что алгоритм должен делать следующее (а он вероятно совершенно не должен это делать):
Цитата:

Цитата a_axe
при условии что значение в ячейках "Наименование " также будет совпадать? »

Вот например в Вашем коде графа Наименование вообще не задействована. Сопоставлять судя по всему нужно строку "Обозначения".
Заниматься проверкой Вашего кода не имея сформулированной задачи - не самое разумное предложение.

Для начала все-таки сформулируйте задачу, что должна сделать программа, а уже потом давайте разбираться с кодом.

blackeangel 16-12-2015 12:48 2585373

Цитата:

Цитата a_axe (Сообщение 2585362)
Для начала все-таки сформулируйте задачу, что должна сделать программа, а уже потом давайте разбираться с кодом.

Специально для Вас чётко сформулированная задача: привязать все исполнения к основному,если таковое имеется без использования человека,или на крайний случай один клик(запуск макроса) в Эксель

Iska 16-12-2015 14:49 2585408

Цитата:

Цитата blackeangel
Специально для Вас чётко сформулированная задача »

a_axe, ну, вот, теперь и Вас посчитали :).

a_axe 22-12-2015 12:06 2587337

Цитата:

Цитата Iska
ну, вот, теперь и Вас посчитали »

...справка дана иностранцу с табурэткой)

Цитата:

Цитата blackeangel
Специально для Вас чётко сформулированная задача »

что все-таки должна делать программа я так и не понял, но раз Вы сами привели код, то из конструктивных предложений могу указать следующие независящие от алгоритма факты:

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

    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



Время: 07:59.

Время: 07:59.
© OSzone.net 2001-