Страницы: 1
RSS
Импорт данных из динамического массива с автоматической подстройкой формул вычислений и диалоговыми сообщениями.
 

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

Итак, на моей "славной" работе руководство, видимо посчитав, что я за зря ем "хлеб" фирмы поручило мне наряду с моей непосредственной работой (вообще я специалист договорных отношений, т.е. юрист) в нагрузку одно довольно "геморройное" занятие. А именно - теперь я еще должен проверять (контролировать) сдачу графиков посещений нашего обслуживающего персонала среди Клиентов компании. Всё это дело ведется в Эксель 2003. Обилие ручной работы при этом контроле меня "убивает". Естественно никого не заботит как я это буду делать, хотя по хорошему здесь нужен толковый "прог" на уровне  VBA. Но это не реально, ему же надо платить зарплату, а мне можно не платить. Ну вот, пожалился... вроде полегчало...

Итак суть. Есть обслуживающий персонал - специалисты. У каждого спеца есть свои Клиенты. Спецы обязаны еженедельно заполнять в Эксель График посещений Клиентов. То есть, книга (файл) содержит листы. Один из листов содержит Плановый график, а другие листы - текущие графики. Моя задача проверить достоверность всех графиков (Плановый и текущие). Я додумался создать некий шаблон с правилами, и при импорте данных из графика специалиста в мой шаблон правила "подсветят" косяки, если таковые имеются. Прилагаю свой подопытный образец. Первый лист "План" - это и есть проект шаблона (по сути лист Получатель данных). Далее листы содержащие графики специалистов (листы Источники данных). График представляет собой две таблицы (верхняя и нижняя). Условно верхняя таблица называется "Плановый на март", нижняя - "Дополнительные визиты". Обе таблицы разделены на 5 дней недели. Здесь по тексту я решил, что диапазон строк и столбцов в таблице в границах одного рабочего дня назвать микромассивом. То есть, в каждой таблице есть 5 микромассивов: понедельник, вторник, среда, четверг, пятница. Скажем так, верхняя таблица (Плановый на март) является Первичной, нижняя таблица (Дополнительные визиты) - вторична и задействуется для обработки макросом только при условии наличия обоюдных связей в формулах по столбцу "Н". Пример итогового результата - кнопка Пятница. Если связи нет, то макрос обрабатывает только верхнюю таблицу Пример итогового результата - Все кнопки с понедельника по четверг. Я уже сделал кучу кнопок с макросами для импорта данных из листа Источника в лист Получатель. Разумеется пользовал макро рекодер  В результате макросы примитивны и корректно работают только при фиксированном и неизменном размере массивов на листе Источнике, а это невозможно. Более того не исключено и небрежное форматирование таблицы самим специалистом (где то есть пустые строки, или разрыв формул). Предполагается, что массив на листе Источнике будет динамичным, т.е. количество строк внутри дня недели не лимитируется и м.б большего либо меньше чем в примере. Нужен умный "макрос" чтобы он умел выделять на листе Источнике только тот диапазон массива (микромассив), который относится к конкретному дню недели. Очевидно, что необходимо задать границы микромассива на листе Источник по некоторым условиям. Для наглядности конечного результата можно понажимать мои кнопки. Так кнопки "понедельник", "вторник" и т.д. на листе Источник выделяют нужные микромассивы и копируют их в заданные диапазоны на лист Получатель. Замечу, что для простоты на листе Получателе предполагается, что размер микромассивов (диапазон строк и их количество) фиксирован и число строк постоянно (26 строк на один день, микромассив).  Это избыточно, но зато, на мой взгляд, упрощает импорт данных и не нужно беспокоиться о размере микромассива на листе Источнике. Вряд ли будет ситуация, где количество строк в источнике на один день превысит значение 26.

Кнопка DeleteData - очищает мой шаблон (лист Получатель) от старых данных. Кнопка "Все рабочие дни" запускает поочередно все макросы начиная с понедельника по пятницу.

