#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]