#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. Или, может быть, используйте вспомогательный столбец, как только получите свой уникальный список.