Удаление (скрытие) строк по условию

макрос удалит на листе все строки, в которых содержится искомый текст:

(пример - во вложении ConditionalRowsDeleting.xls)

Sub УдалениеСтрокПоУсловию()
    Dim ra As Range, delra As Range, ТекстДляПоиска As String
    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ТекстДляПоиска = "Наименование ценности"    ' удаляем строки с таким текстом

    ' перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
        ' если в строке найден искомый текст
        If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
            ' добавляем строку в диапазон для удаления
            If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
        End If
    Next
    ' если подходящие строки найдены - удаляем их
    If Not delra Is Nothing Then delra.EntireRow.Delete
End Sub

Чтобы вместо удаления просто скрыть такие строки, замените строку

If Not delra Is Nothing Then delra.EntireRow.Delete

на
If Not delra Is Nothing Then delra.EntireRow.Hidden=TRUE


Расширенная версия этого макроса - с использованием UserForm для ввода искомого значения

(пример - в файле ConditionalRowsDeletingUsingUserform.xls)


Function ПоискСтрокПоУсловию(ByVal ТекстДляПоиска As String, Optional HideOnly As Boolean) As Long
    ' функция получает в качестве параметра ТекстДляПоиска (можно использовать символы * и ?)
    ' Если HideOnly = TRUE, то строки, содержащие в ячейках ТекстДляПоиска, скрываются,
    ' иначе (HideOnly = FALSE - по умолчанию) - удаляются
    ' Функция возвращает количество удалённых строк
    Dim ra As Range, delra As Range
    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ' перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
        ' если в строке найден искомый текст
        If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
            ' добавляем строку в диапазон для удаления
            If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
        End If
    Next
    On Error Resume Next: ПоискСтрокПоУсловию = delra.Areas.Count ' количество найденных строк
    
    If Not delra Is Nothing Then    ' если подходящие строки найдены - скрываем или удаляем их
        If HideOnly Then delra.EntireRow.Hidden = True Else delra.EntireRow.Delete
    End If
End Function


Ещё один вариант кода, позволяющего выполнять поиск (с последующим удалением или скрытием строк) сразу по нескольким условиям:

Sub УдалениеСтрокПоНесколькимУсловиям()
    Dim ra As Range, delra As Range
    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ' ищем и удаляем строки, содержащие заданный текст
    ' (можно указать сколько угодно значений, и использовать подстановочные знаки)
    УдалятьСтрокиСТекстом = Array("Наименование *", "Количество", _
                                  "текст?", "цен*сти", "*78*")
 
    ' перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
        ' перебираем все фразы в массиве
        For Each word In УдалятьСтрокиСТекстом
            ' если в очередной строке листа найден искомый текст
            If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
                ' добавляем строку в диапазон для удаления
                If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
            End If
        Next word
    Next
 
    ' если подходящие строки найдены, то: (оставьте одну из 2 следующих строк)
    If Not delra Is Nothing Then delra.EntireRow.Hidden = True    ' скрываем их
    If Not delra Is Nothing Then delra.EntireRow.Delete    ' удаляем их
End Sub

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

это просто - добавьте вложенное условие:

If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
if ra.Find("Северо-западный федеральный округ", , xlValues, xlPart) is Nothing then
If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
end if
End If

Еще вопрос по удалению. Мне нужно удалить строчки, допустим, "Центральный федеральный округ", "Приволжский федеральный округ", "Уральский федеральный округ", "Сибирский федеральный округ". И я для этого благополучно пользуюсь данным макросом, прописав строки, которые необходимо удалить. Затем замечаю что можно не прописывать эти Array, а сократить процедуру, прописав "*федеральный округ*", то есть, проставив звездочки. Прекрасно. Оптимизировали процедуру, подсократили текст. Но есть одна загвоздка. Мне нужно чтобы строчка "Северо-Западный федеральный округ" осталась. Как в данном макросе учитывать исключения? Ведь при данной процедуре эта строка тоже будет удалена.

Хорошо, спасибо. Кстати, идея с константой xlWhole лучше чем с константой xlPart. Даже если мне понадобится неточное соответствие для какой-то отдельной строчки, я могу просто приписать звездочку * для этой отдельной строчки и её этот макрос тоже удалит как надо.

Да, всё можно сделать. Оформляйте заказ (кнопка выше), прикладывайте примеры, опишите, что хотите получить, либо полистайте комментарии к данной статье, там есть ответы, которые помогут найти правильный путь. Кстати, ответ на Ваш предыдущий вопрос в комментариях тоже был.

