Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
hdgfade
0 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 2
1

Искать последовательность типов символов в ячейке (цифра,цифра, пробел, буква, буква, буква)

31.08.2018, 01:07. Просмотров 1041. Ответов 4
Метки vba (Все метки)

Доброго времени суток!
Прошу, если не затруднит, помочь определиться каким образом будет лучше реализовать решение задачи.

Суть:
Нужно написать алгоритм, который будет вычленять гос номера машин из ячеек с текстом, причём ячейки не имеют чёткого разграничения, вроде "4456А7 на шасси Урал 55571-1151-70 гос.номер А555АА 186", они везде указаны по разному. Иногда гос номер - это единственный текст в ячейке, иногда он идёт в начале, иногда в середине, иногда может быть без пробелов, иногда пробелы есть, но не все, вроде "А555 АА186"

Как я вижу решение и что мешает сделать:
Предполагаю что задача будет решена если произвести такого рода алгоритм:
1 - прописать все возможные последовательности букв, цифр и пробелов (для гос номеров их 32 с учётом формата номеров для спецтехники и того, что регион не всегда указан, вроде "АА5555, АА 5555 55, АА5555 55", и т.д.). Все последовательности - имеется ввиду "1 буква, пробел, 3 цифры, пробел, 2 цифры", и т.д.
2 - прописать возможные буквы для гос номера (А,В,С,Е,К,Н,М, и т.д.)
3 - взять значение ячейки
3 - Проверять по каждому символу, если это буква не из списка из п.2 - дальше, если из него - смотреть что идёт после неё. И так, если найдётся значение, попадающее под условия п.1 - вынести его в клетку правее.

Что мешает:
1 - Не знаю как начать смотреть по каждой букве(как с ячейками цикл, где "cells(r,c), r=r+1", только вместо координат ячеек, координаты символов в одной ячейке).
2 - Не знаю как задать соответствие п.1 и 2, то есть, как лучше - проверять всё по очереди, или же есть возможность создать какое-то условие, которое будет обозначать последовательность букв, цифр, и пробелов, не учитывая значение символа, а только тип.

Буду очень благодарен если подскажете какие функции могут мне помочь, куда смотреть, да и вообще, быть может, есть решение гораздо проще.

Большое спасибо!
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2018, 01:07
Ответы с готовыми решениями:

Как проверить находится ли в ячейке число или буква
Всем привет! Скажите, пожалуйста, как проверить находится ли в ячейке число или буква? Можно ли...

Заглавная буква
Скрипт для MS Word. К искомому слову из списка нужно применить форматирование: начертание...

Заглавная буква
Здравствуйте! Эта функция установки первой буквы заглавной, при условии: сначала строка...

Поиск ячеек, в которых первый символ - латинская буква
Доброго дня! Ниже код, который открывает файл, ищет в определенном столбце строку с конкретным...

"Точка пробел цифра" - удаляем пробел
здравствуйте, делаю так 'точка пробел цифра - удаляем пробел reg.Pattern = ". ()" '$1 -...

4
snipe
3170 / 1135 / 277
Регистрация: 07.08.2013
Сообщений: 2,888
31.08.2018, 01:42 2
Цитата Сообщение от hdgfade Посмотреть сообщение
Не знаю как начать смотреть по каждой букве
циклом
Visual Basic
1
2
3
4
5
dim asd$
asd="строка для примера"
for i=1 to len(asd)
msgbox Mid(asd,i,1)
next i
попытаться найти разделитель чтобы быстро откинуть лишнее
это может быть слово или символ
1
Catstail
Модератор
25419 / 13047 / 2432
Регистрация: 12.02.2012
Сообщений: 21,297
31.08.2018, 06:54 3
Мне кажется, здесь просто само просится применить regexp
1
Burk
1037 / 726 / 222
Регистрация: 11.07.2014
Сообщений: 2,535
31.08.2018, 15:45 4
Лучший ответ Сообщение было отмечено hdgfade как решение

Решение

hdgfade, вот вариант решения. Задаете массив возможных вариантов шаблонов (смотрите оператор Like) Shab. Длина какая вам нужна, я поставил 4, а проверял на одном по номерам легковых машин А555АА + пробел. В массиве N число символов в шаблоне с учетом пробела после номера. Если в вашей строке номер в конце строки, то пробел можно не ставить, хотя не принципиально. Запускайте макрос proba

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
Dim Shab(1 To 4) As String, N(1 To 4) As Integer
Function GAI(ByVal S As String)
Dim I As Integer, J As Integer, K As Integer, Sh As String, St As String
S = UCase(Trim(S)) & " "
For J = 1 To 1 '4 'сравниваем с каждым шаблоном
  Sh = Shab(J): St = S: I = 0
  For K = 1 To Len(S) - N(J) + 1
    If Left(St, N(J)) Like Sh Then
      I = K: Exit For
    End If
    St = Mid(St, 2)
  Next
  If I > 0 Then Exit For 'нашли совпадение с I-го символа
Next
If I = 0 Then
  GAI = "Нет совпадений с шаблоном " & S
Else
  GAI = "Регномер = " & Trim(Mid(S, I, Len(Sh) - 1))
End If
End Function
 
Sub proba()
Shab(1) = "[А-Я]###[А-Я][А-Я] ": N(1) = 7
MsgBox GAI("ааа123вв")
End Sub
Добавлено через 44 минуты
hdgfade, переделывал программу и в одном месте оставл старый вариант. Строку 18 заменить на следющую
Visual Basic
1
 GAI = "Регномер = " & Trim(Left(St, N(J)))
1
hdgfade
0 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 2
03.09.2018, 09:02  [ТС] 5
Моя благодарность!
Всё работает, спасибо большое.
0
03.09.2018, 09:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2018, 09:02

Задан текст. Распечатать номера позиции на которых встречается буква «к».
Задан текст. Распечатать номера позиции на которых встречается буква «к».

Задан текст. Распечатать номера позиций на которых встречается буква «к»
Задан текст. Распечатать номера позиций на которых встречается буква «к». Public Sub zzzz()...

Удалить строку, если ее первая буква текста не является заглавной
Ребят, кто-нибудь, пожалуйста, помогите с макросом для Excel ! Вообще не понимаю, как это сделать,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.