По умолчанию на листе Получатель в столбце "H" в каждой первой ячейке микромассива указывается значение "8:45" - это отправная точка отсчета времени. Начиная с каждой второй ячейки микромассива и по последнюю строку (понедельник H6:H30, вторник H32:H56, среда H58:H82, четверг H84:H108, пятница H110: H134) забита формула на прирост рабочего времени. В самом простом случае предполагается, что формулы по столбцу "H" на листе Получателе недолжны изменяться, то есть макрос их "не трогает".  Для наглядности: в результате работы макроса на листе Источник должны быть корректно выделены и скопированы 5 микромассивов с несмежными диапазонами из верхней таблицы. В примере получается, что несмежные диапазоны понедельника - C5:G12 и I5:J12, вторника -  C16:G28 и I16:G28, среды - C29:G40 и I29:J40, четверга -  C41:G50 и I41:J50, пятницы - C51:G61 и I51:J61.

Я определил два основных условия определения границ микромассива и одно дополнительное условие для определения относимости данных (какие данные можно отнести к понедельнику, вторнику, среде, четвергу и пятнице):

1. Условие. Думаю, что в моем примере верхней границей микромассива на листе Источник должна быть каждая строка, где в столбце "Н" содержится значение времени "8:45". Именно это значение указывают все специалисты вначале своего дня. К другим критериям привязаться проблематично. Например, столбец "А" содержит текстовые значения - понедельник, вторник, среда, четверг, пятница по всему своему диапазону (в пределах обеих таблиц, конечно) и логичнее было бы привязать верхнюю границу к ячейке с текстом понедельник, вторник и т.д.. Однако, в результате небрежного форматирования, ячейка с днем недели может быть выше или ниже строки со значением "8:45" по столбцу "H"  (начало рабочего дня), что приведет к неправильному определению верхней границы микромассива. Обратите внимание на лист Источник, в верхней таблице - вторник (пример небрежного форматирования). В тоже время нужно чтобы макрос определял верхнюю границу микромассива именно по первому встретившемуся значению "8:45", которое вводится вручную. На примере образца на листе Источник в четверг первым значением "8:45" макрос должен считать ячейку "H41", а не ячейку "H42". Не знаю имеет ли это значение для дела, но предполагается, что в графиках в столбце "H" в первой строке микромассива (это начало дня) всегда значение равное "8:45" специалист выставляет вручную, это не результат вычислений формулы. В итоге значение "8:45" введенное вручную в столбце "H" - это верхняя граница каждого микромассива.

2. Условие. Нижняя граница микромассива должна определяться строкой, которая содержит группу формул. Например, в понедельник эта группа формул содержится в строке 12 (диапазон N12:Q12). Опять же, если это имеет значение для дела, то указанная группа формул (суммы по столбцам) в каждом микромассиве повторяется и, конечно, при изменении числа строк внутри микромассива динамически изменяется диапазон вычислений внутри этих формул.

3. Условие.  Соответствие дня недели Источника и Получателя. Иногда рабочая неделя состоит из трех дней.  На примере образца - лист 3. Необходимо чтобы макрос на листе Источник скопировал данные по оставшимся микромассивам (у нас это среда, четверг, пятница) и результат помещался на листе п

Получатель в соответствующий диапазон. В нашем примере с листа Источника данные со среды должны перейти на лист получатель также в среду, четверг в четверг ну и пятница в пятницу. Полагаю, что здесь каким то образом необходима проверка условия на наличие текстового значения в диапазоне столбца "A". То есть, макрос должен проверить - какое текстовое значение он найдет в диапазоне микромассива (между верхней строкой и нижней строкой) по столбцу "А".  Если в заданных диапазонах по столбцу "A" он найдет "понедельник", то весь микромассив, в границах которого нашлось это слово он должен скопировать соответственно в лист Получатель, в начало диапазона Понедельник. И так далее. В случае если на листе Источнике обнаружится микромассив, который не имеет в столбце "А" текста "понедельник", "вторник", "среда", "четверг", "пятница", то необходимо чтобы макрос выдал сообщение что-то типа: "Не могу определить вторник". А в случае, если специалист ошибочно по столбцу "А" в пределах одного дня указал два и более текстовых значения (например, понедельник и вторник) то необходимо сообщение что то типа "Не правильно задан день недели".

