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

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

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

Студворк — интернет-сервис помощи студентам
На одном листе есть две таблицы разделенные несколькими строками - это и есть 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
Ответы с готовыми решениями:

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

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

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

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

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

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

Не по теме:

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

0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
20.10.2016, 10:55
о как
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
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
20.10.2016, 11:40
Спасибо.
Понятно, перенос как всегда спутан с копированием - "никак не изменяя реальный документ" перенести невозможно.
Сохранил код в стандартном модуле - сохранился!
Думаю стандартно на коллекции или словаре код был бы проще. Такой навороченный запрос я например вообще не воспринимаю
А если делать на коллекции - то и на Маке сработает, а вот как там с "Provider=Microsoft.ACE.OLEDB.12.0;" я не в курсе, но сомневаюсь...
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
20.10.2016, 12:05
ну если просто то суть запроса сводится к тому чтобы
получить из 2 столбца сводную таблицу
для этого берется столбец из первой таблицы группируется и считается количество одинаковых значений
далее к этим двум столбцам добавляется столбец с количеством значений из второй таблицы
вообщем получается что-то типа сводной таблицы
ну а дальше просто дело техники
на счет коллекции или словаря - я с ними мало работал (находятся в стадии изучения)
так что по поводу "проще" ни чего сказать не могу - ясно одно цикл это долго
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
20.10.2016, 12:20
С коллекцией просто.
Правда именно само копирование у меня в офисе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
Сообщений: 164
20.10.2016, 14:54  [ТС]
К сожалению выдает ошибку на строке
Code
1
 rs.Open strSQL, objConnection, 3, 3.
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
20.10.2016, 15:02
Видите ли
код который вам предоставлен имеет очень много условностей
например Номер заявки должен располагаться именно во втором столбце
сверху не должно быть пустых строк
т.е. строка с названиями столбцов должна находиться в первой строке таблицы
и там много еще чего

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

Добавлено через 8 минут
snipe, при ошибке возникает окно "Run-time error '-217217865(80040e37): Объект "Лист1$a2:f-1" не найден ядром СУБД Microsoft Access. Убедитесь, что объект существует, а его имя и путь к нему указаны правильно. Если объект "Лист1$a2:f-1" не является локальным, проверьте сетевое подключение или обратитесь к администратору сервера."
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
20.10.2016, 15:40
Ну тогда объясните подробно почему нужны две строки, раз без повторов только одна строка.
Подозреваю что тогда проще писать код используя словарь.
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 164
20.10.2016, 15:53  [ТС]
Попробую объяснить на примере более подробно. У строки 3 нет дубляжа в таблице 2 поэтому данную строку переносим на другой лист. Строка 4 имеет дубль в таблице 1(это строка 5) и в таблице 2(это строка 25). Как я представляла действие кода(возможно допотопно): берется ячейка В4 и сравнивается со значениями в таблице 2, доходит до ячейки В25, значения равны и исключаюбтся их сравнения, соответственно берется следующая ячейка В5 и сравнивается со значениями в таблице 2, не находит равных(так как В25 исключена их дальнейшего сравнения), строка 5 переноситься на лист "Не дубликаты".
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
20.10.2016, 16:00
Вот попробуйте, тоже на коллекции:
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
Сообщений: 164
20.10.2016, 16:34  [ТС]
Hugo121 спасибо, работает)))

Добавлено через 14 минут
А можно поподробнее? Хотелось бы разобраться какая часть за что отвечает
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
20.10.2016, 20:41
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
Сообщений: 164
21.10.2016, 09:54  [ТС]
Спасибо за пояснения. Хотелось бы уточнить - если в таблице 2 будет строка без дубля в таблице 1 код будет работать корректно? и как можно это значение перенести на отдельный лист?

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru