Удаление повторяющихся слов в строке, в которой ранее были объединены другие переменные

#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!!! Ваш пример кода открыл мне путь к тому, как решить мою проблему!!