VBA removeDuplicates: не удается установить столбцы по переменной

#vba #duplicates

#vba #дубликаты

Вопрос:

Я работал с removeDuplicates и не могу найти другого способа, кроме жесткого кода настроек столбцов. Этот код будет работать:

 Worksheets("SheetName").Activate
ActiveSheet.Range("A:Z").RemoveDuplicates _
Columns:=VBA.Array(1, 2, 3), _
    Header:=xlYes
  

Но этот код выдал бы «ошибку времени выполнения 5»:

 Dim ArrayColumns() As Variant
ArrayColumns = VBA.Array(1, 2, 3)

Worksheets("SheetName").Activate
ActiveSheet.Range("A:Z").RemoveDuplicates _
Columns:=ArrayColumns, _
    Header:=xlYes
  

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

Вы можете мне помочь?

Приветствия, Питер

Ответ №1:

Добавьте ( до и ) после вашего ArrayColumns

 Sub RemDuplicates()

Dim ArrayColumns() As Variant
Dim Sht As Worksheet

Set Sht = ThisWorkbook.Sheets("SheetName")
ArrayColumns = Array(1, 2, 3)

With Sht
    .Range("A:Z").RemoveDuplicates Columns:=(ArrayColumns), Header:=xlYes
End With

End Sub
  

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

1. Спасибо, теперь это работает. Я думал, что попробовал это решение, но тогда это, должно быть, был длинный массив или любая другая проблема. PS: имеет значение sht .Range …. Заканчивается быстрее, чем мой Sht.Range ….? Или почему вы это использовали?

2. @PeterFrey может быть, это мой стиль кодирования, но я предпочитаю использовать With инструкции, на случай, если в будущем вы захотите запустить больше кода на этом листе, тогда будет проще установить ссылку.

3. Почему именно это работает, @Shai Rado ? Заставляют ли скобки вычислять или что-то в этом роде?

Ответ №2:

Просто ознакомьтесь с исходной публикацией, где было указано ArrayColumns = VBA.Массив (1, 2, 3). Можно было бы использовать только VBA.Массив с удаленными дубликатами, если для модуля установлена опция Base 1. Вот почему ArrayColumns = Array(1, 2, 3) наконец сработал [при условии, что параметр Base по умолчанию равен 0]