Копирование ячейки после автофильтра.

Автор Алексей Ч, 11 марта 2021, 22:00

0 Пользователи и 1 гость просматривают эту тему.

Алексей Ч

Добрый день!

Прошу помочь.

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

Вторая таблица - таблица результатов.
Своими ячейками она должна быть привязана к результату фильтрации таблицы данных.

Т.е. если в таблице данных после фильтрации видимой осталась одна строка, несколько ячеек этой строки появляются в таблице результатов.
Если после фильтрации получили видимыми несколько строк, то в таблице результатов значения появляются в соответствующем количестве строк.

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

Поискал функции, но тщетно.

Заранее спасибо.






eeigor

#1
Стандартный и расширенный фильтры, в отличие от автофильтра, позволяют скопировать результат в указанное место. И тогда вся задача надуманна.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

economist

Макрос, скажем, по кнопке  может перебрать результат фильтрации (видимые строки), например это строки 2,5,7 и создать на второй таблице в другом листе
формулы в строках 1,2,3 виде
=Лист1!A2, =Лист1!B2, =Лист1!C2
=Лист1!A5, =Лист1!B5, =Лист1!C5
=Лист1!A7, =Лист1!B7, =Лист1!C7

Это не сложно, но почему просто не скопировать результат фильтрации?
Будет правка столбцов B/C? Тогда формулы будут заменены на значения.
А что должно быть при смене фильтра?  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

kompilainenn

Мне кажется, что решение задачи через фильтрацию не верное в принципе. Лучше покажите, что за данные (просто пример), и что в итоге вы из них хотите сделать/увидеть? Возможно есть более автоматизированное решение
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

eeigor

#4
Я тоже ничего не понял. Но если автор хочет работать с пересечением диапазонов, то для этого предусмотрен соответствующий синтаксис, а не формула:
=5:5!A:A
И в заданную ячейку ляжет значение ячейки, находящейся на пересечение строки 5 со столбцом A (как у автора). Восклицательный знак означает пересечение.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#5
Цитата: Алексей Ч от 11 марта 2021, 22:00По сути, нужно сделать ссылку не на адрес ячейки, а на определенную область листа...
Э, нет... Так не получится, потому что данные при фильтрации автофильтром остаются на своих местах, а не переносятся в некую отфильтрованную область.

UPD
Так что стандартным/расширенным фильтром. Если нужна не вся строка, а определенные ячейки, то "ненужные" столбцы из источника данных нужно в соответствии с порядком их следования просто скрыть в результирующем диапазоне. "Ненужные" данные лягут в скрытые столбцы, но строки будут скопированы полностью.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Алексей Ч

Пример 1.
После фильтрации в таблице данных три строки.

Таблица данных                  Таблица результатов         
                           
Иванов   1   2   3         Иванов   1   2   3
Петров   4   5   6         Петров   4   5   6
Сидоров   7   8   9         Сидоров   7   8   9

Пример 2.
После фильтрации в таблице данных две строки

Таблица данных                  Таблица результатов         
                           
Петров   4   5   6         Петров   4   5   6
Сидоров   7   8   9         Сидоров   7   8   9
                              0          0   0   0

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

Таблица данных                  Таблица результатов         
                           
Петров   4   5   6         Петров   4   5   6
                                0   0   0   0
                                0   0   0   0

Таблиц данных несколько, каждая расположена на отдельном листе.
И из каждой таблицы данных после фильтрации результаты фильтрации должны "стекаться" в таблицу результатов.
Таблица результатов поделена на блоки - каждый блок принимает информацию с определенного листа со своей таблицей данных.

Когда я в таблице результатов пишу "= адрес ячейки из таблицы данных", то в результате, как бы я не фильтровал таблицу данных, результат в ячейке таблицы результатов  будет "Сидоров" или "Петров", а не видимая область. Т.е. адрес абсолютный, итог не зависит от фильтрации.

Надеюсь, понятно изложил.




eeigor

#7
Попробуйте адаптировать мой пример (файл) с одной двумя исходными таблицами.
Однако каждый блок результатов тогда будет начинаться со своей позиции (могут оставаться пустые строки между блоками). Иначе потребуется макрос.

UPD
Я обновил файл. Загрузите заново.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kompilainenn

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

eeigor

#9
А почему бы вам не расположить данные на одном листе в одной таблице, добавив одно дополнительное поле, позволяющее эти два набора данных различить? Они, как я понимаю, имеют одинаковую структуру. И тогда всё, чего много, сведётся к одному: один фильтр расширенный, один результат скопированный и т.д. Мудрите, однако... Так не делают. Точнее, делают по-всякому.

UPD1
Цитата: Алексей Ч от 11 марта 2021, 22:51И из каждой таблицы данных после фильтрации результаты фильтрации должны "стекаться" в таблицу результатов.
Это явный признак того, что дробить данные по листам-таблицам - не лучшее решение.

UPD2
Обновил файл. Добавил всё в одну таблицу. Результат идентичен предыдущему.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Алексей Ч

Цитата: eeigor от 11 марта 2021, 23:38
А почему бы вам не расположить данные на одном листе в одной таблице, добавив одно дополнительное поле, позволяющее эти два набора данных различить? Они, как я понимаю, имеют одинаковую структуру. И тогда всё, чего много, сведётся к одному: один фильтр расширенный, один результат скопированный и т.д. Мудрите, однако... Так не делают. Точнее, делают по-всякому.

UPD1
Цитата: Алексей Ч от 11 марта 2021, 22:51И из каждой таблицы данных после фильтрации результаты фильтрации должны "стекаться" в таблицу результатов.
Это явный признак того, что дробить данные по листам-таблицам - не лучшее решение.

UPD2
Обновил файл. Добавил всё в одну таблицу. Результат идентичен предыдущему.
Цитата: eeigor от 11 марта 2021, 23:38
А почему бы вам не расположить данные на одном листе в одной таблице, добавив одно дополнительное поле, позволяющее эти два набора данных различить? Они, как я понимаю, имеют одинаковую структуру. И тогда всё, чего много, сведётся к одному: один фильтр расширенный, один результат скопированный и т.д. Мудрите, однако... Так не делают. Точнее, делают по-всякому.

UPD1
Цитата: Алексей Ч от 11 марта 2021, 22:51И из каждой таблицы данных после фильтрации результаты фильтрации должны "стекаться" в таблицу результатов.
Это явный признак того, что дробить данные по листам-таблицам - не лучшее решение.

UPD2
Обновил файл. Добавил всё в одну таблицу. Результат идентичен предыдущему.

По-моему, это то, что нужно.

Каждый лист посвящен отдельному виду строительно-монтажных работ.
Новый строящийся объект - конструктор в который мы по ситуации накидываем элементы (те или иные листы).

Где-то листов будет два, где-то их придется задействовать с десяток.

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

Мне кажется, вопрос решен. Примонстрячу к своим табличкам и в бой. Спасибо Вам большое-)

ЗЫ С другой стороны, может быть, Вы и правы по поводу одной большой таблицы условий...надо подумать, как это реализовать, чтобы оно не было огромным монстром.

kompilainenn

Ооо, коллега строитель. Было бы интересно взглянуть на ваш файл. И узнать, какие задачи он решает
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

eeigor

#12
Нет. Я знаю точно, что правильно, когда все данные одинаковой структуры лежат в одном месте. Одна "сущность" (entity) – одна таблица. В вашем случае, с полем "Вид работ" или "Код работ". "Лазить" по всему листу не надо: надо научиться фильтровать данные. Тема фильтров с использованием регулярных выражений – отдельная сложная тема, но в моём примере поиск идёт по полному значению без них (флажок "Использовать регулярные выражения" сброшен).
"Разбивка" данных и привела к усложнению их обработки и анализа. Но вести данные правильно тоже надо уметь: данные должны лежать в таблице в виде записей, никакой дополнительной информации выше-ниже, в виде заголовков разделов выше или итогов ниже...
Расширенный фильтр позволяет всегда видеть текущие условия отбора (это удобно), а также, в отличие от автофильтра, соединять их оператором "ИЛИ", как и "И" (автофильтр – только "И").

В диапазоне условий может быть и больше строк. В примере все диапазоны с именами, самим данным присвоено имя как диапазону базы данных (в списке именованных диапазонов этого имени нет).

Похоже, вы не знаете ещё и о других инструментах анализа: таблицы подстановки (multiple operations) с формулами массива, сводные таблицы.
Пользователи потому и "городят огород", потому что "не хотят" хранить данные в виде записей в таблицах и решать все связанные с этим проблемы (избыточность информации, её противоречивость (лишний пробел, например), ссылочная целостность и прочая ерунда, которая вовсе и никакая не ерунда)...

Я тоже считаю, что на ваш вопрос мы ответили. Успехов. И заглядывайте сюда почаще.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Алексей Ч

Потестировал на реальных примерах - автофильтр + копипаст оставшихся на листе после фильтрации строк удобнее чем использование расширенного фильтра. Быстрее.

Поэтому вернусь к вопросу - можно ли автоматизировать  процесс копирования видимых строк с одного листа на другой?
Т.е., если после автофильтра остаются видимыми 10 строк, то они и копируются, если ни одной, то в результирующей таблице в этом блоке пусто.
Можно по нажатию кнопки, наверно, т.е. итоговая таблица изначально пуста, а на каждом листе есть кнопка, копирующая видимые ячейки области этого листа в соответствующий блок итоговой таблицы результатов.
Ну или в режиме онлайн, без кнопок, просто в реальном времени копирование текущей на определенной области листа ситуации в таблицу результатов.

Обременять никого не хочется сильно, поэтому, если это глубоко в питоне-sql, скажите. В этом случае буду признателен за какие-нибудь ссылки полезные по теме для самостоятельного разбора.
Ну или за разъяснения, что результат не стоит потраченного времени-)

Во вложении часть моего файла с одним из подразделов и результирующей таблицей.

Спасибо.

eeigor

#14
@Алексей Ч, ваша таблица "заточена" под работу вручную: пустые строки, итоги под данными (их следует вынести, к примеру вверх и расположить над, то есть вне диапазона). Работа с электронной таблицей как с "бумажным" листом, когда "можно всё", и порождает трудоёмкую и ненужную работу, которую предстоит выполнять вам. Вы не готовы учиться и работать правильно (см. мой ответ #12). Работайте вручную. Если кто-то не захочет-таки заниматься этим...
На этом форуме есть решение, позволяющее автоматизировать расширенный фильтр. При правильном построении данных никакой перенос отфильтрованных данных, скорее, не потребуется.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community