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

Сравнение текстовой строки с заданным словарём

24.11.2021, 17:34. Показов 3404. Ответов 22

Студворк — интернет-сервис помощи студентам
Добрый день, есть массив слов, с которым нужно сравнить выгруженные наименования товаров. Для 1 слова код написан, а как пройтись по всем словам из словаря, по типу: проверил слово "Фрутоняня", переходи к проверке "коблево" и т.п., не могу придумать, помогите, пожалуйста, привожу код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub tm()
Application.ScreenUpdating = False
a = "ФрутоНяня"
For i = 2 To 689 'строки
If InStr(1, Cells(i, 1).Value, a) <> 0 Then
Cells(i, 6).Value = a
 
End If
Next
Application.ScreenUpdating = True
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2021, 17:34
Ответы с готовыми решениями:

Сравнение текстовой строки с заданным словарем VBA
Добрый день, есть массив слов, с которым нужно сравнить выгруженные наименования товаров. Для 1 слова код написан, а как пройтись по всем...

Сравнение слов со словарём
У нас один 1.тхт документ с правильными словами..и еше один 2.тхт файл с неправильными словами в предложениях.. например: на 1.тхт...

Сравнение текста файла со словарем Dictionary<>
Здравствуйте, есть набросок программы, которая считывает данные с нескольких файлов, и показывает слова с самой большой частотой....

22
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,720
24.11.2021, 18:01
Строки, с которыми сравнивать, можно поместить заранее в массив или словарь (введя руками, считав с листа или из файла). Далее если найдено/не найдено там - такие-то действия.
0
0 / 0 / 0
Регистрация: 08.12.2017
Сообщений: 38
24.11.2021, 18:43  [ТС]
добавить словарь смогу. А как задать это условие перебора всех его значений, подскажите, пожалуйста)
0
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,720
24.11.2021, 18:50
Вы цель опишите? Сравнить значение, взятое с листа, со списком (массивом или словарем) и выполнить какие-то действия? Если найдено, дальше все равно проверяем? Просто обычно так: нашли в словаре - сделали, не нашли - сделали другое. И перешли к следующему элементу листа, снова ищем его в словаре. Т.е. сам словарь не перебирается от и до.

Вот кусок из реальной программы:
Visual Basic
1
2
3
4
5
6
7
8
9
10
   ' Чтение эталонов в словарь
   Application.StatusBar = "Чтение эталонов"
   Set dicEtal = CreateObject("Scripting.Dictionary")
   With ThisWorkbook.Sheets(shEtal)    ' сохранить необходимые эталоны в словарь
      iLastRow = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
      For i = 2 To iLastRow
         xStr = CStr(.Cells(i, "B").Value)   ' значение - важно взять так!
         If xStr <> "" Then If Not dicEtal.Exists(xStr) Then dicEtal.Add xStr, CStr(.Cells(i, "A").Value) ' key, item
      Next
   End With
И далее, когда надо проверить, есть ли строка xStr в словаре:
Visual Basic
1
If dicEtal.Exists(xStr) Then xStr = dicEtal.Item(xStr)   ' замена по словарю
0
Часто онлайн
 Аватар для КостяФедореев
987 / 637 / 280
Регистрация: 09.01.2017
Сообщений: 2,080
24.11.2021, 19:03
anastasia1986, файл то покажите, по быстрей дело пойдет...

Добавлено через 1 минуту
У Вас где находится список со значениями: фрутоняня, кобелево и т.д.?
На том же листе где и словарь?
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
24.11.2021, 21:15
Лучший ответ Сообщение было отмечено anastasia1986 как решение

Решение

anastasia1986,

Привет , если ключевым является
Цитата Сообщение от anastasia1986 Посмотреть сообщение
массив слов, с которым нужно сравнить выгруженные наименования товаров
то возможно так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub tm()
a = Array("ФрутоНяня", "коблево", "шнобелево")
Application.ScreenUpdating = False
    For i = LBound(a) To UBound(a)
        For j = 2 To 689 'строки
            If InStr(Cells(j, 1).Value, a(i)) <> 0 Then
                Cells(j, 6).Value = a(i)
                Exit For
            End If
        Next j
    Next i
