#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.