RemoveDuplicates

Автор Fiona, 20 января 2021, 14:46

0 Пользователи и 1 гость просматривают эту тему.

Fiona

Здравствуйте!
Подскажите, пожалуйста, какой в LO есть аналог метода VBA для удаления дублей из заданного диапазона через макрос?

ActiveSheet.Range("A1:C100").RemoveDuplicates Columns:=Array(1,2), Header:=xlYes


Спасибо.

eeigor

Поступите проще:

=SUMPRODUCT($A1=$A$1:$A$99;$B1=$B$1:$B$99;$C1=$C$1:$C$99)

В примере выше – 3 столбца и 99 строк.

It returns the frequency of combinations in this row's A, B and C within rows 1 to 99.
Adjust to your needs, copy down and filter this column by ">1".
Then decide about the records to stay.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#2
...или реализуйте макрос с использованием этой функции, передав ей все или только те столбцы, по которым надо проверить совпадения. В этом случае всю логику возьмёт на себя встроенная функция.

UPD:
Идея (не пробовал): создать диапазон БД, чтобы в коде использовать структурные ссылки на столбцы без вычисления границ диапазонов.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Fiona

Ни формулу, ни бд не могу использовать - данные в области заполняются поэтапно из другого листа через макрос. Итоговое количество строк не известно. Пример приведен из матчасти по excel. После удаления дублей оставшиеся строки форматируются по шаблону для расчета итогов.
А как использовать в макросе функцию, есть примеры?
Спасибо.

eeigor

#4
Ну, на форумах больше 100 тем по удалению дубликатов. Такой функции, как в Excel, здесь нет.
Все решения привязаны к конкретным данным.

Например, фрагмент решения от нашего гуру JohnSun выглядит следующим образом.
Но это ли вам надо?..
В коде ниже в данных, которые уже были предварительно отсортированы (!) по возрастанию, строки последовательно добавляются в новый массив, а чтобы не было повторов, очередная строка сравнивается с последней добавленной по значению одного (!) столбца. В этом суть алгоритма на уникальность указанного автора.

Диапазон исходных данных очищается и замещается новым уникальным.

Function FilterUnique(aData As Variant, Optional nColumn) As Variant
Dim aRes As Variant
Dim i As Long
If IsMissing(nColumn) Then nColumn = 0 ' By default column A
aRes = Array()
AppendToArray(aRes, aData(0))
For i = 1 To UBound(aData)
If aData(i)(nColumn) <> aRes(UBound(aRes))(nColumn) Then AppendToArray(aRes, aData(i))
Next i
FilterUnique = aRes
End Function

Sub AppendToArray(oData As Variant, ByVal x As Variant)
Dim iLB As Long, iUB As Long
   iLB = LBound(oData, 1)
   iUB = UBound(oData, 1) + 1
   ReDim Preserve oData(iLB To iUB)
   oData(iUB) = x
End Sub


Посмотрите мой файл. Он, так полагаю, вас не устроит... Но надо писать код под конкретную задачу.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#5
Полагаю целесообразным реализовать отдельную процедуру удаления дубликатов, которая будет работать с всем диапазоном данных (CurrentRegion), не менять порядок следования строк и принимать параметры типа:
aColumnsMatch() - массив индексов столбцов, по которым проверяем совпадения строк;
bContainsHeaders - флаг, указывающий на наличие заголовков столбцов в первой строке диапазона.

Результат: замещение исходных данных новыми без дубликатов.
При этом надо принимать решение: если сравнение производится не по всем столбцам, то какие строки оставлять, а какие удалять.

В вашем случае тоже неясно, какие?
Цитата: Fiona от 20 января 2021, 14:46ActiveSheet.Range("A1:C100").RemoveDuplicates Columns:=Array(1,2), Header:=xlYes
Столбцов три, а в массиве индексов - только два.

Может кто-то уже сделал нечто подобное? Мне, например, нравится как @sokol92 решает подобные задачи. И он, наверное, скоро выложит своё решение...  :)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Fiona

Спасибо, буду пробовать такие варианты

Fiona

Спасибо, все получилось - взяла за основу код из расширения.

kompilainenn

Цитата: Fiona от 21 января 2021, 10:22
Спасибо, все получилось - взяла за основу код из расширения.
\
из которого?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Fiona

Одноименного ????

bigor

Цитата: Fiona от 21 января 2021, 11:29?
Есть расширение в теме которого Вы писали вчера, и есть расширение ссылку на которое дал eeigor в #6
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Fiona

Ваше больше подошло, меньше переписывать пришлось.

Fiona

Честно говоря, я решила, что речь о том же расширении, а раз я уже начала его анализировать и все сложилось, то чего уже голову морочить...

Fiona

Хотя, похоже, этот вариант даже короче... Забавно :)