Написано очень много, даже страшно продолжать. Но если у кого-то хватило терпения, мне остается только благодарить этого человека и надеяться, что будут предложены варианты. Итак я уже делал оговорку, что в самом простом случае макрос обрабатывает только верхнюю таблицу. В более сложном варианте (посмотрите Пятницу) предполагается, что макрос должен определить по связям в формулах (если такое вообще возможно)  по столбцу "Н" наличие дополнительных данных в нижней таблице "Дополнительные визиты" и также аккуратно выделить обнаруженный диапазон и скопировать его в лист Получатель тоже в нижнюю таблицу. При этом макрос должен внести соответствующие изменения на листе Получатель в те формулы, о которых я раньше говорил, что они  не должны изменяться макросам в простых случаях. Если нажмете на кнопку "Пятница" то вы сможете увидеть, что из-за несогласованности формул результат вычислений по времени в столбце "Н" на листе Получателе не верный. То есть при переносе данных он (макрос) должен на листе Получателе (План) привести в соответствие формулу с той же логикой вычислений как на самом листе Источнике данных. Опасаюсь, что мой трактат "трещит" по швам. Дополнительные текстовые пояснения содержатся непосредственно в самом файле на первом листе (Получатель). Друзья понимаю, что многого хочу, но надеюсь, что возможно проект удастся воплотить в жизнь, если Вы примите свое участие хотя бы по кусочку. Возможно вместо одного большого макроса можно сделать много маленьких. Например был бы рад маленькому макросу как определить и выделить микромассив "понедельник" для последующего копирования на лист Получатель. По аналогии сделаю макросы для других дней, если одним макросом сразу на все дни сделать сложно.

В любом случае спасибо всем, кто потратил своем время и дочитал до конца. Уповаю на Вас и внемлю  .

Изменено: Excelman - 26.03.2017 18:01:51
 
Вы не ошиблись веткой? Для ТЗ у нас есть раздел Работа. А здесь Правила:
Цитата
2.6. Один вопрос - одна тема. Не следует в открываемой теме обозначать и задавать сразу несколько вопросов.
Я сам - дурнее всякого примера! ...
 
Цитата
Excelman написал: предложены варианты
Именно вариант.
Отказаться от формул и все вычисления, проверки нужных условий и прочие 'обоюдные связи' перенести в код.
И, думаю, что вместо этих многобукв, лучше написать ЧТО нужно сделать, какую ЗАДАЧУ Вам поставило начальство, а не то КАК Вы пытаетесь ее решить. Обычными словами, без 'микромассивов' и прочего VBA.
И в файле показать побольше данных, в виде Как есть - Как надо
Но, ИМХО, это не КОНКРЕТНЫЙ вопрос, а комплексная задача, и она для платного раздела. ИМХО
Согласие есть продукт при полном непротивлении сторон
 
Excelman, переносить в платный раздел?
 
Юрий М, если можно, давайте еще подождем хотя бы день. Я и не ожидал что будет чудо. Однако в ответ Sanja, на  
Цитата
И в файле показать побольше данных, в виде Как есть - Как надо
куда уж больше. Все данные представлены как есть и пояснения в целый трактат  "как надо".
 
Цитата
Excelman написал: и пояснения ....  "как надо".
не надо 'пояснений', надо показать в файле нужный результат
Согласие есть продукт при полном непротивлении сторон
 
