#vba #ms-access #duplicates
#vba #ms-access #дубликаты
Вопрос:
У меня есть форма в MS Access, которая собирает отзывы от 4 пользователей. После того, как пользователи заполнили форму, появляется переменная с именем «sResultAll», которая объединяет в нее все отзывы (из нескольких текстовых полей) и передает ее значение в текстовое поле с именем «txtRecommendation».
sResultAll = sResult1 amp; sResult2 amp; sResult3 amp; sResult4
txtRecommendation.Value = sResultAll
Проблема, с которой я сталкиваюсь, заключается в том, что несколько пользователей предоставляют буквально одинаковые отзывы, поэтому мне нужен способ устранения дубликатов в переменной sResultAll.
Заранее спасибо за любой вклад.
Комментарии:
1. Какой код вы пробовали до сих пор? Где у вас возникли проблемы с этим? Пожалуйста, укажите это в своем вопросе.
2. Вы могли бы использовать словарь сценариев, чтобы избавиться от дубликатов, а затем создать результирующую строку из ключей словаря.
3. Большое спасибо @BraX! Ваш подход был точен в точку! Мне жаль, что я не смог поделиться кодом, я никогда раньше не работал с «Словарным объектом» и даже не знал, как начать кодирование.
Ответ №1:
Вечер пятницы, 5:55, больше нечего делать. Вот халява:
Как предположил @braX, объект Dictionary отлично подходит для отслеживания уникальных строк, поскольку он может быстро искать свои текущие ключи с .Exists
помощью функции. Это позволяет вам проверить, была ли строка уже введена, прежде чем добавлять ее в коллекцию.
Чтобы улучшить эту идею, я также предлагаю вам очистить строки перед их сравнением. Принудительно приведите их все к одному регистру и удалите не буквенно-цифровые символы. Таким образом, строки будут совпадать независимо от пробелов, знаков препинания или заглавных букв.
Sub Example()
Const sResult1 As String = "George"
Const sResult2 As String = "Fred"
Const sResult3 As String = "John"
Const sResult4 As String = "gEORGE "
Debug.Print Join(DistinctOf(sResult1, sResult2, sResult3, sResult4), ", ")
'Outputs: George, Fred, John
End Sub
Function DistinctOf(ParamArray Strings() As Variant) As Variant()
Dim AlphaNumericOnly As Object
Set AlphaNumericOnly = CreateObject("VBScript.RegExp")
With AlphaNumericOnly
.Global = True
.MultiLine = True
.Pattern = "[^A-Za-z0-9] "
End With
Dim Distinct_Strings As Object
Set Distinct_Strings = CreateObject("Scripting.Dictionary")
Dim str As Variant
For Each str In Strings
Dim AO_str As String
AO_str = AlphaNumericOnly.Replace(LCase(str), "")
If Not Distinct_Strings.exists(AO_str) Then Distinct_Strings.Add AO_str, str
Next
DistinctOf = Distinct_Strings.Items
End Function
Комментарии:
1. Большое спасибо @Toddleson!!! Ваш пример кода открыл мне путь к тому, как решить мою проблему!!