Страницы: 1 2 След.
RSS
Как вытащить из ячейки IP адреса, записанные вместе с текстом?
 
Вот пример в котором содержатся ip адреса [ в квадратных ] скобках и с ними текст описания.
Задача вытащить все IP адреса из этой ячейки.
Ранее использовал
Код
=ЕСЛИОШИБКА(ЛЕВСИМВ(ПРАВСИМВ(A3;ДЛСТР(A3)-ПОИСК("[";A3;2));
          ПОИСК("]";ПРАВСИМВ(A3;ДЛСТР(A3)-ПОИСК("[";A3;2)))-1);"Нет IP") 

Все было нормально до того момента как в списке коммутаторов не стало появляться их больше 1го.
Пример во вложении.
 
Выделите ячейки. Запустите макрос. Справа от первого выделенного столбца выведет список IP.
Код
Sub GetIPFromSelection()
    GetIP Selection
End Sub

Sub GetIP(r As Range)
    Dim p As Range
    On Error Resume Next
        Set p = Intersect(r, r.Parent.UsedRange)
    On Error GoTo 0
    If Not p Is Nothing Then
        Dim c As Range
        Dim s As String
        Dim i As Long
        Dim dic As Object
        Set dic = CreateObject("Scripting.Dictionary")
        ReDim brr(1 To 1000000, 1 To 1)
        For Each c In p
            If Not IsEmpty(c) Then
                s = c.Value
                Do
                    i = InStr(s, "[")
                    If i = 0 Then Exit Do
                    s = Mid(s, i + 1)
                    If IsNumeric(Mid(s, 1, 1)) Then
                        i = InStr(s, "]")
                        If i <= 1 Then Exit Do
                        dic.Item(Mid(s, 1, i - 1)) = 0
                        s = Mid(s, i + 1)
                    End If
                Loop
            End If
        Next
        r.Cells(1).Cells(1, 2).Resize(dic.Count) = Application.Transpose(dic.Keys())
    End If
End Sub
 
Секунд 15-20 работы: три замены и текст по столбцам. Получаем 232 адреса

Выделить данные, Ctrl+H
НАЙТИ ]*[ (три символа)
ЗАМЕНИТЬ на пробел
НАЙТИ *[ (два символа)
ЗАМЕНИТЬ на (пусто, ничего не пишем)
НАЙТИ ]* (два символа)
ЗАМЕНИТЬ на (пусто, ничего не пишем)

Данные-Текст по столбцам-С разделителем (пробел)-ОК
Если нужно, транспонировать в столбец
 
вопрос не столько в том, как получить IP адреса, вопрос в том, какого вида результат вы ожидаете увидеть?
(что вам нужно в итоге, куда и как распихать полученные адреса)
Изменено: Ігор Гончаренко - 14.04.2021 13:21:18
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вариант на PQ
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    AddedCustom = Table.AddColumn(
        Source, 
        "IP коммутатора", 
        each Text.Combine( 
            List.Transform(
                Text.Split([Адреса],"];"), 
                each Text.Remove( 
                    if Text.Contains(_,"[") then Text.AfterDelimiter(_, "[", {0, RelativePosition.FromEnd}) else null, 
                    "]") ), 
            "#(lf)" ) )
in
    AddedCustom
Вот горшок пустой, он предмет простой...
 
Или пользовательской функцией
Изменено: msi2102 - 14.04.2021 13:24:49
 
Цитата
Ігор Гончаренко написал: какого вида результат вы ожидаете увидеть?
Получить что то в роде
IP   коммутатора
172.26.66.67
172.26.66.68
172.26.65.65
 
ответ неинформативен(
получение требуемого однозначного результата невозможно(((
это
172.26.66.67
172.26.66.68
172.26.65.65
1. каждый адрес в отдельной ячейке?
2. все адреса в одной ячейке, каждый в след. строке?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
msi2102 написал:
пользовательской функцией
неверный паттерн в функции, правильней будет так:
Код
\b(?:(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})(?:[,:;\)\]\s]|$)
 
Цитата
Ігор Гончаренко написал:
1. каждый адрес в отдельной ячейке?2. все адреса в одной ячейке, каждый в след. строке?
В одной ячейче списком через ; например
 
Цитата
Evgenyy написал: неверный паттерн в функции,
И чем он неправильный?
 
Цитата
В одной ячейче списком через ; например
Сообщение №3. В первой замене вместо пробела менять на ;
Текст по столбцам не нужен.
 
Не совсем все так просто. Это большой массив данных который берет свои значения из разных ячеек. поэтому разбивка на столбцы разовый выход но не постоянный
 
Да Вы же написали, что в одной ячейке надо?
Цитата
vikttur написал: Текст по столбцам не нужен.
Задачу нужно сразу толково описывать, а не порциями информацию выдавать.
 
Цитата
msi2102 написал:
чем он неправильный?
Золотое правило регулярных выражений: "извлекать то, что нужно, и не извлекать то, что не нужно".
Изменено: Evgenyy - 14.04.2021 14:31:44
 
Цитата
Evgenyy написал:
извлекать то, что нужно, и не извлекать то, что не нужно
И что у меня извлекается ненужного?
Как часто встречаются выражения которые подходят под паттерн "\d{3}\.\d{2}\.\d{1,3}\.\d{1,3}"  
Изменено: msi2102 - 14.04.2021 14:37:39
 
Цитата
msi2102 написал:
что у меня извлекается ненужного?
Например, хрень такого вида 256.26.66.178, что не является IP-адресом.
 
Код
Function GetIP$(rg As Range, Optional Sep$ = ";")
  Dim c As Range, re, ms, i&, s$
  For Each c In rg: s = s & c: Next
  Set re = CreateObject("VBScript.RegExp"): GetIP = "Нет IP"
  re.Pattern = "\d+\.\d+\.\d+\.\d+": re.Global = True
  Set ms = re.Execute(s): s = ""
  For i = 0 To ms.Count - 1: s = s & Sep & ms(i): Next
  If Len(s) Then GetIP = Right(s, Len(s) - 1)
End Function
Изменено: Ігор Гончаренко - 15.04.2021 10:28:57
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Evgenyy написал:
Например, хрень такого вида 256.26.66.178, что не является IP-адресом.
Вмешаюсь. те цифры что похожи или являются ip нужны все, не нужен исключительно текст меж ними
 
Цитата
Grinsh написал: пример в котором содержатся ip адреса
Цитата
Grinsh написал: цифры что похожи или являются ip нужны все
Задачу надо описывать конкретно в начале темы.
 
Evgenyy,
когда будет стоять задача отсечь некорректные IP тогда будем исключать некорректные
а пока стоит задача "извлечь IP-адреса"
\d+\.\d+\.\d+\.\d+ - вполне с нею справляется
Изменено: Ігор Гончаренко - 14.04.2021 14:46:39
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
цифры что похожи или являются ip нужны все,
Вытаскиваем то, что в квадратных скобках. В первой ячейке убрать в начале скобку.
Код
Function Skobki(cell$) As String
Dim mo As Object
Dim n As Integer
 With CreateObject("VBScript.RegExp")
   .Global = True
   .Pattern = "\[.+?(?=\])"
   Set mo = .Execute(cell)
   For n = 0 To mo.Count - 1
     Skobki = Skobki & Mid(mo(n), 2) & "; "
   Next
 End With
End Function
 
Ігор Гончаренко, согласен. Для бестолковой задачи и такое решение сойдёт.
 
Тогда, как в описании темы в IP в скобках "[]"
паттерн "\[\d{3}\.\d{2}\.\d{1,3}\.\d{1,3}\]"
 
Kuzmich, все адреса не помещаются в строке (визуально), слишком много адресов.
Изменено: Evgenyy - 14.04.2021 15:31:44
 
Видимо действительно не корректно написал запрос на помощь.
Вношу ясность реально работающий файл с уже действующим макросом(но который не учитывает эти IP адреса если их больше 1го)
Вот в него нужно внести правки чтобы все осталось как было только учитывались все IP фадреса во вкладке отчет в столбце G.
Замечу что есть кнопка обработки на этом же листе.

P/S Заранее прошу прощения за кривое объяснение задачи.
 
Цитата
Grinsh написал:
P/S Заранее прошу прощения за кривое объяснение задачи.
с этой фразы нужно было начинать текст первого сообщения
а извинения в 26-м сообщении - это уже как-то совсем не заранее, а оформленные как послесловие - это вообще троллинг чистой воды))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
это вообще троллинг чистой воды))
Вот уж троллить тут никого не собирался. Редко обращаюсь за такой помощью и вот не задалось чет((
 
Посмотрите, может так?
 
Цитата
msi2102 написал:
Посмотрите, может так?
Вроде да. Но не весь файл получается работает. Написал в ЛС
Страницы: 1 2 След.
Наверх