Application.ScreenUpdating = True
End Sub
1
0 / 0 / 0
Регистрация: 08.12.2017
Сообщений: 38
25.11.2021, 11:18  [ТС]
поскольку значение из словаря может встречаться не один раз, убрала выход из цикла For и все работает) спасибо)
0
0 / 0 / 0
Регистрация: 08.12.2017
Сообщений: 38
26.11.2021, 14:01  [ТС]
Оператор InStr не подходит, так как поиск нужен отдельных слов, а он может вырезать часть слова из тестовой строки. Путем проб нашла более подходящий Like, протестировала на 1 слове, работает, а при попытке добавить в готовый код со словарем уже нет( Очень прошу помощи)
Задача: сравнить строки с наименованиями товаров с ключевыми словами в словаре ("коблево", "Фрутоняня", "Gala" и иже с ними), если находишь слово в строке, Пример "Пюре Фрутоняня 120 г с грушей", то запиши в столбец F.
Привожу код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub tm()
a = Array("Gala", "LekoPro", "1000 секретов", "21 канал", "32 Перлини Kids", "4MOVE", "7 day's", "7UP", "7я", "Absolut", "Active", "Activex", "ACTIVUS", "ADMIRALSKA", "Agrola", "Ahmad tea", "Air Wick", "Airwaves", "AL Capone", "Albatros", "ALBERTO", "Aleo", "ALEXANDRION", "Alexis", "Alexx", "Allatini", "Alles GUT!", "Almond", "Alokozay", "Always", "Ambassador", "Ani", "Anri", "Aperitivo", "APEROL", "Apostrophe", "APPS", "AQUA ZENI", "Aquafresh", "Aquarte", "ARAZANI", "Ariel", "Aris", "Arko", "ARMAVENI", "ARMEN BAGRANYAN", "Arrighi", "ARTWINE", "Artwinery", "Askold", "Astafian", "Attuale", "Axe", "Azercay")
Application.ScreenUpdating = False
For i = LBound(a) To UBound(a)
For j = 2 To 689 'строки
If Cells(j, 2) Like a(i) Then
Cells(j, 6).Value = a(i)
End If
Next j
Next i
Application.ScreenUpdating = True
End Sub
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
26.11.2021, 14:23
anastasia1986,

попробуйте строку 6 заменить на

If Cells(j, 2) Like "* " & a(i) & " *" Then
1
0 / 0 / 0
Регистрация: 08.12.2017
Сообщений: 38
26.11.2021, 17:48  [ТС]
Да, работает, спасибо

Добавлено через 3 часа 3 минуты
Протестировала на массиве, макрос рабочий, но не нашел похожие слова "Colgate", "Coca-cola", которые были в строке второго столбца, подозреваю, что вопрос в написании самих значений другим языком, если так, как можно это исправить? Может, попробовать Find?
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
26.11.2021, 17:50
anastasia1986,
Вы можете файлик приложить?
0
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,720
26.11.2021, 18:02
Самый простой способ, без программы - скопировать строку, вставить в редактор FAR и пройтись стрелочками под буквами. В статусной строке сверху будут их коды.
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 537
26.11.2021, 18:39
Цитата Сообщение от anastasia1986 Посмотреть сообщение
макрос рабочий, но не нашел похожие слова "Colgate", "Coca-cola"
они похоже находятся в начале или конце строки, тогда могло бы помоч строку № 6 макроса писать так:

Visual Basic
1
2
3
If Cells(j, 2) Like "* " & a(i) & " *" or _
If Cells(j, 2) Like "*" & a(i) & " *" or _
If Cells(j, 2) Like "* " & a(i) & "*"  Then
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
26.11.2021, 19:11
elixi,
Там может быть 100500 вариантов :запятые, кавычки , тире и т.д. и т.п.

поэтому и попросил файл...
А гадать по одному - неохота...
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 537
26.11.2021, 22:39
Цитата Сообщение от Narimanych Посмотреть сообщение
Там может быть 100500 вариантов :запятые, кавычки , тире и т.д. и т.п.
поэтому и попросил файл...
А гадать по одному - неохота...
да, я согласен
0
 Аватар для Святой НякаЛайк
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
28.11.2021, 00:23
Цитата Сообщение от elixi Посмотреть сообщение
If Cells(j, 2) Like "* " & a(i) & " *" or _
If Cells(j, 2) Like "*" & a(i) & " *" or _
If Cells(j, 2) Like "* " & a(i) & "*"  Then
Зачем три строчки кода, если всё можно решить командами Lcase и trim, примененным и к элементам массива и к значениям в ячейках?

