#vba #excel
#vba #excel
Вопрос:
Я пытаюсь скопировать столбец из таблицы и вставить его, при этом удаляя дублированные ячейки. Я использую этот код:
Sub Median()
Application.Calculation = xlManual
Application.ScreenUpdating = False
Worksheets("Distance to Default").Activate
With ActiveSheet
.Range("C:C").Copy Destination:=.Range("T:T")
.Range("T:T").RemoveDuplicates , Header:=xlNo
End With
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub
Все работало бы нормально, если бы не тот факт, что появляется сообщение с просьбой выбрать, для какого столбца я хочу удалить дубликаты (рисунок выше). Поскольку я вставляю только один столбец, вопрос не имеет смысла.
Как я могу изменить свой код, чтобы окно больше не появлялось?
Obs.: Я попытался использовать столбцы: = 1 сразу после удаления дубликатов, и это не сработало
Комментарии:
1. Я не получаю окно с запросом ввода, когда я использую ваш пример
2. Это полный код, который вы используете? Если нет, можете ли вы опубликовать больше?
3. Я опубликовал полный раздел.
4. в следующий раз людям будет очень полезно , если вы четко объясните, что используете Excel для Mac. Избавит вас от множества полезных ответов.
Ответ №1:
Если вы используете Application.DisplayAlerts = False
, сообщение не должно отображаться.
Как упоминалось в моем комментарии выше, я не получаю предупреждения при использовании вашего примера, но этот код обычно подавляет отображение предупреждений.
Комментарии:
1. Спасибо за ваш ответ. Сообщение по-прежнему отображается, и теперь оно дает возможность удалить столбец Q.
Ответ №2:
Добавьте «Столбцы: = 1» в свой код. При этом автоматически выбирается первый столбец диапазона:
With ActiveSheet
.Range("C:C").Copy Destination:=.Range("T:T")
.Range("T:T").RemoveDuplicates, Columns:=1, Header:=xlNo
End With
Комментарии:
1. Возможно, это (и другие решения) не работают на Mac. Возможно, это хорошая идея использовать только очень базовое кодирование, без конкретных элементов vba. Например, вы могли бы перебирать значения, записывать их в массив, сравнивать их и удалять те значения, которые упоминаются дважды. Это требует немного больше усилий, но использует только циклы и массивы, которые, насколько я знаю, поддерживаются Excel для Mac.
Ответ №3:
Обновление: это будет работать на Mac OS
Sub MacRemoveDuplicates()
Dim Data, UniqueData, v
Dim x As Long
Dim c As Collection
Set c = New Collection
With ActiveSheet
Data = Intersect(.Range("C:C"), .UsedRange)
ReDim UniqueData(1 To UBound(Data, 1), 1 To 1)
For Each v In Data
If v <> vbNullString Then
On Error Resume Next
c.Add vbNullString, v
If Err.Number = 0 Then
x = x 1
UniqueData(x, 1) = v
End If
On Error GoTo 0
End If
Next
.Range("T1").Resize(x) = UniqueData
End With
End Sub
Вот два способа удаления дубликатов с помощью ОС Windows.
Sub Method1()
With ActiveSheet
.Range("C:C").Copy Destination:=.Range("T:T")
.Range("T:T").RemoveDuplicates Columns:=1, Header:=xlNo
End With
End Sub
Sub Method2()
Dim Data, v
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
With ActiveSheet
Data = Intersect(.Range("C:C"), .UsedRange)
For Each v In Data
If v <> vbNullString Then dict(v) = vbNullString
Next
.Range("T1").Resize(dict.Count) = Application.Transpose(dict.Keys)
End With
End Sub
Комментарии:
1. Спасибо, Томас. Я пробовал это, но это не сработало. Мой код:
2. Для второго я получил сообщение об ошибке «Компонент ActiveX не может создать объект»
3. 2-Го числа вы получили сообщение об ошибке, потому что вы используете Mac, у которого нет
Scripting.Dictionary
объекта.4. @ScottHoltzman Спасибо. Я только что обновил свой ответ, чтобы использовать
Collection
вместоDictionary
.