Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
1

Поиск дубликатов в двух массивах с последующим удалением их из виртуального массива

19.10.2016, 11:56. Показов 4972. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На одном листе есть две таблицы разделенные несколькими строками - это и есть 2 массива. Нужно проверить дублирующиеся значения между ними, но есть сложность - иногда одно и тоже значение повторяется в одном массиве из-за чего иногда некорректно отображаются данные. Хотелось бы создать код, который может избежать этой ошибки. Как я представляю процесс: берется значение из массива №1 и сравнивается со значениями из массива №2; при нахождении повтора эти два значения исключаются из сравнения(если есть такое же значение в массиве №1, то при сравнении уже не будет в массиве №2 такого же);если дубликатов нет, то строка со значением переносится на отдельный лист.

При этом хотелось бы чтобы все эти вычисления были виртуальными, никак не изменяя реальный документ.

Это вообще возможно?

Пока создала только такой код

Visual Basic
1
2
3
4
5
6
7
8
Dim lLastRow2
        lLastRow2 = Cells(Rows.Count, 2).End(xlUp).Row + 4
        Dim x, m
        For x = 2 To Cells(Rows.Count, 2).End(xlUp).Row
        For m = lLastRow2 To Cells(Rows.Count, 2).End(xlUp).Row
        If Cells(x, 2) > 0 Then
        If Cells(m, 2) > 0 Then
            If Cells(x, 2) = Cells(m, 2) Then