Цитата Сообщение от anastasia1986 Посмотреть сообщение
For i = LBound(a) To UBound(a)
For j = 2 To 689 'строки
If Cells(j, 2) Like a(i) Then
Cells(j, 6).Value = a(i)
End If
Next j
Next i
Тема рабочая, конечно, но если изменится количество строк заполненных в файле, то вам придётся менять код и так каждый раз. Для нахождения последней заполненной строки в столбце B (если столбец заполнен без пустых строк!) используйте range("B1").End(xldown).Row
И пожалуйста помните, что Массив и Словарь - это разные вещи в vba. Массив приходится для каждого слова полностью перебирать, пока не найдётся нужное. Если ваши данные хранятся в Словаре ("Dictionary"), то можно просто спрашивать у словаря, есть ли в нём искомое значение. Команда Exists одной строкой кода даст вам ответ, есть ли в словаре искомое слово. Вам давали в ответах такое решение со словарём и командой ексистс.


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub tm()
    a = Array("Gala", "LekoPro", "1000 секретов", "21 канал", "32 Перлини Kids", "4MOVE", "7 day's", "7UP", "7я", "Absolut", "Active", "Activex", "ACTIVUS", "ADMIRALSKA", "Agrola", "Ahmad tea", "Air Wick", "Airwaves", "AL Capone", "Albatros", "ALBERTO", "Aleo", "ALEXANDRION", "Alexis", "Alexx", "Allatini", "Alles GUT!", "Almond", "Alokozay", "Always", "Ambassador", "Ani", "Anri", "Aperitivo", "APEROL", "Apostrophe", "APPS", "AQUA ZENI", "Aquafresh", "Aquarte", "ARAZANI", "Ariel", "Aris", "Arko", "ARMAVENI", "ARMEN BAGRANYAN", "Arrighi", "ARTWINE", "Artwinery", "Askold", "Astafian", "Attuale", "Axe", "Azercay")
    Application.ScreenUpdating = False
    Dim MySTR As String
    For i = 2 To Range("B2").End(xlDown).Row 'строки
        MySTR = Trim(LCase(Cells(i, 2)))     ' чтоб лишний раз не обращаться к ячейкам, запоминаем значение ячейки в переменную
        For j = LBound(a) To UBound(a)  ' элементы массива
            If MySTR Like "*" & LCase(Trim(a(j))) & "*" Then
                Cells(i, 6).Value = a(j)
                GoTo n ' Если нашли искомое, зачем продолжать просмотр массива? Переходим к следующей ячейке!
            End If
        Next j
n:
    Next i
    Application.ScreenUpdating = True
End Sub
Вот вариант с решением вопроса пробелов и частичной оптимизацией.
Очень желательно всё-таки хранить марки товаров в Dictionary и проверять через exists. Говорят, Словарь - это хеш-таблица, значит поиск там командой ексистс проводится в одну итерацию (O(1)), что даёт максимально возможную скорость нахождения слова в словаре.
Ещё очень желательно взять значения ячеек в массив и сравнивать два массива в памяти, записывая результаты в третий массив, а потом его выбрасывать обратно на лист. Поверьте опыту: Когда дело дойдёт до нескольких тысяч значений, такая практика за долю секунды отработает, а код, который перебирает ячейки одну за одной, будет отрабатывать за минуты. Ускорение обычно раз в 30, если через массивы делать.
0
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,720
28.11.2021, 01:06
Хочу спросить, а как работать, если надо взять несколько колонок с листа и обработать? Как такой массив получить и как его потом правильно выбросить на лист? Скажем, в работе нужны A, C, D, E, K - со 2-й строки (в 1 заголовок) и до последней. По ним надо пройти, что-то поискать из этих значений в словаре, другие заменить и т.д. И обратно положить.
0
 Аватар для Святой НякаЛайк
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
28.11.2021, 01:50
Лучший ответ Сообщение было отмечено Zeag как решение

Решение

