<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.harlamenkov.ru/index.php?action=history&amp;feed=atom&amp;title=RU%2Fht%2F00000002</id>
	<title>RU/ht/00000002 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.harlamenkov.ru/index.php?action=history&amp;feed=atom&amp;title=RU%2Fht%2F00000002"/>
	<link rel="alternate" type="text/html" href="https://wiki.harlamenkov.ru/index.php?title=RU/ht/00000002&amp;action=history"/>
	<updated>2026-11-11T16:31:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://wiki.harlamenkov.ru/index.php?title=RU/ht/00000002&amp;diff=21891&amp;oldid=prev</id>
		<title>Sancho: /* Теоретическая база решения */</title>
		<link rel="alternate" type="text/html" href="https://wiki.harlamenkov.ru/index.php?title=RU/ht/00000002&amp;diff=21891&amp;oldid=prev"/>
		<updated>2012-04-05T05:36:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Теоретическая база решения&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 05:36, 5 April 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l99&quot; &gt;Line 99:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 99:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;section begin=signature/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;section begin=signature/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{SignTrans|RU||Александр Лбов}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{SignYear|Sancho||2012}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{SignYear|Sancho||2012}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;section end=signature/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;section end=signature/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{RUhowtoBottom}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{RUhowtoBottom}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sancho</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.harlamenkov.ru/index.php?title=RU/ht/00000002&amp;diff=21890&amp;oldid=prev</id>
		<title>Sancho: Основной текст</title>
		<link rel="alternate" type="text/html" href="https://wiki.harlamenkov.ru/index.php?title=RU/ht/00000002&amp;diff=21890&amp;oldid=prev"/>
		<updated>2012-04-04T19:28:21Z</updated>

		<summary type="html">&lt;p&gt;Основной текст&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;section begin=title /&amp;gt;&amp;lt;noinclude&amp;gt;{{DISPLAYTITLE:Инструкции: {{IopC|1}}. &amp;lt;/noinclude&amp;gt;Сортировка и фильтрация данных при помощи формул&amp;lt;noinclude&amp;gt;}}&amp;lt;/noinclude&amp;gt;&amp;lt;section end=title /&amp;gt;&lt;br /&gt;
{{BreadCrumbL10n|RU/documentation/how_tos/calc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{RUfromforum|21887}}&lt;br /&gt;
&amp;lt;section begin=toc /&amp;gt;&lt;br /&gt;
&amp;lt;!-- [[File:Ht00000000_01.png|360px|thumb|right|Рис. 1. Пример документа.]]--&amp;gt;&amp;lt;noinclude&amp;gt;__TOC__&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
== Задача ==&lt;br /&gt;
&lt;br /&gt;
{{Tip|Требуется отсортировать данные в таблице так, чтобы порядок сортировки сохранялся и после внесения изменений.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
&lt;br /&gt;
;Инструментарий: Для решения задачи потребуются:&lt;br /&gt;
:* функции '''COUNTA''', '''OFFSET''', '''SMALL''', '''LARGE''', '''MATCH''';&lt;br /&gt;
:* меню {{Menu|Данные|Фильтр}}, {{Menu|Найти и Заменить}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Шаг 1. Сортировка данных ===&lt;br /&gt;
&lt;br /&gt;
Простейший способ сортировки в {{IopC}} – использование пункта меню {{Menu|Данные|Сортировка}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, данный способ не сохраняет порядок сортировки после внесения изменений в таблицу. Для обхода проблемы необходимо применять формулы. Пример на первом листе ''«Automatic sorting»'' во вложении. На нём показана сортировка 20 строк, используются из которых только 16. Можно сортировать большее количество строк изменяя значение '''$21''', используемое в формулах, для большого числа ячеек удобно использовать меню {{Menu|Правка|Найти и Заменить}}, вставив формулы в неиспользуемые строки, выделив их маркером заполнения (под маркером заполнения понимается черный квадратик в правом нижнем углу активной ячейки). Сведения о маркере заполнения есть в Справке.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
У приведённого метода есть недостатки:&lt;br /&gt;
* Построение формул требует времени и определённой подготовки пользователя, нежели простое использование меню {{Menu|Данные|Сортировка}}.&lt;br /&gt;
* Необходимо сделать копию данных, потому что формулы не могут сортировать &amp;quot;на месте&amp;quot;, так что размер таблицы будет расти.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Использование формул для больших объемов данных не эффективно т.&amp;amp;nbsp;к. занимает много времени. С помощью меню {{Menu|Данные|Сортировка}} выполняется только один проход по таблице. Но формулы для каждой строки сортирует все 20 пунктов, а затем удаляет из них 19 (описание работы алгоритма в следующем абзаце). Таким образом, для 20 строк, выполняются 20 отдельных проходов. На современных ПК незаметна задержки на 20 строках, но представьте себе сортировку на 20&amp;amp;nbsp;000 строк, что предполагает 20&amp;amp;nbsp;000 проходов для каждой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Посмотрим, как работают формулы на листе ''«Automatic sorting»'' таблицы. Ячейка '''B2''' – счётчик ('''COUNTA'''), в котором хранится значение определяющее количество используемых ячеек в первом столбце. Колонка '''C''' содержит порядковые номера по возрастанию. Формула в столбце '''D''', проверяет не является ли пустой текущая строка в столбце '''A'''. Если строка пуста, то в текущую строку столбца '''D''' ничего не заносится. В противном случае, функция '''OFFSET''' выбирает 16 используемых элементов, затем функция '''SMALL''' выполняет сортировку и выбирает наименьшее значение для первой строки в столбце '''D'''. '''SMALL(…;1) = MIN(…)'''. В строке ниже, '''SMALL'''  снова выполняет сортировку и находит второе наименьшее '''SMALL(…;2)'''. Ячейка '''D17''' содержит наибольшее из 16  значений '''SMALL(…;16)'''. В столбце '''E''', с помощью функции '''LARGE''', выполняется обратная операция.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Шаг 2. Фильтрация данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Простейший способ фильтрации — меню {{Menu|Данные|Фильтр}}. Однако, здесь та же проблема — надо повторно фильтровать при изменении данных в таблице. Автоматизируем процесс с помощью формул. За примером идём на второй лист таблицы во вложении — ''«Automatic subset»''. Снова работаем с 20 ячейками, 16 из которых содержат значения. Если надо сортировать больше значений, используем тот же приём что и при сортировке ({{Menu|Найти и Заменить}}). При фильтрации формулы более эффективны, чем при сортировке.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Описание работы сортировки.&lt;br /&gt;
&lt;br /&gt;
Ячейка '''B2''' – счётчик ('''COUNTA'''), в котором хранится значение, определяющее количество используемых ячеек в первом столбце. В столбце '''C''' находится формула, определяющая применение фильтра для текущей позиции. В примере фильтруются нечётные значения, но можно использовать любые условия которые возвращают ''ИСТИНА/ЛОЖЬ''. Столбец '''D''' содержит номера позиций соответствующих условию ''ИСТИНА''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Посмотрим на адрес '''D5'''. '''D4=4''' определяет третье значение ''ИСТИНА'' в четвёртой строке (''61''). Функция '''OFFSET''' по адресу '''D5''' выбирает оставшиеся 12 значений из столбца '''С''' (''16-4''). Эти значения ('''С6-С17''') соответствуют значениям после '''61''' (''908-703'').  В {{IopC|1}} функция, возвращающая ''ИСТИНУ'', имеет значение ''1''. Функция '''MATCH''' ищет первое значение ''1'' в оставшихся 12 ячейках. В данном случае, это будет при третьей проверке ( ячейка '''C8'''). Таким образом, '''MATCH''' возвращает значение ''3'', и, при добавление к '''D4=4''', формула определяет позицию следующего значения ''ИСТИНА'' в седьмом пункте ('''С8''').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Формула в '''D12-D21''' возвращает ошибку, т.&amp;amp;nbsp;к. функция '''MATCH''' больше не находит значений ''ИСТИНА''. В столбце '''Е''' проверяется — была ли ошибке в столбце '''D''', и, при выполнении условия, строка остаётся пустой. В противном случае, функция '''INDEX''' выбирает позицию, определённую по столбцу '''D''' —  ''Е5'' выбрана седьмым пунктом ('''D5=7''') в столбце '''А''' (''897'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Шаг 3. Фильтрация и сортировка данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь объединим данные приёмы.&lt;br /&gt;
&lt;br /&gt;
Пример на листе ''«Automatic subset and sort»'' вложения. Обратите внимание, т.&amp;amp;nbsp;к. используется функция '''COUNTA''', в ячейке '''B2''' на первом листе, формулы не будут работать корректно, если какие-либо ячейки диапазона '''А2-А17''' пусты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если ваш список содержит пустые ячейки и вы хотите использовать формулы для динамической сортировки, используйте способ как на третьем листе и формулу '''NOT(ISEMPTY(…))''', как проверку в столбце '''С'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку это учебное пособие, листы таблицы во вложении содержат несколько столбцов для промежуточных расчётов. Это сделано для лучшего понимания принципов работы. В зависимости от ваших требований и мастерства, вы можете комбинировать формулы, используя меньше вспомогательных столбцов. Во вложении не используются формулы массивов&amp;lt;ref&amp;gt;{{SecTitle|RU/kb/module/calc/function/array}} &amp;lt;br /&amp;gt;[[Documentation/How_Tos/Using_Arrays]]&amp;lt;/ref&amp;gt;, но данный способ позволяет сортировать\фильтровать и с меньшим количеством вспомогательных столбцов (возможно даже без них), за счёт усложнения формул.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Без сомнения, есть много альтернативных методов написания этих формул. Можно указывать функцию '''OFFSET''' вместо '''INDEX''', используя другие параметры. Выбор  методов рассмотренных в руководстве, обусловлен их простотой для понимания и любовью автора к ним (о вкусах не спорят). Электронные таблицы позволяют использовать множество методов для достижения одной цели; поиск и выбор условия ''ИСТИНА'' в столбце '''С''' второго листа возможен и иным способом. Но данный пример протестирован и гарантированно работает. Выделение цветом на втором и третьем листах сделано условным форматированием для наглядного выделения  нечётных чисел. Таблица отлично работает и с форматированием по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Перед использованием данных методов в «промышленной» эксплуатации в них необходимо хорошо разобраться, в противном случае предпочтительно использовать стандартные методы из меню {{Menu|Данные|Сортировка}} и&amp;amp;nbsp;{{Menu|Данные|Фильтр}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Load|OOo_Sorting_and_Filtering_data_with_formulas.ods|OOo Sorting and Filtering data with formulas.ods}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Достоинства и недостатки ===&lt;br /&gt;
&lt;br /&gt;
;Недостатки: Повышенные требования к знанию и пониманию набора функций электронных таблиц; слабо подходит для объёмных таблиц.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Достоинства: Универсальность и независимость от изменения данных; многократное использование.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Теоретическая база решения ==&lt;br /&gt;
&lt;br /&gt;
* {{SecTitle|RU/kb/00000544}};&lt;br /&gt;
* {{SecTitle|RU/kb/00000698}};&lt;br /&gt;
* {{SecTitle|RU/kb/00000650}};&lt;br /&gt;
* {{SecTitle|RU/kb/00000744}};&lt;br /&gt;
* {{SecTitle|RU/kb/00000717}};&lt;br /&gt;
* {{SecTitle|RU/kb/00000649}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section end=toc /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section begin=signature/&amp;gt;&lt;br /&gt;
{{SignYear|Sancho||2012}}&lt;br /&gt;
&amp;lt;section end=signature/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{RUhowtoBottom}}&lt;/div&gt;</summary>
		<author><name>Sancho</name></author>
		
	</entry>
</feed>