Страницы: 1
RSS
Вытащить год из текста ячейки
 
Здравствуйте!

Есть множество ячеек, в которых среди прочих данных содержится год (четыре цифры, например, 2015). Эти 4 цифры года надо вытащить в отдельную ячейку. Год разный, но больше 2000, поэтому думал использовать 20##, через instr найти позицию первой цифры, потом через mid вытащить 4 символа с полученной позиции.

Но
Код
InStr(Cells(2, 1), "20##")
возвращает 0. Если задать жестко, например, 2015, номер позиции возвращает корректно.

Как лучше поступить?

Спасибо!
 
А когда # стали подстановочными символами?
Изменено: bigorq - 17.06.2020 17:08:00
 
А тему https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=129832 бросили?
 
Уважаемый Kuzmich,, к сожалению, пришлось переключиться на другую задачу, к той теме хотел бы вернуться, но позже!
 
Уважаемый bigorq,

Цитата
А когда # стали подстановочными символами?
Не знаю, пропустят ли ссылку на внешний сайт (microsoft))), но вот тут
https://docs.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/wildcard-characte...
написано, что
#Любая цифра (09)
 
Попробуйте использовать Like
 
Цитата
domybest написал:
написано, что#Любая цифра (09)
для оператора Like.
 
Цитата
Попробуйте использовать Like
простите мое незнание, как можно использовать Like, чтобы вернуть номер нужного символа в ячейке? Или вы имеете в виду вообще другую логику решения этой задачи?

а если написать
Код
InStr(Cells(2, 1), like "*20##*")
то ругается...
Изменено: domybest - 17.06.2020 17:30:35
 
Цитата
domybest написал: среди прочих данных содержится год
Помогающие должны догадываться?
Цитата
domybest написал: Как лучше поступить?
Правила форума прочитать! Показать файл-пример
 
Прикладываю пример
 
Цитата
вообще другую логику решения этой задачи?
UDF
Код
Function iYear(cell$)
 With CreateObject("VBScript.RegExp")
     .Global = True
     .Pattern = "20\d{2}"
     iYear = .Execute(cell)(0)
 End With
End Function
 
Kuzmich, большое спасибо!
Пора учить регулярки...

небольшое дополнение, если вдруг у кого-то еще возникнет такая задача:
предложенное решение приведет к остановке выполнения кода, если в какой-то ячейке вдруг будет отсутствовать год
 
На этом примере и без регулярок можно, вот древнее:
Код
Public Function ExtractNumber(s As String)
    Dim i As Integer, str As String, a$
    For i = 1 To Len(s)
        a = Mid(s, i, 1)
        If InStr(1, "1234567890,", a) Then str = str & a
    Next
    ExtractNumber = str
End Function

Function Num(txt As String)    ' As Long
    Dim N&
    For N = 1 To Len(txt)
        If Mid(txt, N, 1) Like "#" Then Num = Num & Mid(txt, N, 1)
    Next N
End Function

Function GetNumeric(t As String)
    Dim j As Integer, l As String
    For j = 1 To Len(t)
        If IsNumeric(Mid(t, j, 1)) Then l = l & Mid(t, j, 1)
    Next j
    GetNumeric = Val(l)
End Function
Изменено: Hugo - 17.06.2020 17:54:38
 
Цитата
domybest написал: а если написать... то ругается...
Наверное, с мольбой просит: учите синтаксис :)

Код
    Dim lYear As Long
    Dim sTxt As String

    sTxt = Cells(2, 1).Value
    lYear = --Mid$(sTxt, InStr(sTxt, "20"), 4)

Если в тексте еще где-то будет 20, нужны дополнительные проверки
 
Цитата
если в какой-то ячейке вдруг будет отсутствовать год
Для этого существует
Код
If .Test(cell) Then
 
В яч. C2: =--ПСТР(A2;НАЙТИ("20";A2);4)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
Страницы: 1
Наверх