...и дальше я не знаю что вставить
Вложения
Тип файла: xls 1234.xls (35.0 Кб, 5 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2016, 11:56
Ответы с готовыми решениями:

Сортировка цифр в одной ячейки с последующим удалением дубликатов
Добрый день, помогите, необходимо отсортировать последовательность цифр в ОДНОЙ ячейки (пример...

Вывод дубликатов с последующим удалением из загружаемой таблицы SQL запросом
Уважаемые Гуру, прошу Вашей помощи, уже неделю пытаюсь решить проблему. По форуму странствовал и...

Поиск одинаковых строк в файле с удалением дубликатов
Помогите или подскажите. В текстовом файле в разном порядке есть одинаковые строки. Необходимо...

Поиск слова в memo с последующим его удалением
есть код поиска слова в тексте procedure TForm1.Button1Click(Sender: TObject); var Find:...

21
4082 / 1462 / 401
Регистрация: 07.08.2013
Сообщений: 3,651
19.10.2016, 12:12 2
Как я понимаю задачу
вариант1 из одной объединенной таблицы убрать дубликаты оставив только строки с уникальными значениями
вариант2 из таблицы 1 оставить только уникальные записи которые совпадают со значениями в таблице 2
вариант3 из таблицы1 оставить записи которые не совпадают со значениями таблицы 2
(нужное подчеркнуть)
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
19.10.2016, 12:38  [ТС] 3
3 вариант...но при этом лист с которым работаем должен остаться без изменений
0
4082 / 1462 / 401
Регистрация: 07.08.2013
Сообщений: 3,651
19.10.2016, 16:01 4
просмотрел таблицы
некоторые ячейки не заполнены
из-за этого возникает неопределенность
если судить по логике которую вы описали на новый лист необходимо перенести
строки 3, 4, 5, 14

строки 3 нет во второй таблице
строки 4, 5, 14 потому что во второй таблице Дата публикации ответа не заполнена
соответственно однозначно сравнить записи не возможно

а посему нужны дополнительные пояснения
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
19.10.2016, 16:57  [ТС] 5
Столбиком сравнения является только "Номер заявки" и получается что на новый лист должны переноситься строки 3 и 4(или 5 - повтор строки 4).
0
4082 / 1462 / 401
Регистрация: 07.08.2013
Сообщений: 3,651
20.10.2016, 10:31 6
Попробуйте
Вложения
Тип файла: xls 1234.xls (56.5 Кб, 6 просмотров)
0
Hugo121
20.10.2016, 10:53
  #7

Не по теме:

Скачал последний файл (хотел глянуть код - действительно ли там что-то переносится, или как всегда :) ) - но вот казус: никакого кода нет. Или это мои админы проекты втихаря режут, или офис365 так воспринимает xls?

0
4082 / 1462 / 401
Регистрация: 07.08.2013
Сообщений: 3,651
20.10.2016, 10:55 8
о как
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Sub macro1()
Sheets("Лист1").Select
asd = Cells(Rows.Count, 2).End(xlUp).Row
For i = asd To 2 Step -1
If Cells(i, 2) = "" Then
If y = 0 Then y = i
d = i
End If
Next i
d = d - 1: y = y + 1
 
strSQL = "SELECT First(a8.f1) AS [First-f1], a8.f2, First(a8.f3) AS [First-f3], First(a8.f4) AS [First-f4], First(a8.f5) AS [First-f5], First(a8.f6) AS [First-f6]"
strSQL = strSQL & " FROM [Лист1$a2:f" & d & "] AS a8 RIGHT JOIN (SELECT a5.f2 FROM"
strSQL = strSQL & " (SELECT a3.f2, a3.f10, IIf(IsNull([a4].[F20]),0,[a4].[F20]) AS f30"
strSQL = strSQL & "  FROM"
strSQL = strSQL & " (SELECT a1.f2, Count(a1.f2) AS f10"
strSQL = strSQL & " FROM [Лист1$a2:f" & d & "] AS a1 GROUP BY a1.f2)  AS a3 LEFT JOIN"
strSQL = strSQL & " (SELECT a2.f2, Count(a2.f2) AS F20"
strSQL = strSQL & " FROM [Лист1$a" & y & ":f" & asd & "] AS a2"
strSQL = strSQL & " GROUP BY a2.f2)  AS a4 ON a3.f2 = a4.f2)  AS a5"
strSQL = strSQL & " WHERE ((([f10]-[f30])>0)))  AS a6 ON a8.f2 = a6.f2"
strSQL = strSQL & " GROUP BY a8.f2"
Dim objConnection As Object
Dim rs As Object
 
Set objConnection = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ActiveWorkbook.Path & "/" & ActiveWorkbook.Name & ";" & _
"Extended Properties=""Excel 12.0;HDR=No"";"
rs.Open strSQL, objConnection, 3, 3
Sheets("Не дубликаты").Cells(2, 1).CopyFromRecordset rs
 
Set objConnection = Nothing
Set rs = Nothing
 
Rows("1:1").Select
Selection.Copy
Sheets("Не дубликаты").Select
Rows("1:1").Select
ActiveSheet.Paste
Sheets("Лист1").Select
Columns("A:F").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Не дубликаты").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
    
End Sub
0
6982 / 2883 / 552
Регистрация: 19.10.2012
Сообщений: 8,773
20.10.2016, 11:40 9
Спасибо.
Понятно, перенос как всегда спутан с копированием - "никак не изменяя реальный документ" перенести невозможно.
Сохранил код в стандартном модуле - сохранился!
Думаю стандартно на коллекции или словаре код был бы проще. Такой навороченный запрос я например вообще не воспринимаю
А если делать на коллекции - то и на Маке сработает, а вот как там с "Provider=Microsoft.ACE.OLEDB.12.0;" я не в курсе, но сомневаюсь...
0
4082 / 1462 / 401
Регистрация: 07.08.2013
Сообщений: 3,651
20.10.2016, 12:05 10
ну если просто то суть запроса сводится к тому чтобы
получить из 2 столбца сводную таблицу
для этого берется столбец из первой таблицы группируется и считается количество одинаковых значений
далее к этим двум столбцам добавляется столбец с количеством значений из второй таблицы
вообщем получается что-то типа сводной таблицы
ну а дальше просто дело техники
на счет коллекции или словаря - я с ними мало работал (находятся в стадии изучения)
так что по поводу "проще" ни чего сказать не могу - ясно одно цикл это долго
0
6982 / 2883 / 552
Регистрация: 19.10.2012
Сообщений: 8,773
20.10.2016, 12:20 11
С коллекцией просто.
Правда именно само копирование у меня в офисе365 почему-то подтормаживает, но тут за скоростью и не гнался.
Делал только по столбцу номеров - поэтому скопировалась только шапка и одна строка.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Option Explicit
 
Sub tt()
Dim a, b, i&, ii&, lr&, t$, col As New Collection
 
With Sheets(1)
    lr = .Cells(.Rows.Count, 2).End(xlUp).Row
    a = .[a1].CurrentRegion.Columns(2).Value
    b = .Cells(lr, "A").CurrentRegion.Columns(2).Value
 
On Error Resume Next
For i = 1 To UBound(b)
    t = b(i, 1): col.Add t, t
Next
 
Err.Clear
For i = 1 To UBound(a)
    t = a(i, 1): col.Add t, t
    If Err = 0 Then
        ii = ii + 1: .Rows(i).Copy Sheets(2).Cells(ii, 1)
    Else
        Err.Clear
    End If
Next
 
End With
End Sub
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
20.10.2016, 14:54  [ТС] 12
К сожалению выдает ошибку на строке
Код
 rs.Open strSQL, objConnection, 3, 3.
0
4082 / 1462 / 401
Регистрация: 07.08.2013
Сообщений: 3,651
20.10.2016, 15:02 13
Видите ли
код который вам предоставлен имеет очень много условностей
например Номер заявки должен располагаться именно во втором столбце
сверху не должно быть пустых строк
т.е. строка с названиями столбцов должна находиться в первой строке таблицы
и там много еще чего

тут надо разбираться в конкретном случае
(я так думаю потому-что файл который я вам отправил - работает)
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
20.10.2016, 15:16  [ТС] 14
Hugo121, да код работает НО выдает только одну строку, а по логике должно 2(3 и 4 строка)...это именно та проблема с которой я столкнулась при дубляже не только во второй таблице, но и в первой...если есть дубли по 1 таблице, то один из них переноситься на другой лист

Добавлено через 8 минут
snipe, при ошибке возникает окно "Run-time error '-217217865(80040e37): Объект "Лист1$a2:f-1" не найден ядром СУБД Microsoft Access. Убедитесь, что объект существует, а его имя и путь к нему указаны правильно. Если объект "Лист1$a2:f-1" не является локальным, проверьте сетевое подключение или обратитесь к администратору сервера."
0
6982 / 2883 / 552
Регистрация: 19.10.2012
Сообщений: 8,773
20.10.2016, 15:40 15
Ну тогда объясните подробно почему нужны две строки, раз без повторов только одна строка.
Подозреваю что тогда проще писать код используя словарь.
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
20.10.2016, 15:53  [ТС] 16
Попробую объяснить на примере более подробно. У строки 3 нет дубляжа в таблице 2 поэтому данную строку переносим на другой лист. Строка 4 имеет дубль в таблице 1(это строка 5) и в таблице 2(это строка 25). Как я представляла действие кода(возможно допотопно): берется ячейка В4 и сравнивается со значениями в таблице 2, доходит до ячейки В25, значения равны и исключаюбтся их сравнения, соответственно берется следующая ячейка В5 и сравнивается со значениями в таблице 2, не находит равных(так как В25 исключена их дальнейшего сравнения), строка 5 переноситься на лист "Не дубликаты".
0
6982 / 2883 / 552
Регистрация: 19.10.2012
Сообщений: 8,773
20.10.2016, 16:00 17
Вот попробуйте, тоже на коллекции:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit
 
Sub tt()
Dim a, b, i&, ii&, lr&, t$, col As New Collection, tmp&
 
With Sheets(1)
    lr = .Cells(.Rows.Count, 2).End(xlUp).Row
    a = .[a1].CurrentRegion.Columns(2).Value
    b = .Cells(lr, "A").CurrentRegion.Columns(2).Value
 
On Error Resume Next
For i = 1 To UBound(b)
    t = b(i, 1): col.Add 1, t
    If Err Then
    tmp = col(t)
    col.Remove (t)
    col.Add tmp + 1, t
    Err.Clear
    End If
Next
 
Err.Clear
For i = 1 To UBound(a)
    t = a(i, 1): col.Add t, t
    If Err = 0 Then
        ii = ii + 1: .Rows(i).Copy Sheets(2).Cells(ii, 1)
        col.Remove (t)
    Else
        tmp = col(t)
        col.Remove (t)
        If tmp > 1 Then col.Add tmp - 1, t
        Err.Clear
    End If
Next
 
End With
End Sub
Но правда здесь анализируются лишь количество повторов номеров, никакие другие параметры роли не играют.
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
20.10.2016, 16:34  [ТС] 18
Hugo121 спасибо, работает)))