Да, работает, благодарю. А подскажите, можно ли на основе данного макроса сделать немного другую процедуру - не удаление строк с заданным условием, а копирование строки с заданным условием. Например, чтобы строка "Северо-Западный округ" макросом вырезалась и помещалась повыше под строку "Российская Федерация". Вроде тоже простейшая операция, не пойму что заменить в процедуре.

Замените константу xlPart на xlWhole. В этом случае макрос будет искать точное соответствие Вашей фразе.

Но обратите внимание, что после работы макроса в стандартной форме Эксель "Найти" (Ctrl+f) будет стоять галочка "Ячейка целиком", если для повседневной работы она не нужна, то снимите ее.

Подскажите, пожалуйста. Удаление строк по условию в моем случае оказывает медвежью услугу. Есть следующие строки:

-Архангельская область:
-в том числе:
-Ненецкий авт. округ
-Архангельская область без автономных округов

Мне нужно удалить строку "Архангельская область". Но когда я её прописываю для поиска, то удаляет и строку с надписью "Архангельская область без автономных округов". Как задать точность в данном макросе, чтобы предотвратить удаление всех строк где встречается данная фраза?

Спасибо за ценные макросы и за помощь!)

Всё правильно у вас, - просто вы скопировали, но не указали, куда вставить

попробуйте написать последнюю строку макроса в таком виде:

If Not delra Is Nothing Then delra.EntireRow.Copy worksheets.add.range("a1") ' копируем, и вставляем на новый лист

Добрый день. Подскажите пожалуйста как скопировать, а не удалить строки в Вашем коде "поиск (с последующим удалением или скрытием строк) сразу по нескольким условиям". При этом что бы поиск значений велся по определенному столбцу. У меня получилось так! Подскажите что неправильно?
Sub qwe()
Dim ra As Range, delra As Range
Application.ScreenUpdating = False

Text = Array("qwe", "krt", _
"ghj")

For Each ra In Range("G2", [G15].End(xlDown))
For Each word In Text
If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
End If
Next word
Next

If Not delra Is Nothing Then delra.EntireRow.Copy
End Sub

Подскажите пожалуйста, как сделать, чтобы в макросе:
1) вылезла табличка с выбором нескольких данных (например четыре города)
2) выбираем (например) г. Самара и все строки где содержится этот текст остаются, остальные удаляются
Спасибо!

Добрый день. Подскажите пожалуйста, возможно сделать скрытие или удаление не строк, а столбцов.

Неправильно считает количество удаленных строк.

Большое СПАСИБО прямь ВЫ Выручили меня.

чтобы по точному совпадению искалось, - замените в макросе xlPart на xlWhole

очень большая просьба, вот какая штука мне нужно скрыть строки в которых сумма по 13 столбцу равна 0. я смог сделать выборку по 13 столбцу,но вот скрытие строк происходит не правильно. скрываются строки которые содержат цифру 0 (например 308), в то время как мне нужно сто бы только скрывались строки с конкретным числом - 0. СПАСИБО.

Готовый код не выложу, - но могу сделать под заказ.
Самый простой вариант (как вручную сделать):
в первом дополнительном столбце написать формулу, которая округляет время до ближайшей четной секунды,
во втором столбце - сцепить значение с округленным временем,
а в третьем доп столбце написать формулу =СЧЁТЕСЛИ()
А потом удалить все строки (применив автофильтр), где в третьем доп столбце значение больше 1

Здравствуйте,
У меня на одном колонке есть повторяющие значения, а на втором колонке есть время. Удаляю я повторящуе значки, только с условием если время не одинаковые, нужно искать и где есть +1 секунд разница и тоже удалит. Как можно это сделать ? Если можно готовый код выложите, Очень нужно, заранее спасибо.

Проблема не решена, - так этой проблемы не существует в данном макросе.
Если ничего не найдено, - то ничего и не удаляется.

Не понятно как решена проблема с удалением, если искомое значение не найдено. Как убрать ошибку? мозг кипит.

Здравствуйте. Не могу разобраться, что прописать в приведенном коде, чтоб строки перед удалением копировались не на новый лист, а определённый. К примеру на лист "Архив". Подскажите пожалуйста, если не трудно.

Подскажите пожалуйста как можно удалить во всём столбце числа, которые содержат более 3-х знаков

Здравствуйте, Дмитрий
Тут можно не макрос исправлять, а в дополнительном чтолбце написать формулу типа =СЧЁТЕСЛИ(), которая вычислит количество повторений значения в столбце А
И потом по этому доп столбцу включит автольфильтр, оставив только значения = 1 (макрос вообще не нужен)
С учетом правила по столбцу V - формула просто чуть сложнее получится

