Как отсортировать динамический диапазон в Excel

#excel #vba

#excel #vba

Вопрос:

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

Название, основной жанр, Жанр2, Жанр3, рейтинг, Сезоны, Эпизоды, минуты / эпизод, статус.

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

Я использовал следующую формулу, чтобы получить различные значения из 3 столбцов жанра в моей таблице

 IFERROR(IFERROR(INDEX(Sheet1!$G$6:$G$58, MATCH(0, INDEX(COUNTIF($P$7:P7, Sheet1!$G$6:$G$58),), 0)), INDEX(Sheet1!$H$6:$H$58, MATCH(0, INDEX(COUNTIF($P$7:P7, Sheet1!$H$6:$H$58),), 0))), INDEX(Sheet1!$I$6:$I$58, MATCH(0, INDEX(COUNTIF($P$7:P7, Sheet1!$I$6:$I$58),), 0)))
 

Короче говоря, эта формула использует сопоставление индексов для получения различных значений в одном столбце, а затем, когда у нее заканчиваются различные значения и возвращается N / A (ошибка), функция IFERROR направляет ее в другой столбец, где она делает то же самое и так далее до 3-го столбца.

После этого я подсчитал, сколько аниме с данным жанром рядом с ним, используя следующую формулу:

 COUNTIF($G$6:$I$58, P8)
 

Здесь $ G $ 6: $ I $ 58 — это 3 столбца жанра в моей таблице, а P8 содержит жанр, который мы ищем, Который становится P9 P10 и т. Д., Когда я перетаскиваю его вниз.

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

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

Я знаю об УНИКАЛЬНОЙ функции в Excel, но она доступна только в Microsoft 365, которой у меня нет, у меня есть Microsoft Office Home и Student 2019.

Редактировать: Итак, я увидел, что это невозможно сделать без VBA, поэтому я изучил некоторые базовые VBA и написал этот код, который вернет 2d-массив с жанрами в отсортированном порядке.

 Function CountAndSortGenre() As Variant()

    Dim size As Integer: size = Range("AnimeList[Main Genre]").Rows.Count
    
    ReDim genreExtract((size * 3) - 1) As String
    
    Dim i As Integer: i = 0
    Dim cell As Range
    For Each cell In Range("AnimeList[Main Genre]")
        genreExtract(i) = cell.Value
        i = i   1
    Next
    For Each cell In Range("AnimeList[Genre - 2]")
        genreExtract(i) = cell.Value
        i = i   1
    Next
    For Each cell In Range("AnimeList[Genre - 3]")
        genreExtract(i) = cell.Value
        i = i   1
    Next
    
    Dim distinctGenres As New Dictionary
    Dim genre As Variant
    For Each genre In genreExtract
        If distinctGenres.exists(genre) Then
            distinctGenres(genre) = distinctGenres(genre)   1
        Else
            distinctGenres.Add genre, 1
        End If
    Next
    
    size = distinctGenres.Count
    Erase genreExtract
    
    ReDim sortedGenres(size - 1, 1) As Variant
    For i = 0 To distinctGenres.Count - 1
        sortedGenres(i, 0) = distinctGenres.Keys(i)
        sortedGenres(i, 1) = distinctGenres.Items(i)
    Next i
    
    distinctGenres.RemoveAll
    QuickSort sortedGenres, 0, size - 1
    
    CountAndSortGenre = sortedGenres

End Function
 

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

Единственная проблема сейчас заключается в том, что я не могу найти способ заполнить диапазон ячеек выводом этого 2d-массива. Если я сделаю что-то подобное внутри ячейки

 =CountAndSortGenre()
 

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

Как мне заставить этот 2d-массив выводиться в диапазон ячеек

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

1. Если VBA является опцией, решение довольно простое.

2. Это не похоже на то, что это не вариант, только то, что я пока мало что знаю об этом. Если нет способа сделать это без VBA, я определенно могу изучить базовый VBA.

3. С помощью VBA или Power Query вы можете легко объединить три столбца в единый массив уникальных записей, а затем отсортировать их. Для вашего рабочего листа можно было бы перед сортировкой листа выполнить копирование / вставку special: Values. Причина, по которой ваш текущий метод не работает, заключается в том, что даже после сортировки формулы по-прежнему ссылаются на исходные, несортированные значения.

4. Но если я скопирую / вставлю специальные значения, они не потеряют своей динамики. Например, если я добавлю еще одну запись в список, другой список должен обновляться автоматически. Без формул и только значений это динамическое поведение было бы потеряно, не так ли.

5. Да, так и будет. И без этого вы не сможете его отсортировать. Я предоставлял вариант, при котором вы могли бы избежать использования Power Query или VBA. Конечно, при любом из них вам придется запускать обновление с помощью кода события, чтобы оно обновлялось при изменении параметров. Или используйте O365. Или, может быть, используйте вспомогательный столбец, как только получите свой уникальный список.