Пользовательская функция Excel: управление фильтром / сортировкой для смешанного (строкового) вывода

#excel #vba #sorting

#excel #vba #сортировка

Вопрос:

У меня есть столбец с ячейками, в которых вычисляется значение, представляющее объемы файлов в байтах, и функция, выводящая строку, преобразующуюся в соответствующие единицы (96949643551 -> «90.291 GiB»), которую я затем решил обернуть вокруг этого значения:
=Format_Filesize(B3-B3*Settings!$B$4/E3)

  • B3-B3*Settings!$B$4/E3 вычисляет разницу между исходным размером файла B3, используя исходный битрейт E3, и прогнозируемым размером файла, используя новый битрейт в настройках! $ B $ 4, и может привести к чему-то вроде 53954174.66
  • Format_Filesize() возвращает 51,45 MiB для этого примера

Это было довольно приятно, пока я не понял, что, возможно, захочу отсортировать этот столбец вместе с другими (используя функциональность «Данные -> Сортировка и фильтр -> Фильтр».

Есть ли способ либо

  • Предоставить обработчик для оценки сортировки? Может быть, создать пользовательский класс с различными функциями получения или переопределения, например onSort ?
  • или для динамического определения того, что отображается в ячейке? Нравится:
    123456;"Display Text" сортировка с использованием всего значения, но отображение только «Отображаемого текста»?

    nvm, сортировка Excel по алфавиту / Z-A не является естественной сортировкой

Мои мысли до сих пор:

  1. У меня может быть столбец для сортировки (вычисляемое число) и столбец для красивого отображения ( Format_Filesize() числовой ячейки)
    , который легко сделать, но некрасиво; в идеале я бы скрыл числовой столбец, но тогда я больше не мог бы легко сортировать с ним
  2. Я могу использовать =[NumericResult] amp; "; " amp; Fortmat_Filesize([NumericResult]) числовое значение впереди для сортировки и форматированную строку для чтения справа.
    Нет, я не могу: функция сортировки фильтра будет сортировать строго по алфавиту (2> 100)
  3. Я могу написать свою собственную функцию сортировки и вставить фигуру или элемент управления, привязанный к макросу сортировки, и щелкнуть по нему вместо использования функции сортировки фильтра для этого столбца
  4. вместо пользовательской функции для вывода форматированного строкового значения я мог бы использовать пользовательский числовой формат, например [<1024]##0.00" B";[<1048576]##0.00," KB";##0.00,," MB"
    Недостатки:
    — Мне пришлось бы использовать базовые 10 единиц (КБ, МБ) вместо базовых 2 единиц (КБ, МБ)
    — Возможно только максимум 2 условия, за которыми следует всеобъемлющее значение, что означает, что оно будет отображать 5,34 ТБ как 5340000 МБ

Я думаю, что 1 или 2 — довольно хорошие обходные пути, но меня бы очень заинтересовали любые лучшие решения, даже если они кажутся слишком сложными, чтобы их стоило внедрять — для развлечения и / или для полноты картины.

Комментарии:

1. Вы могли бы использовать пользовательский числовой формат для отображения форматированного значения и использовать необработанное число для значения ячейки, но я думаю, что есть ограничение на количество различных форматов, которые вы можете использовать в рабочей книге (200-250?)

2. @TimWilliams что именно вы имеете в виду? До сих пор я сталкивался с приближением единиц СИ (мой обходной # 4), использующим числовые пороговые значения для применения форматов, но условия превышают 2 ( 1) максимум. Вы думаете об отдельном формате для каждого возможного значения, и именно поэтому вы говорите о 100-х форматах? :O

3. Да — например, если значение ячейки равно 96949643551, то пользовательский формат представляет собой форматированное значение «90,291 гигабайт»

4. @TimWilliams Я вижу ^^ интересную идею, но я отчасти рад, что ее ограничение дисквалифицирует ее, потому что это был бы кошмар подхода, который заставляет вас чувствовать себя ужасно из-за его реализации, но я был бы вынужден попробовать ^^ __ Но спасибо, это хороший вклад 🙂

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