Добавлено через 14 минут
А можно поподробнее? Хотелось бы разобраться какая часть за что отвечает
0
6982 / 2883 / 552
Регистрация: 19.10.2012
Сообщений: 8,773
20.10.2016, 20:41 19
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit
 
Sub tt()
Dim a, b, i&, ii&, lr&, t$, col As New Collection, tmp&
 
With Sheets(1) 'работаем с первым листом
    lr = .Cells(.Rows.Count, 2).End(xlUp).Row 'последняя строка
    a = .[a1].CurrentRegion.Columns(2).Value 'массив данных из верхней непрерывной части
    b = .Cells(lr, "A").CurrentRegion.Columns(2).Value 'массив из нижней
 
On Error Resume Next 'отключение ошибок
For i = 1 To UBound(b) 'цикл по нижнему массиву
    t = b(i, 1): col.Add 1, t 'попытка добавить в коллекцию номер в текстовом виде с счётчиком
    If Err Then ' если не добавилось, т.е. уже есть
    tmp = col(t) 'запоминаем значение счётчика
    col.Remove (t) 'удаляем из коллекции
    col.Add tmp + 1, t 'добавляем с увеличенным счётчиком
    Err.Clear 'сбрасываем ошибку
    End If
Next
 
Err.Clear 'сбрасываем ошибку, на всякий - по идее тут ошибки быть не должно
For i = 1 To UBound(a) 'цикл по верхнему массиву
    t = a(i, 1): col.Add t, t 'попытка добавить в коллекцию номер в текстовом виде
    If Err = 0 Then 'если нет ошибки, т.е. добавилось
        ii = ii + 1: .Rows(i).Copy Sheets(2).Cells(ii, 1) 'копируем строку на второй лист
        col.Remove (t) 'удаляем из коллекции только что добавленное
    Else 'если ошибка была, т.е не добавилось
        tmp = col(t) 'запоминаем значение счётчика
        col.Remove (t) 'удаляем из коллекции
        If tmp > 1 Then col.Add tmp - 1, t 'если счётчик >1 то добавляем с уменьшенным счётчиком
        Err.Clear 'сбрасываем ошибку
    End If
Next
 
End With
End Sub
Добавлено через 3 часа 13 минут
Скачал дома файл из №6 - код есть, всё работает, и мой код тоже шустро отрабатывает, но у меня дома Excel2010.
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
21.10.2016, 09:54  [ТС] 20
Спасибо за пояснения. Хотелось бы уточнить - если в таблице 2 будет строка без дубля в таблице 1 код будет работать корректно? и как можно это значение перенести на отдельный лист?

Код из №6 у меня не пошел - при запуске макроса Excel закрывался(работаю в 2013 офисе)
0
21.10.2016, 09:54
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2016, 09:54
Помогаю со студенческими работами здесь

Поиск и выделение лишних пробелов с их последующим удалением
Здравствуйте! Помогите, пожалуйста, с реализацией задания или хотя бы подскажите алгоритм удаления...

Поиск строки в файле bat с последующим удалением
Здравствуйте уважаемые! К сожалению мои познания в написании батника минимальные! Нужен батник...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как в цикле обойти все поля объекта в JavaScript
bytestream 28.01.2025
Объекты в JavaScript представляют собой фундаментальные структуры данных, которые позволяют хранить и организовывать связанную информацию в виде пар ключ-значение. Каждый объект можно представить как. . .
Как выбрать строки в DataFrame по значению столбца в Pandas
bytestream 28.01.2025
В области анализа данных библиотека Pandas стала незаменимым инструментом для работы с табличными данными в Python. Эта мощная библиотека предоставляет множество функций для эффективной обработки и. . .
Как сделать перенос строки в Bash
bytestream 28.01.2025
При работе с командной оболочкой Bash разработчики часто сталкиваются с необходимостью форматирования текстового вывода, где ключевую роль играет правильное управление переносами строк. Умение. . .
Поиск подстроки в строке с помощью Bash
bytestream 28.01.2025
Поиск подстроки в строке является одной из важных задач в программировании и обработке текстов. Применение такого поиска можно найти в самых разных областях, от анализа данных до разработки. . .
[golang] 169. Majority Element
alhaos 28.01.2025
Тут надо вернуть "мажористый" элемент который встречается в слайсе больше чем в половине случаев. По условиям задачи во входных данных такой элемент обязан присутствовать. / / . . .
Когда лучше использовать LinkedList вместо ArrayList в Java
bytestream 28.01.2025
При разработке Java-приложений выбор правильной структуры данных играет ключевую роль в обеспечении эффективности и производительности программы. ArrayList и LinkedList являются двумя. . .
Какой ответ HTTP лучше использовать: 403 Forbidden или 401 Unauthorized, когда недостаточно прав
bytestream 28.01.2025
В современной веб-разработке правильная обработка ошибок и точное информирование клиентов о статусе их запросов играют критическую роль в создании надежных и безопасных приложений. Особое внимание. . .
Как получить список всех файлов коммита в Git
bytestream 28.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде и других файлах проекта. В основе работы Git лежит концепция коммитов - снимков. . .
Как записать только часть изменений файла в Git
bytestream 28.01.2025
В процессе разработки программного обеспечения часто возникает необходимость сохранить только определенные изменения из множества внесенных правок в файлах. Система контроля версий Git предоставляет. . .
[golang] 80. Remove Duplicates from Sorted Array II
alhaos 28.01.2025
В предоставленном упорядоченном по возрастанию целочисленном слайсе, оставить уникальные элементы полюс один возможный дубликат. Вернуть количество таких элементов. / / . . .
Что такое внедрение зависимостей и для чего оно применяется
bytestream 27.01.2025
В современной разработке программного обеспечения одной из ключевых проблем является управление зависимостями между различными компонентами системы. Внедрение зависимостей (Dependency Injection, DI). . .
Как установить cellpadding и cellspacing в CSS
bytestream 27.01.2025
При создании веб-страниц с табличными данными разработчики часто сталкиваются с необходимостью правильного оформления внутренних и внешних отступов в таблицах. В традиционной разметке HTML для этих. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru