Я не профессиональный программист, но в течение нескольких лет баловался.
У меня есть таблица, содержащая список чисел, предоставленных другой системой, от 0 до 90000, хранящихся в виде строк в столбце.R. Предполагается, что каждая цифра присваивается другой системой как уникальная, однако около 5% фактически используются 1 или более раз ранее.У меня нет контроля над другой системой.
Каждый месяц я добавляю около 50 номеров в этот столбец, и мне необходимо определить, существует ли какой-либо из новых номеров в списке (включая новые, добавленные), иидентифицируйте строку в электронной таблице, которая содержит первый дубликат, а затем каждый последующий дубликат.
В конечном счете мне нужно идентифицировать (например): строка 51 является первой, содержащей строку «000356», и это также появляетсяв строках 357 и 745 Выполнение поиска (в VBA) строка за строкой занимает очень много времени (в настоящее время у меня более 1000 строк).Мне нужно будет выполнить аналогичный поиск по столбцу с более чем 3000 строками.
Мое исследование показывает, что использование словарей VBA будет более быстрым способом идентификации дубликатов, однако в моей небольшой процедуре тестирования, приведенной ниже, яЯ не смог заставить его работать, более конкретно мне нужно определить, в какой строке в электронной таблице существуют повторяющиеся числа. Есть ли лучший способ добиться этого, и что можно сделать, чтобы изменить мой тестовый код ниже, чтобы сделать егоработа?
' From Module M2A to test faster search methods
' Needs "Microsoft Scripting Runtime" enabled
Dim shtCFYsheet As Worksheet
Dim oFound As Boolean
Dim junk, actName As String
Dim lastrowCFYsheet As Long
Dim dictA As New Scripting.dictionary
Dim keyA, keyB As Variant
Set shtCFYsheet = Worksheets("Communify Sheet")
lastrowCFYsheet = shtCFYsheet.Cells(Rows.Count, "A").End(xlUp).Row
' Load up DictA with all the entries from Column R
For i = 2 To lastrowCFYsheet 'Row 1 contains headings
dictA(Trim(shtCFYsheet.Cells(i, "R").Value)) = 1
Next i
For Each keyA In dictA.Keys
junk = DoEvents()
oFound = False 'reset the flag for the next KeyA entry
EntryA = keyA ' Capture the DictA entry
For Each keyB In dictA.Keys 'Search for the first DictA entry throughout the DictA dictionary
EntryB = keyB ' Capture the DictB entry
'Test for a match
If Trim(EntryA) = Trim(EntryB) Then
If oFound = True Then Debug.Print "Match:" & EntryA, EntryB, "A-row " & dictA.Item(keyA), "B-row " & dictA.Item(keyB)
'Ignore first match as that's my own entry
oFound = True 'Now set flag so that next entry gets flagged as a duplicate
End If
Next keyB
Next keyA
End Sub
Спасибо всем.Вот некоторые примеры данных с 2 дубликатами в:
2456
4863
4190
2123
5610
9061
2640
679
4702
7428
38
3082
4702
8391
8781
998
2091
3729
5610
5051
1796
3355
169
1788
8838