Уважаемый Юрий М,, Благодарю Вас, что пока позволили этой теме жить. Я с уважением принимаю мнение kuklp, , о том, что следовало бы обратиться в другую ветку, Действительно, подумав еще раз я соглашусь с Вами. Мне представляется справедливым,, что слишком уж много вопросов  я задал в данном посте. Также согласен и с Sanja, - Вы правы - нужна конкретика по вопросу. Если модератор Юрий М, , позволит я бы хотел  взять маленький таймаут - до конца этой недели хотябы. Как раз сейчас меня "нагрузили по полной" этими графиками. Пока не до макроса. Приходится, что говорится, вручную заглядывать в каждую ячейку. То есть для меня эта тема очень актуальна. Как только немного разгребу это дело планирую выложить свой вариант макроса по выделению массива по условию  для совместного обсуждения.  
 
Итак, я пока вижу начало решения вопроса по своему макросу через поиск в столбце "N" на листе "ИвановПлан" ячейки, которая содержит формулу вида СУММ(I(n);I(x)), где n-верхняя строка диапазона, x - нижняя строка. Нашел здесь же на форуме  образец для подобного макроса. Вот что у меня получилось.
Код
Sub poiskformul()
'объявляем 2 переменные
Dim Rng As Range, iFormula As Variant

'присваиваем значение "сумм" переменной iFormula
iFormula = "сумм"

'осуществляем поиск
Set Rng = Sheets("ИвановПлан").Columns("N:N").find(What:=iFormula, LookIn:=xlFormulas, LookAt:=xlPart)

'если ничего не нашли, то выводим сообщение
If Rng Is Nothing Then
MsgBox "Значение " & iFormula & " не найдено в столбце N на листе ИвановПлан", vbExclamation, "Ошибка"
Exit Sub
End If
'если нашли, то
Sheets("ИвановПлан").Activate 'активируем ИвановПлан
Rng.Select 'выделяем ячейку с найденным значением

End Sub

В результате задумывалось, что макрос будет искать текст "сумм" внутри формул по столбцу "N". К сожалению ничего не находит и выводит диалоговое окно MsgBox
"Значение сумм не найдено в столбце N на листе ИвановПлан". Решил записать поиск текста сумм по формулам макрорекодером. В итоге в интерфейсе Эксель через вызов Ctrl+F с параметрами (Найти: сумм; Искать: на листе; Просматривать: по столбцам; Область поиска: формулы) по столбцу "N" все-таки находится искомая ячейка. (в моем файле примере это первая ячейка от начала таблицы "N12"). Однако полученный после записи макрос отказывается повторить поиск. VBEditor выдаут ошибку. Вот результат записи:
Код
Sub FindFormula()

    Range("N1").Select
    Cells.find(What:="сумм", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
End Sub

Помогите разобраться и подправить макрос, чтобы он искал "сумм" по формулам в столбце "N". Заранее спасибо.

Изменено: Excelman - 31.03.2017 23:43:04
 
можно так для вашей структуры данных
Код
Sub ancorMergedCells()
With ThisWorkbook.Sheets("План")
fr = 5
lr = .Cells(.Rows.Count, "G").End(xlUp).Row
For i = fr To lr
    If InStr("понедельник|вторник|среда|четверг|пятница", .Cells(i, 1).Value) <> 0 Then
        Set rnn = .Cells(i, 1).Offset(0, 13)
            adr = rnn.Address
            fx = rnn.FormulaR1C1
            vv = rnn.Value
                If rnn.FormulaR1C1 Like "=SUM*" Then
                    Debug.Print "ячейка " & adr & " содержит формулу " & fx & " результат вычислений=" & vv
                End If
        i = rnn.Row
    End If
Next
End With
End Sub
результат отработки см. в VBEditor - в окне Immediate (если его нет - включить через View - Immediate Window)
Изменено: JeyCi - 01.04.2017 08:29:20
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
но у вас в корне странный подход к реализации...
напишите (БЕЗ ваших чувств) что есть и что надо
и по пунктам ваш алгоритм
(это будет оптимальный вариант для постановки вопроса о том, на каком шаге у вас проблема ИЛИ вам лучше менять алгоритм)
я вне темы ввиду актуальности #2...
+1
Цитата
Sanja написал: какую ЗАДАЧУ Вам поставило начальство
:) начальство вам, наверно, выразилось более кратко, чем вы нам... берите с них пример  
Изменено: JeyCi - 01.04.2017 08:20:23
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi,
Цитата
начальство вам, наверно, выразилось более кратко, чем вы нам... берите с них пример
Вы даже не представляете насколько кратко. - "Шоб  бЫло как НАДА!"
А макрос Ваш обмозговываю. Спасибо за участие JeyCi,
 
Цитата
Excelman написал: макрос будет искать текст "сумм" внутри формул по столбцу "N".
по вашему коду (синтаксис всё равно надо править) - итог будет: остановится как только найдёт...
если нужны все (ячейки с такой формулой по столбцу), то по вашим строкам ещё надо внедрять FindNext метод - примеры его использования были на форуме...
Изменено: JeyCi - 01.04.2017 08:46:38
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Еще раз спасибо за помощь, уважаемый JeyCi, Пока исследую результат работы Вашего макроса. Что то очень близкое к тому что мне нужно. Однако если вернуться к Вашему замечанию
Цитата
по вашему коду (синтаксис всё равно надо править) - итог будет: остановится как только найдёт...
Пожалуйста, если не затруднит, помогите исправить синтаксис на правильный.
 
Цитата
Excelman написал:  уважаемый  JeyCi ,
написано ведь у меня в подписи  :evil:  - да не склоняйте вы людей, когда понятия не имеете с кем разговариваете...
по просьбе - нет, не трачу время на то, в чём не вижу оптимальности решения  8-0... вы на мои замечания тоже отреагировали выборочно - только те, что понравились... хотя более важные - по постановке вопроса и алгоритму... я вне темы  
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, Простите не хотел Вас обидеть. Мне всегда представлялось, что все на форуме "участники", а потому - "Уважаемый участник". Но вероятно Вы правы. Еще раз извините за неосторожное обращение. Впредь буду осторожнее.
 
На счёт остального...
Цитата
вы на мои замечания тоже отреагировали выборочно - только те, что понравились... хотя более важные - по постановке вопроса и алгоритму... я вне темы
Я пока до конца сам алгоритм не продумал, но похоже Вы "приперли" меня к стенке, деваться некуда излагаю как есть иначе Вы потеряете интерес к теме, а это мне совсем "не на руку". Итак, я пытаюсь научить макрос выделять нужный диапазон данных на листе2 (в моем случае Лист "ПланИванов") и переносить результат на первый лист (План) методом копирования. Известно, что на Листе "ПланИванов" нужный диапазон всегда строго ограничен столбцами "B:J". Не постоянно только количество строк. Поэтому на листе  "ПланИванов" я пытаюсь задать поиск по столбцу "N" первой встретившейся ячейки, которая содержит формулу вида СУММ (I(n);I(x), где n - это номер верхней строки диапазона по расчету формулой СУММ, а x - нижняя. По сути, по аргументам формулы СУММ я и пытаюсь определить  номера строк, которые ограничивают искомый мной диапазон.  И когда на листе "ПланИванов" специалист решит, например, вставить дополнительную строку внутри диапазона, скажем, "понедельник", то в итоговой ячейке с формулой СУММ (той что относится к понедельнику) количество строк (их номера) через аргументы n и x естественным образом изменится, тем самым обеспечивается, что при следующем запуске макроса он подстроится под изменившийся диапазон по строкам. Теперь, после того как диапазон нужных данных определился, макрос должен проверить на этом же листе по столбцу "А" наличие следующих текстовых значений (Понедельник, вторник, среда, четверг, пятница). Например, макрос нашел в столбце "A"  понедельник., затем определяет номер строки, где нашел это значение, сопоставляет с ранее определенным диапазонам строк и если номер строки (в которой есть ячейка с текстом "понедельник") находится в соответствующем диапазоне строк (тот, что мы определяли первым делом), копирует этот диапазон на лист1 (План) в соответвующие ячейки, а именно, если это понедельник, то первая ячейка, куда будут вставляться данные из найденного диапазона будет "B5" на листе "План". Вот, как-то так в упрощенном виде я себе это представляю.  
Изменено: Excelman - 01.04.2017 11:20:16
 
Опять многобукв! Вы покажите уже когда нибудь желаемый результат?
Что бы помочь Вам, нужно знать ЧТО нужно сделать.
Не Ваше видение порядка выполнения задачи, а конечный результат. И не словами, а наглядно, в таблице.
Представьте что у Вас нет Excel'я. Даже компьютера.
Лист бумаги, карандаш, линейка. Начертите таблицу на листе и заполните ее руками. Покажите здесь нужный результат
Согласие есть продукт при полном непротивлении сторон
 
И еще представьте, что больше 10 строк писать не умеете )
 
