Форматирование ячеек для отображения символов только после X количества символов

#excel #vba

#excel #vba

Вопрос:

Вместо получения первых 12 символов справа, нужна та же ячейка без первых 12 символов.

 Dim arrData As Variant, LastRow As Long, i As Long, ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Long List 15032019") 'change the name of the sheet to the one you are doing the code

    With ws
        LastRow = .Cells(.Rows.Count, 3).End(xlUp).Row
        arrData = .Range("A2", .Cells(LastRow, "C")).Value
        For i = 1 To UBound(arrData)
            If arrData(i, 3) Like "Bus*" Then
                arrData(i, 1) = "BU CRM"
            Else
                arrData(i, 1) = "CSI ACE"
            End If
            If arrData(i, 3) Like "CSI*" Or arrData(i, 3) = vbNullString Then
                arrData(i, 2) = vbNullString
                Else: arrData(i, 2) = Right(arrData(i, 3), 12)
            End If
        Next i
        .Range("A2", .Cells(LastRow, "C")).Value = arrData

         End With
  

т.е. если C3 = «Example (ID: 15654534)», то B3 = «(ID: 15654534)» или если C3 = «Example (ID: 152)», то B3 = «(ID: 152)».

Я пытался использовать Left или -12. Но результат был не тем, что мне было нужно. Я надеюсь, что это проясняет мой вопрос.

Спасибо

Комментарии:

1. Добро пожаловать в SO. В вашем сообщении вы говорите, что вместо этого я хочу, чтобы моя ячейка состояла из последних 14 символов , но позже в ответе @ QHarr вы говорите, я хочу, чтобы столбец 2 = столбец 3 без первого символа X в этом случае был бы «Example». Итак, если C3 — это «Example (ID: 15654534)», то B3 «(ID: 15654534)»или если C3 — это «Example (ID: 152)», то B3 «(ID: 152)» и это совершенно другое. Пожалуйста, отредактируйте свой вопрос, добавив именно то, что вы хотите, входные данные, ожидаемый результат и то, что вы пробовали. Помогите сообществу помочь вам 🙂

2. Спасибо за комментарий, я сделаю это сейчас. Как вы можете себе представить, я новичок в VBA, и это мой первый проект. Приветствия

Ответ №1:

Звучит так, как будто вам нужно регулярное выражение. В этом случае у вас будет

 arrData(i,2) =  GetId(arrData(i, 3) , "ID:d ")
  

Код:

 Option Explicit

Public Sub test()
    Dim items(), item As Variant
    items = Array("Example (ID:15654534)", "Example (ID:152)")
    For Each item In items
        Debug.Print GetId(item, "ID:d ")
    Next
End Sub
Public Function GetId(ByVal inputString As String, ByVal sPattern As String) As String
    Dim matches As Object, iMatch As Object, arrMatches(), i As Long
    i = 1
    With CreateObject("vbscript.regexp")
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .Pattern = sPattern
        If .test(inputString) Then
            Set matches = .Execute(inputString)
            ReDim arrMatches(1 To matches.Count)
            For Each iMatch In matches
                arrMatches(i) = iMatch.Value
                i = i   1
            Next iMatch
        Else
            GetId = "No match"
            Exit Function
        End If
    End With
    GetId = arrMatches(1)
End Function
  

Комментарии:

1. Итак, мой код в столбце 3 имеет две возможности. Это дает мне «Пример (ID: 15654534)» или «Пример (ID: 152)». Цель состоит в том, чтобы в столбце отображался только «(ID: XXX)»

2. вам нужны только более короткие?

3. Оба, я хочу, чтобы столбец 2 = столбец 3 без первого символа X в этом случае был бы «Примером». Итак, если C3 — это «Example (ID: 15654534)», то B3 «(ID: 15654534)»или если C3 — это «Example (ID: 152)», то B3 «(ID: 152)»

4. Я не вижу разницы. В обоих случаях вы захватываете всю строку. Звучит так, как будто вам нужно регулярное выражение

5. @QHarr, читая предыдущий комментарий OP, когда он / она говорит «Example (ID: 152)», затем B3 «(ID: 152)» , я думаю, что OP необходимо включить обе круглые скобки в результат

Ответ №2:

Это можно сделать без VBA, но только если входные данные имеют ту же структуру. Теперь ваши данные:

текст (idnumber) и вы хотите получить только часть (idnumber), включая обе круглые скобки.

Эта формула будет работать ТОЛЬКО до тех пор, пока структура данных одинакова. Если входные данные что-то изменяют, это может работать неправильно (например, если первая скобка отсутствует, это не будет работать должным образом).

Формула, которую я использовал, такова:

 =MID(C1;SEARCH("(";C1;1);SEARCH(")";C1)-SEARCH("(";C1;1) 1)
  

Мой пример данных:

введите описание изображения здесь

Надеюсь, вы сможете адаптировать это к своим потребностям.

Комментарии:

1. Спасибо за вашу помощь, я уже задавал подобный вопрос ранее. Но для этой конкретной задачи мне нужно вместо этого использовать VBA.