Добрый день!
Прочитал все коментарии в надежде найти подходящий вариант, но не нашел.
Ситуация следующая в столбце А несколько тысяч значений, которые хаотично повторяются т.е.
и т.д. в столбце V напротив этих значений бывают пустые ячейки.

A V
13 yes
13 yes
50 yes
11 yes
11
11 yes
42
41 yes

Можно ли переделать макрос так, что бы скрывались строки с одинаковым значением в столбце А, если в этих строках хоть одна ячейка в столбце V пустая?
Т.е. в моем примере скрыть все строки с 11 и 42, а 13, 50, и 41 оставить?

Здравствуйте, Антон.
Да, можно сделать, - но это будет совсем другой макрос
Можем сделать под заказ.

Здрасте, у меня проблема с удалением строк одинаковой высоты на листе. Можно ли вообще так сделать что бы макрос удалял строки одинаковые по высоте?

Антон, вместо ActiveSheet.UsedRange
можно указать конкретный диапазон, - например, Range("a1:f300")

Добрый день!
Все прочитал, но никак не понимаю как ввести диапазон поиска в Ваш макрос.

на листе имеется 3 таблицы по 300 строк с объединенными ячейками. нужно скрывать по значению.

Sub УдалениеСтрокСОбъединённымиЯчейками()
Application.ScreenUpdating = False ' отключаем обновление экрана
On Error Resume Next ' отключаем остановку при ошибке

ТекстДляПоиска = "0" ' удаляем строки с таким текстом

Do ' повторяем, пока есть ячейки с заданным текстом
ActiveSheet.UsedRange.Find(ТекстДляПоиска, , xlValues, xlPart).MergeArea.EntireRow.Hidden = True
Loop Until Err ' если возникла ошибка (ячейка не найдена) - останавливаемся
End Sub

Добрый день, а подскажите как удалить строки если в одном из столбцов есть содержание #Н/Д. Почему-то, если поменять текст из вашего примера на нужное мне значение, то макрос не работает.

Замените строку ТекстДляПоиска = "Наименование ценности"
на строку ТекстДляПоиска = [B4]

Здравствуйте!
прочитала все комментарии, но не нашла решения. очень далека от VBA и понятия не имею как подкорректировать код.
а вопрос в том, что мне нужно подправить, чтобы вместо константы "Наименование", была ссылка на ячейку B4, в которой из выпадающего списка будет выбрано значение?

Подскажите пожалуйста. Скрываю строки на листе1, нужно скрыть те же строки на соседнем листе2 автоматически.

Дмитрий, а вы пролистайте комментарии к статье, — там найдете решение (уже отвечал на этот вопрос)

Подскажите, а что изменить в коде, если надо искать в определённом столбце только? А удалять по прежнему строки.

Здравствуйте, Олег
Если готовы оплатить помощь, - оформляйте заказ на сайте, сделаем.
Если хотите бесплатно, - обратитесь на форумы по Excel

Удаление (скрытие) строк по условию. Кто поможет с таблицой консигнация скачал образец, дальше я чайник могу выслать фаил

Да - неудобное и неправильное решение. Про надстройку почитаю спасибо, и еще я не знаю как обращаться из макроса к данным на листах :( Нет ли на примете чего нибудь почитать на эту тему? Можно в ЛС.
И кроме того у меня, к сожалению, не дошли руки автоматизировать последние несколько % рутинной бредо-работы с этими документами (из того что можно автоматизировать:)), но надеюсь в ближайшее время сделаю.
Спасибо в любом случае.
Всех благ.

Илья, копировать каждый раз макрос в новый файл, - вам не кажется, что это неудобное / неправильное решение?

Для этого делают надстройку (файл Excel с макросами, скрытый лист с данными, кнопка на панели инструментов)
Запустили надстройку, - на панели инструментов появилась кнопка, - нажали её, макрос запустился и сделал что надо

Да, есть ограничение, похоже что 1024 символа.

Да, в большинстве случаев хранить какие-либо данные в коде бредово, однако в моем случае мне просто необходимо хранить массив именно в коде. С помощью одного макроса я обрабатываю много документов регулярно: мне удобно, что все что мне нужно содержится в коде и я просто копирую его в Excel и исполняю на листе. Если выносить значения на отдельный лист и работать с ними таким образом, то это добавит немало хлопот.
Так что придется в случае чего как-то использовать несколько массивов, или может быть вы мне подскажите как указывать элементы массива в несколько строк...

В любом случае спасибо большое!

Добрый день! Помогите, пожалуйста, написать код, если нужно удалить строки, содержащие отрицательные значения или 0 в диапазоне A9:F22.

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

