Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2010, 21:11   #1
tissot
Пользователь
 
Аватар для tissot
 
Регистрация: 22.03.2009
Сообщений: 31
По умолчанию Выборка конкретного цифрового значения из текста

Здравствуйте, уважаемые знатоки !
Помогите, пожалуйста, в решении следующей задачи (файл во вложении).

Есть строчки, допустим порядка 300, каждая из которых имеет цифровое значение состоящее из 8 цифр. При этом эта цифра, всегда находится в тексте.

Задача состоит в том, чтобы все цифровые значения состоящие из 8-и цифр, находящиеся на одном листе можно было выделить (извлечь) и перенести в другой файл (лист) Excel.

В итоге, на листе останется только текст и остальные цифровые значения (не восьмизначные).

Есть ли какая-то формула, для поиска таких восьмизначных цифр и копирования этих значений ?
Вложения
Тип файла: rar Реестр.rar (3.8 Кб, 21 просмотров)
С уважением,
Tissot
tissot вне форума Ответить с цитированием
Старый 07.10.2010, 21:44   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Если в качестве разделителей всегда используются запятые или точки с запятой, можно с помощью команды Split разбить строку на подстроки и сверять их длину с 8, а затем проверять, все ли в строке является цифрой
motorway вне форума Ответить с цитированием
Старый 07.10.2010, 22:30   #3
tissot
Пользователь
 
Аватар для tissot
 
Регистрация: 22.03.2009
Сообщений: 31
По умолчанию

Честно говоря, я не совсем понял, что Вы имели ввиду, а может быть Вы не поняли. Нужно сделать так, чтобы по всему листу цифра (код) обязательно состоящая из 8-ми цифр, каким-то образом выделилась, (а таких восьмизначных цифр в тексте будет, например 300).
Так вот, необходимо найти именно эти цифры и их можно было все одновременно скопировать, таким образом произойдет автоматическое отсеивание от других элементов листа (текста и т.д.).
Допустим, при этом в файле вообще нет разделителей вроде , ; . и т.д. а просто сплошной текст и цифры в одной ячейке.
С уважением,
Tissot

Последний раз редактировалось tissot; 07.10.2010 в 22:42.
tissot вне форума Ответить с цитированием
Старый 07.10.2010, 23:02   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Я-то понял, но если разделителей нет, то такой случай как а12345678б не нужно учитывать? По-моему, разделители должны быть хотя бы в виде пробелов, отделяющих это число от других слов. То есть, вам нужно, чтобы число выделялось даже в том случае, если справа и слева непосредственно есть другие знаки (не пробел)?
motorway вне форума Ответить с цитированием
Старый 07.10.2010, 23:15   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Во вложении пользовательская функция NOMER
Вложения
Тип файла: rar Реестр.rar (8.4 Кб, 31 просмотров)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 08.10.2010, 03:31   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

doober, спасибо за функцию (я до сих пор не разобрался с RegExp)

Немного переделал её для себя - чтобы можно было искать любое число цифр:

Код:
Function FindDigits(ByVal txt$, ByVal DigitsCount%) As String
    ' ищет в строке txt$ подстроку цифр длиной DigitsCount%
    Set expres = CreateObject("VBScript.RegExp")
    expres.Pattern = Replace(String(DigitsCount%, "%"), "%", "[0-9]")
    If expres.test(txt$) Then FindDigits = expres.Execute(txt$)(0).Value
End Function

(добавлено - после изучения RegExp по этой статье)
Как выяснилось, в плане алгоритма так будет правильнее:
(ищем блок именно из 8 цифр - блоки из 9 и более цифр не попадают в результат)
Код:
Function FindDigits(ByVal txt$, ByVal DigitsCount%) As String
    ' ищет в строке txt$ подстроку цифр длиной DigitsCount%
    Set RegExp = CreateObject("VBScript.RegExp"): RegExp.Global = True
    RegExp.Pattern = "[\D]": txt$ = " " & RegExp.Replace(txt$, " ") & " "
    RegExp.Pattern = " [\d]{" & DigitsCount% & "} "
    If RegExp.test(txt$) Then FindDigits = Trim$(RegExp.Execute(txt$)(0).Value)
End Function
Для вывода артикулов на отдельный лист используйте такой макрос:

Код:
Sub test()
    Dim cell As Range, ra As Range: Application.ScreenUpdating = False
    Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp))
    shd.UsedRange.ClearContents ' очистка листа
    For Each cell In ra.Cells
        txt = FindDigits(cell.Text, 8)
        If Len(txt) Then shd.Range("A" & shd.Rows.Count).End(xlUp).Offset(1) = txt
    Next cell
    shd.Activate
End Sub

Пример в файле:


Последний раз редактировалось EducatedFool; 08.10.2010 в 04:27.
EducatedFool вне форума Ответить с цитированием
Старый 08.10.2010, 06:42   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

doober, EducatedFool
+1 (каждому). Спасибо за полезную информацию.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.10.2010, 11:49   #8
tissot
Пользователь
 
Аватар для tissot
 
Регистрация: 22.03.2009
Сообщений: 31
По умолчанию

Господа, Вы, конечно, профи. Огромное спасибо 5+.
Задача решена и этот результат, думаю, поможет многим любителям и экспертам.
P/s. Я не профи в макросах, но в контексте этого решения, небольшой вопрос. В какой строчке макроса необходимо внести изменение, чтобы проверка происходила в отношении десятизначной цифры.
С уважением,
Tissot
tissot вне форума Ответить с цитированием
Старый 08.10.2010, 12:26   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
чтобы проверка происходила в отношении десятизначной цифры
А вы формулы в ячейках смотрели?
Код:
  Ячейка: B2      Формула  (стиль A1):   =FindDigits(A2;8)
                  Формула  (стиль R1C1): =FindDigits(RC[-1];8)

  Ячейка: C2      Формула  (стиль A1):   =FindDigits(A2;5)
                  Формула  (стиль R1C1): =FindDigits(RC[-2];5)
Вот эти цифры (которые я выделил красным) и замените на 10

В макросе - аналогично:
Код:
txt = FindDigits(cell.Text, 8)
EducatedFool вне форума Ответить с цитированием
Старый 09.10.2010, 01:06   #10
tissot
Пользователь
 
Аватар для tissot
 
Регистрация: 22.03.2009
Сообщений: 31
По умолчанию

Всё понял ! Всё работает ! Надеюсь, что многим помогут эти ценные советы.
С уважением,
Tissot
tissot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение значения конкретного поля в списке Allan Stark Microsoft Office Access 2 26.10.2009 13:56
Выборка значения, по признаку, из строки SLP Microsoft Office Excel 4 12.02.2009 16:33
Выборка текста frayerok Общие вопросы Delphi 12 21.09.2008 21:44
Окрашивание текста в зависимости от значения art1cool Microsoft Office Excel 2 19.08.2008 12:29