Цитата Сообщение от Zeag Посмотреть сообщение
а как
Вот так:

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
Sub Zeag()
Dim L As Long, J As Long
Dim indexesArr(1 To 5) As Long
indexesArr(1) = 1
indexesArr(2) = 3
indexesArr(3) = 4
indexesArr(4) = 5
indexesArr(5) = 11
' Здесь лежат удобные номера столбцов
 
Dim myArr(1 To 5)
myArr(1) = Range(Cells(2, 1), Cells(Cells(2, 1).End(xlDown).Row, 1)).Value    ' A
myArr(2) = Range(Cells(2, 3), Cells(Cells(2, 3).End(xlDown).Row, 3)).Value    ' C
myArr(3) = Range(Cells(2, 4), Cells(Cells(2, 4).End(xlDown).Row, 4)).Value    ' D
myArr(4) = Range(Cells(2, 5), Cells(Cells(2, 5).End(xlDown).Row, 5)).Value    ' E
myArr(5) = Range(Cells(2, 11), Cells(Cells(2, 11).End(xlDown).Row, 11)).Value ' K
' Получен массив массивов, это одномерный массив из пяти элементов, _
каждый элемент массива - двумерный массив. _
В двумерном массиве значения ячеек соответствующего столбца. _
Получение этого массива значений очень быстрое и обработка их с коде - тоже. _
Нет необходимости в отключении отрисовки через (ScreenUpdate = false)
 
' Пять строк с "myArr(1) = ..." писал для наглядности и понимания, можно было упихать в цикл...
 
' Вот пример прохода в цикле по такому массиву двумерных массивов
 
For J = LBound(myArr) To UBound(myArr) ' Проход по пяти "Столбцам" - элементам массива массивов
    For L = LBound(myArr(J)) To UBound(myArr(J)) ' В двумерном массиве по всем элементам
        If myArr(J)(L, 1) = 0 Then myArr(J)(L, 1) = 1 ' "L, 1" - Важно помнить, что когда массив получен из ячеек, то это ВСЕГДА двумерный массив и обращение к нему с указанием строки, затем столбца
    Next L
Next J
 
' Теперь выгрузка обратно в ячейки
 
For L = LBound(myArr) To UBound(myArr)
    Range(Cells(2, indexesArr(L)), Cells(UBound(myArr(L)), indexesArr(L))).Value = myArr(L)
Next    ' Какбэ всё
End Sub
Пример.rar
В примере столбцы берутся в массив, в массиве идёт поиск нулей и замена их на единицы и выгрузка обратно в книгу
1
 Аватар для Святой НякаЛайк
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
28.11.2021, 02:00
"Массив массивов двумерных массивов" - ох я и зануда!
Проще наверное будет сказать, что это массив столбцов )
0
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,720
28.11.2021, 02:08
Святой НякаЛайк, спасибо большое! Это однозначно надо изучить, понять и применять. У меня была задача обработки файла автодеталей на 847 тыс. записей, где что-то убиралось, добавлялось, сравнивалось с другими файлами. И хотя словарь поиска и замены был применен, данные все же обрабатывал по ячейкам - не знал про этот способ.

Еще вроде когда-то выдают на лист транспонированный массив, это тоже пока не понял, почему и в каком случае. Пока буду Ваш код разбирать, спасибо!

P.S. ScreenUpdate всегда False при обработке, как и пересчет формул.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2021, 02:08
Помогаю со студенческими работами здесь

Организация работы со словарем: загрузка/выгрузка, поиск слов с заданным корнем
STL Нужно использовать шаблон list (двусвязного списка) для организации работы со словарем basic_string (загрузка/выгрузка, поиск...

Кодирование ulong-значения в string-строку с заданным символьным словарём и обратное декодирование
Мне необходимо осуществить кодирование ulong-значения в string-строку с заданным символьным словарём и обратное декодирование. С...

Сравнение с текстовой константой
В общем, мне нужно так, чтобы при вводе sin выдавало &quot;верно!&quot;, но по какой-то причине выдает неверно. вот код: #include &lt;iostream&gt; ...

Сравнение переменных сессии и текстовой
Здравствуйте! Можете ли подсказать, как сохранить значение сессии $_SESSION; и значение текстовое:

Чтение из файла и сравнение с текстовой переменной
Народ нужна помощь... Запарился писать ни чего не выходит! Я новичок в программировании на С++ Builder, поэтому не судите строго!!! Вобщем...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru