2015-10-23 3 views
3

Я пытаюсь использовать регулярное выражение в excel VBA для соответствия шаблону во всех ячейках диапазона столбцов и удалять сопоставленные шаблоны в новый диапазон столбцов.Регулярное выражение в excel VBA

E.g.

  1. Happy Day Care Club (1124734)
  2. Французский Pattiserie (8985D)
  3. короля буфетная (G6666642742D)
  4. Большой обуви (Китай) Ltd (ZZ454)

По существу я хотите удалить последнюю заключенную в скобки часть каждой строки и перенести эту часть (без скобок) в другой диапазон столбцов.

Регулярное выражение у меня до сих пор "(([^)] +)) \ г" (я не знаю, если это на самом деле правильно), и встроенный в этом VBA:

Dim regEx As New RegExp 
Dim strPattern As String 
Dim strInput As String 
Dim strReplace As String 
Dim Myrange As Range 

Sheets("Sheet 1").Activate 
Range("FF65536").End(xlUp).Select 
LastCell = ActiveCell.Address 

Set Myrange = ActiveSheet.Range("FF2:" & LastCell) 

For Each C In Myrange 
    strPattern = "(\(([^\)]+)\)\z)" 

    If strPattern <> "" Then 
     strInput = C.Value 
     strReplace = "$1" 

     With regEx 
      .Global = True 
      .MultiLine = True 
      .IgnoreCase = False 
      .Pattern = strPattern 
     End With 

     If regEx.Test(strInput) Then 
      Range("FF2").Select = regEx.Replace(strInput, "$1") 
      Range("DX2").Select = regEx.Replace(strInput, "$2") 
     End If 
    End If 
Next 

Я новичок, поэтому, пожалуйста, простите очевидные ошибки.

большое спасибо,

+1

Если шаблон тот же, что и в скобках, всегда находится в конце, вы можете использовать функцию разделения. Он использовал бы намного меньше кода, чтобы получить то же самое. –

+0

Вы также можете использовать это '\ s * (\ ((. *?) \)) $' Regex, если в круглых скобках есть '(' или ')'. –

ответ

2

У вас нет правильного шаблона регулярного выражения. Вы должны проверить свой шаблон отдельно, поскольку регулярное выражение - это собственный мини-язык. Попробуйте эту модель (Regex101):

\((.+)\)$ 

О самых gm вариантов: g означает Global, m означает Multiline, оба из которых установлен в True в вашем коде.

0

Вот метод, не RegEx:

Dim Myrange As Range 

Sheets("Sheet 1").Activate 

Set Myrange = ActiveSheet.Range("FF2:FF" & Cells(Rows.Count, "FF").End(xlUp).Row) 
With Myrange 
    .Offset(, -43).Value = .Worksheet.Evaluate("INDEX(SUBSTITUTE(TRIM(RIGHT(SUBSTITUTE(" & .Address & _ 
              ",""("",REPT("" "",500)),500)),"")"",""""),)") 
End With 
0

Лично я хотел бы обратиться к RegEx в крайнем случае ...

Вот фрагмент, используя строковые функции:

Dim iRow As Long 
Dim s As String 
For iRow = 1 To UsedRange.Rows.Count 
    Debug.Print Cells(iRow, 1).Value 
    s = Cells(iRow, 1).Value 
    s = Trim(Left(s, InStrRev(s, "(") - 1)) 
    Debug.Print s 
Next 

Соответствующей линией является Trim(Left(s, InStrRev(s, "(") - 1)). Вам понадобится проверка QA для обработки данных без надлежащего формата.

Смежные вопросы