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

Поиск и извлечение определенного числа из текста

22.02.2012, 03:38. Показов 6854. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите кто сможет. Есть столбец с пояснениями, в нем по мимо текста есть номер отдела, вопрос в том как вытащить его в сосоднюю ячейку. Дело осложнчетсч еще тем что их воснмь штук. А некоторые пояснения вообще не содержат номера отдела.

Вот примерно как должно выглядеть.

Code
1
2
3
4
5
6
7
8
А                    В
Текст 4157           4157
Текст 4205 текст     4205
Тект 03 7151         7151
Текст 4567 8635      8635
Текст 8636           8636
8567 текст           8567
Тест 547 текст       0
Помогите с задачкой кто сможет. Буду очень признателен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2012, 03:38
Ответы с готовыми решениями:

Поиск текста в ячейках определенного цвета
Добрый день, уважаемые программисты. Помогите решить вопрос. В книге находится несколько листов, некоторые ячейки которых...

Поиск определенного текста в столбце(строке) и удаление всей строки
Друзья, подскажите, пожалуйста, как в определенном столбце найти определенный текст и удалить все строки содержащие этот текст. Или не...

Поиск определенного текста в файле .txt и вставка в определенную ячейку в Excel
Доброго времени суток. Допустим есть файл info.txt ( состоит из множества строк, например gsd = 797 .... dig = 7666 и т.д.) в корне в с...

25
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
22.02.2012, 13:48
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Izvlchislo()
    With ActiveSheet
        For i = 1 To .UsedRange.Rows.Count
            aa = Split(.Cells(i, 1), " ")
            bb = 0
            For j = LBound(aa) To UBound(aa)
                If IsNumeric(aa(j)) Then
                    If Len(aa(j)) = 4 Then bb = aa(j)
                End If
            Next
            .Cells(i, 2) = CInt(bb)
        Next
    End With
End Sub
1
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 7
27.02.2012, 09:45  [ТС]
Есть проблема. он не вытаскивает число если с ним рядом запятая или скобка. Можно ли это как нибудь дополнить.
0
210 / 96 / 6
Регистрация: 23.07.2010
Сообщений: 235
27.02.2012, 11:22
Попробуй так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Izvlchislo()
    With ActiveSheet
        For i = 1 To .UsedRange.Rows.Count
            aa = Cells(i, 1)
            bb = ""
            For j = Len(aa) To 1 Step -1
            If Len(aa) > 4 Then
                cc = Mid(aa, j, 1)
                If cc = " " And (Len(bb) = 4 Or j < 5) Then GoTo m1
                If cc = " " And Len(bb) < 4 Then bb = ""
                If IsNumeric(cc) Then
                    bb = cc & bb
                    If Len(bb) = 4 Then .Cells(i, 2) = CInt(bb)
                End If
            End If
            Next
m1:
        Next
    End With
End Sub
1
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
27.02.2012, 17:54
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Izvlchislo()
    Dim Zn As String
    simvols = ".,$;:()" ' ïðè íåîáõîäèìîñòè äîïîëíèòü
    With ActiveSheet
        For i = 1 To .UsedRange.Rows.Count
            Zn = .Cells(i, 1)
            For s = 1 To Len(simvols)
                Zn = Replace(Zn, Mid(simvols, i, 1), "")
            Next
            aa = Split(Zn, " ")
            bb = 0
            For j = LBound(aa) To UBound(aa)
                If IsNumeric(aa(j)) Then
                    If Len(aa(j)) = 4 Then bb = aa(j)
                End If
            Next
            .Cells(i, 2) = CInt(bb)
        Next
    End With
End Sub
Добавлено через 41 минуту
В строке 6 заменить i на s
1
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
27.02.2012, 22:20
вариант
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub bb()
Dim c As Range
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "\d{4}"
    On Error Resume Next
    For Each c In ActiveSheet.UsedRange.Columns(1).Cells
        With .Execute(c.Value)
            c(, 2) = .Item(.Count - 1)
            If Err Then Err.Clear: c(, 2) = 0
        End With
    Next
End With
End Sub
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
27.02.2012, 23:26
Не всё понятно в вопросе. Чем восьмая строчка отличается от 3?
Неужели тем, что в одном случае в ячейке Текст, а в другом Тест?
Но в 8 строке должно получиться 0

Добавлено через 8 минут
Если только номера отделов строго четырёхзначные.
Но тогда в строке 5 два номера!?
Как всё запутано. А с учётом того, что:
осложнчетсч еще тем что их воснмь штук
+
О великий и могучий! За что же тебя так??

Как я перевёл, целых восемь штук, то вручную будет сделать намного проще чем описывать все ограничения и условия.
0
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 7
28.02.2012, 04:56  [ТС]
Извиняюсь если вопрос написал не совсем корректно. Есть восемь наименований отделов. Каждый состоит из 4 цифр. По мимо их в тексте есть и другие цифры мне не нужные, по этому простое удаление текста мне не подходило. И вручную перебирать занимает много времени т. к. записей очень много.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
28.02.2012, 10:34
Если номеров отделов всего 8, а записей очень много, то я бы не искал просто числа, даже если они четырёхзначные(это подтвеждает строка 5), а в самом макросе явно указал все номера отделов. Например в начале процедуры загрузив их в словарь(или массив) и потом проверял вхождение. Правда ньюанс: не может ли быть в строках чисел разрядностью больше 4, но содержащих комбинацию номера отдела? Тогда придётся всё равно выделять числа и сравнивать каждое выделенное число с образцами
0
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 7
28.02.2012, 11:27  [ТС]
В каждой ячейке либо есть один из восьми наименований отдела, либо нет. Они написаны безобразно, то вначале текста то в середине, то еще где нибудь. но они всегда одни и те же. Могут быть написаны через "\" с каким нибудь другим числом и т. д. Как я понял вы предлагаете проверять каждую ячейку на наличие одного из наименований, в случае его нахождения происходит запись найденного в соседнюю ячейку, если же ни один не найден то в соседней ячейке ставится 0.
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
28.02.2012, 14:43
задача не формализованная, как ни крути, что подтверждает приведенный пример. идея Alex77755 со словарем или массивом в коде единственно вменяемая, но не дает 100% гарантии верной работоспособности в условиях написания отдела количеством N произвольных способов, включая всевозможные перестановки слов и позиции номера отдела. если есть возможность, желательно ограничить ввод пользователями отделов строго из справочника, как например, можно сделать в Excel при помощи Данные - Проверка - Список.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
28.02.2012, 15:39
то в соседней ячейке ставится 0.
не обязательно. Ставь(или не ставь) что хочешь
0
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 7
28.02.2012, 16:21  [ТС]
Алекс, а можно хотя бы пример, как это сделать. я новичок в этом деле и даже не знаю как это можно реализовать(((
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
28.02.2012, 17:20
примерно так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub QWERT()
Dim M()
Dim K()
Dim R, C
Dim LR
'В "I2:I9" находится список всех 8 номеров
'В столбце А обрабатываемый список
K = Range(Cells(2, 9), Cells(Cells(Rows.Count, 9).End(xlUp).Row, 9)) ' список номеров
M = Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 2)) ' общий список
For R = 1 To UBound(M)
    For C = 1 To UBound(K)
        If InStr(1, M(R, 1), K(C, 1)) > 0 Then
             M(R, 2) = K(C, 1)
             Exit For
        End If
    Next C
Next R
Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 2)) = M
End Sub
Добавлено через 2 минуты
Если в ячеке окажется просто число содержащеее комбинацию цифр как и в номере - покажет, что есть. Но я же предупреждал. Если такое возможно, то надо добалять еще обработчик
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
28.02.2012, 17:56
обязательно на VBA нужно решать? можно это сделать и формульно в Excel:
Code
1
=ПРОСМОТР(2;1/ПОИСК($G$1:$G$8;A1);$G$1:$G$8)
в A1 - исходный текст
в $G$1:$G$8 - словарь
если номер отдела найден, то он возвращается, если не найден, то значение ошибки #Н/Д
и заче тут огород с VBA городить?

Добавлено через 5 минут
еще вариант (формула массива):
Code
1
=МАКС(СЧЁТЕСЛИ(A1;"*"&$G$1:$G$8&"*")*$G$1:$G$8)
если номер (обязательно число) есть - возвращается, если нет -0
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
28.02.2012, 18:09
и заче тут огород с VBA городить?
Приходилось сталкиваться с книгами, которые из-за напичканности формулами открывались более 12 минут. Так же при изменении какой-нибудь ячейки зависали минут на 5 для пересчёта всех формул.
Поэтому при больших массивах стараюсь отказываться от формул и функций.
Но это, конечно, дело любительское
0
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 7
29.02.2012, 08:05  [ТС]
Что то не выходит. и фомулы тоже не находят половину.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
29.02.2012, 08:30
как то так
Вложения
Тип файла: xls Текст.xls (29.5 Кб, 29 просмотров)
1
 Аватар для ironegg
1905 / 782 / 31
Регистрация: 11.02.2010
Сообщений: 1,567
01.03.2012, 11:35
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Public Function íÎòäåëà(ß÷åéêàÑòåêñòîì, Ñïðàâî÷íèê)
    For Each C In Range("i2:i9").Cells
      s = s & C.Text & "|"
    Next
    With CreateObject("vbscript.regexp"): .Global = True
        .Pattern = "(?:^|\D)(" & Left(s, Len(s) - 1) & ")(?=\D|$)"
        With .Execute(ß÷åéêàÑòåêñòîì)
            If .Count = 1 Then íÎòäåëà = .Item(0).SubMatches(0)
            If .Count > 1 Then íÎòäåëà = "#Îøèáêà"
        End With
    End With
End Function
местами работает лучше, чем другие варианты

строку 2 надо бы заменить на
Visual Basic
1
For Each C In Справочник.Cells
Вложения
Тип файла: xls Текст.xls (64.5 Кб, 38 просмотров)
2
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 7
01.03.2012, 11:46  [ТС]
Все разобрался. работает))) Спасибо большое, очень выручили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2012, 11:46
Помогаю со студенческими работами здесь

Извлечение определенного участка текста
В TextBox1 есть текст &quot;договор № 512 от 01.01.2015 (далее – Договор)&quot; Как по нажатию кнопки в TextBox2 получить &quot;512&quot;, а в...

Поиск определенного текста на экране
Доброго времени суток. ;) :) Я хочу попросить о помощи пользователей данного форума, т.к. мой уровень знаний для написания этого скрипта...

Поиск определенного текста в TextBox
Предположим у нас есть текстовое окно TextBox в нем мы записали куча текста и нам нужно найти определенный текст. то есть сделать команду...

Поиск по файлу определенного фрагмента текста
Добрый день. Столкнулся я со следующей проблемой и посему прошу совета у более опытных товарищей. Необходимо создать программу...

Поиск и замена в запущенном приложении определенного текста
Ребят! Помогите дописать код. Программа должна искать в запущенном приложении определенный текст и подменять его(На манер Cheat Engine) ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru