Несоответствие типа массива

У меня есть история прослушивания из Spotify на листе Excel. Я хотел бы извлечь всех уникальных исполнителей из этого списка и записать их в другой столбец на том же листе Excel.

Sub CountUniqueValues()

    Dim wb As Workbook
    Set wb = Workbooks("Spotify_Analysis_XYZ.xlsm")
    
    Dim ws As Worksheet
    Set ws1 = wb.Worksheets("Sheet1")
    
    Dim LastRow As Long
    
    LastRow = Cells(Rows.Count, "B").End(xlUp).Row
    
    Dim UniqueArtists As Variant
    UniqueArtists = Evaluate("Unique(" & "B2:B" & LastRow & ",TRUE,FALSE)")
    ws1.Cells("2:40000", 8) = UniqueArtists
    
End Sub

Где все исполнители хранятся в столбце B.

Я получаю несоответствие типов.

ws1 Не определено. Вам нужно изменить его на Set ws = wb.Worksheets("Sheet1") или Dim ws As Worksheet на Dim ws1 As Worksheet
Gareth 18.12.2020 17:06
support.microsoft.com/en-us/office/…?
GSerg 18.12.2020 17:08

Убедитесь, что вы указали, на каком листе должна использоваться оценка: ws1.Evaluate(....

Scott Craner 18.12.2020 17:23
Справка MS Office: Ячейки
T.M. 18.12.2020 17:56

Хотя хорошо понимать VBA, почему бы вам просто не использовать UNIQUE() в функции электронной таблицы (поскольку вы используете версию Excel, в которой эта функция существует). =UNIQUE(B:B,TRUE,FALSE) в любой ячейке, которую вы хотите разместить в верхней части столбца результатов.

DS_London 19.12.2020 10:48
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
5
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это будет работать, если вы убедитесь, что правильный рабочий лист правильной книги Active:

Sub uniqB2H()
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, "B").End(xlUp).Row
    
    Range("H2").Formula2 = "=Unique(B2:B" & LastRow & ")"
    Range("H2#").Value = Range("H2#").Value
End Sub

РЕДАКТИРОВАТЬ № 1:

  1. этот подход позволяет избежать создания массива VBA и переноса его на рабочий лист.
  2. в этой демонстрации мы предполагаем только одну рабочую книгу и рабочий лист с данными, которые уже Active; таким образом, ни один из диапазонов не должен быть квалифицирован
  3. в этой демонстрации Formula2 используется для размещения динамической формулы в ячейке
  4. в этой демонстрации мы используем Range("H2#"), который указывает полный диапазон распространения.

Правильно, и было бы полезно объяснить как ссылку на диапазон разливов, так и полностью уточняющие ссылки на диапазон для очевидного новичка :-)

T.M. 18.12.2020 18:05

@Т.М. Ценный комментарий. см. мой РЕДАКТИРОВАТЬ # 1

Gary's Student 18.12.2020 18:42
Ответ принят как подходящий

Вот еще один способ заставить его работать. Ваша последняя строка не была диапазоном.

Sub CountUniqueValues()

Dim t As Long

Dim wb As Workbook
Set wb = Workbooks("Spotify_Analysis_XYZ.xlsm")

Dim ws1 As Worksheet
Set ws1 = wb.Worksheets("Sheet1")

Dim LastRow As Long

LastRow = ws1.Cells(Rows.Count, "B").End(xlUp).Row

Dim UniqueArtists As Variant
UniqueArtists = Evaluate("Unique(Sheet1!B2:B" & LastRow & ",false,FALSE)")
t = UBound(UniqueArtists) - 1
ws1.Range(ws1.Cells(2, 8), ws1.Cells(2 + t, 8)) = UniqueArtists


End Sub

+1 За упоминание причины ошибки и рабочий пример с правильным синтаксисом; кстати Unique() без логических аргументов это то же самое, что 2 раза False :-)

T.M. 18.12.2020 18:09

Другие вопросы по теме