Доброго времени суток.

Подскажите, как сделать проверку для скрытия строк не по значению, а по цвету ячейки в определенном столбце?
Ячейка окрашивается в черный цвет по условному форматированию или вручную.
Спасибо.

Илья, в VBA есть ограничение на длину строки кода
Сколько конкретно - не помню.
Код - явно не лучшее место для хранения массива значений. Правильнее их хранить на листе Excel (возможно, скрытом)

Спасибо огромнейшее! Обе ваши подсказки помогли решить проблему!

А вы не знаете почему у меня при вставке в Microsoft VB For Applications кода, большой массив искомых элементов подсвечивается красным и переноситься на 2ю строку?
Есть какое-то ограничение на максимальное кол-во элементов массива? Или длину строки?
Как в таком случае поместить в массив искомых элементов все которые нужны?

Спасибо еще раз!
С уважением, Илья

Здравствуйте, Илья.

у нас ведь есть проверка If Not range Is Nothing, которая должна бы не пускать в это условие если диапазон пуст

Ошибка возникает из-за того, что условие If Not hrange Is Nothing Then
распространяется только на первую строку (раскраска), а вторая строка выполняется в любом случае:

If Not hrange Is Nothing Then hrange.EntireRow.Interior.ColorIndex = 22   ' color
        hrange.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet

Правильно будет так:

If Not hrange Is Nothing Then 
  hrange.EntireRow.Interior.ColorIndex = 22   ' color
  hrange.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet
End If
 
If Not range1 Is Nothing Then 
  range1.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet
  range1.EntireRow.Delete 'delete
End If
 
' и т.д.

насчёт ошибки "Данная команда неприменима для несвязных диапазонов" — она возникает при копировании строк: range1.EntireRow.Copy
я бы поискал объединённые ячейки на проблемном листе
(обычно ошибка такая из-за объединённых ячеек)

если объединённых ячеек нет, - попробуйте такой вариант:
вместо

range1.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet

напишите
intersect(range1.EntireRow, range1.EntireRow).Copy Worksheets.Add.Range("a1")   ' copy to new sheet

Не факт что поможет, - но имеет смысл попробовать

Здравствуйте, Игорь!

Я продолжаю использовать и кастомизировать ваш супер-макрос, сейчас у меня уже вариации на 200 строк, поэтому еще раз выношу глубочайшую благодарность и признательность за его публикацию в паблике и поддержку пользователей.

Ну и естественно, как у человека далекого от VBA и от понимания объектной, и вообще какой-либо, модели excel документа, у меня возникли очередные трудности на этот раз почти мистического характера, когда кажется что 1000% должно работать, но нет.

В общем, самая критичная проблема такая - ваш исходный макрос я привел к следующему виду:

Sub SearchForRows()
    Dim ra As Range, range1 As Range, range3 As Range, range4 As Range, hrange As Range
    Application.ScreenUpdating = False    ' turn off screen updating
'
    Search1 = Array("*element1*", "*element2*")
    Search2 = Array("*element3*", "*element4*")
    Search3 = Array("*element5*", "*element6*")
    Search4 = Array("*element7*", "*element8*")
'
    HSearch = Array("*element9*", "*element10*")
'   
    For Each ra In ActiveSheet.UsedRange.Rows
       For Each word In HSearch
           If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
               If hrange Is Nothing Then Set hrange = ra Else Set hrange = Union(hrange, ra)
            End If
        Next word
    Next
'       
    For Each ra In Intersect(ActiveSheet.UsedRange, Range("D:D")).Rows
        ' seach for each element of massive
       For Each word In Search1
            ' if found the text...
           If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
                ' add this row to our set
               If range1 Is Nothing Then Set range1 = ra Else Set range1 = Union(range1, ra)
            End If
        Next word
    Next
	For Each ra In ActiveSheet.UsedRange.Rows
        ' seach for each element of massive
       For Each word In Search2
            ' if found the text...
           If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
                ' add this row to our set
               If range1 Is Nothing Then Set range1 = ra Else Set range1 = Union(range1, ra)
            End If
        Next word
    Next
    For Each ra In ActiveSheet.UsedRange.Rows
        ' seach for each element of massive
       For Each word In Search3
            ' if found the text...
           If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
                ' add this row to our set
               If range3 Is Nothing Then Set range3 = ra Else Set range3 = Union(range3, ra)
            End If
        Next word
    Next
    For Each ra In ActiveSheet.UsedRange.Rows
        ' seach for each element of massive
       For Each word In Search4
            ' if found the text...
           If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
                ' add this row to our set
               If range4 Is Nothing Then Set range4 = ra Else Set range4 = Union(range4, ra)
            End If
        Next word
    Next    
'
    If Not range4 Is Nothing Then range4.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet
	range4.EntireRow.Delete 	'delete
'	
	If Not hrange Is Nothing Then hrange.EntireRow.Interior.ColorIndex = 22   ' color
	hrange.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet
'
	If Not range1 Is Nothing Then range1.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet
	range1.EntireRow.Delete	'delete
	If Not range3 Is Nothing Then range3.EntireRow.Copy Worksheets.Add.Range("a1")   ' copy to new sheet
	range3.EntireRow.Interior.ColorIndex = 30   ' color
End Sub

Тут я привел его условно - заменив для большей наглядности содержимое и названия массивов и объектов Range.
Как видите из кода, идея такова: из относительно не маленьких таблиц (1000+ строк на 13 столбцов) классифицировать данные в зависимости от наличия в строках тех или иных значений и скопировать на новый лист (либо с удалением с исходного либо нет).

Так вот проблема заключается в том, что на одном листе этот макрос работает безупречно, а на другом листе - где отличаются только значения в таблице (формат и модель точно такая же) - я получаю ошибку "Данная команда неприменима для несвязных диапазонов", при нажатии кнопки Debug мне подсвечивает строку:
If Not range1 Is Nothing Then range1.EntireRow.Copy Worksheets.Add.Range("a1") ' copy to new sheet
В макросе отличается ТОЛЬКО содержимое массивов и название переменных, а на листе (как я уже говорил) ТОЛЬКО значения - и вот в одном случае все работает, а во втором такая ошибка.
Я и гуглил и сравнивал рабочий и не рабочий макрос с помощью https://www.diffchecker.com/.. И ничего...
У меня уже мозг близок к тому чтобы начать выходить через уши...

Второй вопрос менее критичный, но не менее абсурдный как по мне: на той же самой команде с копированием найденного Range я получаю ошибку "Object required" или "Object variable or With block variable not set", в случае если на листе не было найдено значения необходимого для записи в этот Range. И тут я не понимаю: у нас ведь есть проверка If Not range Is Nothing, которая должна бы не пускать в это условие если диапазон пуст, но почему то этого не происходит.

И еще одно уточнение-вопрос: в предыдущем ответе на мой вопрос в последнем блоке условий, вы указали что надо дописывать End If, но если я его использую то получаю ошибку компиляции - "End If without block If", хотя в отдельном случае без использования End If я получил ошибку "Block If without End If" и добавление End If'а к каждому блоку If Not решает проблему. Короче, тоже мистика...

В общем, очень надеюсь на какую-либо помощь по моим вопросам.

С уважением,
Илья

Спасибо огромнейшее еще раз!
ps: Понятия не имею откуда там взялось = True (wasntme) :)

Здравствуйте, Илья.

Во-первых, не надо вносить в макрос лишние коррективы
Зачем вы дописали = True после Delete?
Вот не дописали бы - всё бы работало:

If Not spamrange Is Nothing Then 
  spamrange.EntireRow.Copy Worksheets.Add.Range("a1") ' copy to new sheet
  spamrange.EntireRow.Delete ' delete
End If

по второму вопросу, насчет столбцов, - уже был ответ в комментариях.
Вместо строки

For Each ra In ActiveSheet.UsedRange.Rows

напишите что-то вроде
For Each ra In intersect(ActiveSheet.UsedRange, range("B:F")).Rows

Здравствуйте,

Появилось еще 2 вопроса по вашему замечательному макросу, очень надеюсь вы мне поможете:
1. Как сделать чтобы в случае, если условие является истинным (искомое значение найдено), выполнялось два действия - например, скопировать на новый лист и удалить с текущего?
Пробую банально сделать 2 строки так:
"
If Not spamrange Is Nothing Then spamrange.EntireRow.Copy Worksheets.Add.Range("a1") ' copy to new sheet
If Not spamrange Is Nothing Then spamrange.EntireRow.Delete = True ' delete
"
или так:
"
If Not spamrange Is Nothing Then spamrange.EntireRow.Copy Worksheets.Add.Range("a1") ' copy to new sheet
spamrange.EntireRow.Delete = True ' delete
"
Вылетает ошибка
"Run-time error '424':
Object required"
Если нажать Debug макрос выполняется, но вылетает на второй строчке.
2. Как ограничить область поиска несколькими столбцами?

Очень надеюсь на помощь!
Заранее премного благодарен!

Здравствуйте а можно сделать так чтобы условие распространялось в отдельных ячейках например D2,G5,F6

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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