В итоге снова прикрепляю файл. Конечный Результат на первом листе - "План". Прошу Вас, пожалуйста обратите внимание, что в файле образце на первом листе "План" есть кнопки с днями недели. Нажимаешь например понедельник и макрос данные со второго листа пересылает на первый лист. Это и есть наглядный результат.  Вопрос в том, что диапазон искомых строк на втором листе будет не постоянен, а мой макрос не умеет подстраиваться под динамический диапазон.  
 
Если в сводном листе (План) в разделе соответствующего дня уже есть данные, что с ними делать? Заменять или новые данные вносить под ними?

P/S/  Если бы сразу просто спросили - Как скопировать динамический (изменяющийся) диапазон на другой лист? - уже наверняка-бы решение получили  :D
Развели здесь графоманию
Согласие есть продукт при полном непротивлении сторон
 
Sanja, Предполагается, что перед началом работы макроса лист План будет очищен - кнопочка DeleteData покажет результат очистки. То есть перед импортом данных предстоит очищение соовтетсвующих диапазонов на листе План
Изменено: Excelman - 01.04.2017 17:31:42
 
как я понял, нужно копировать диапазоны за каждый день недели с листа  ивановплан на лист план. понедельник начинается с а5 и до строки с формулами (=СУММ(M5:M12))). в примере щас а5:Q12. вторник начинается со следующей строки(в примере почемуто со строки 17). другие дни также начинаются со следующей строки после строки с формулой сумм. вставлять на лист план, как я понял, после имеющихся данных. еще как то править формулы в столбце н. скорее всего так.
вставка, оказывается, вместо имеющихся данных.
Изменено: copper-top - 01.04.2017 17:40:11
 
copper-top, почти всё так. Кроме
Цитата
в примере щас а5:Q12
верно будет A5:M2. В свою очередь диапазон N12:M12 я предлагаю  использовать как условие по которому можно определить количество строк для динамического диапазона. Аргументы формулы СУММ при вставке строк будут соответственно меняться автоматом.

Цитата
copper-top написал:
вторник начинается со следующей строки(в примере почемуто со строки 17).
это пример криворукого форматирования - человеческий фактор. Об этом я долго и нудно писал в начале поста и если ориентироваться по ячейке N28 , то есть вторник будет с 16 по 28 строку
на счет формул по столбцу Н. Я решил на листе План этот столбец не трогать. То есть формулы там постоянны и в него ничего не предполагается копировать. То есть при выделении диапазонов на ИвановПлан хотелось бы как то предусмотреть копирование не смежных диапазонов B:G и I:J и L:M,  т.к. формулы из столбца H с листа ПланИванов не должны копироваться  (во избежание кривового редактирования специалиста)
Изменено: Excelman - 01.04.2017 17:52:55
 
Я бы это делал на именованных диапазонах.
Согласие есть продукт при полном непротивлении сторон
 
Боюсь, что на исходниках именованных диапазонов не будет.   По сути лист ИвановПлан -это исходник который был скопирован из книги, котрую заполняет тот или иной специалист. Каждый специалист ведет свой отчет (свой файл). Вряд ли удастся внедрить требования по созданию именованных диапазонов на весь штат специалистов.  
Изменено: Excelman - 01.04.2017 19:44:46
Страницы: 1
Читают тему
Наверх