Изменение формул на лету с VBA RegEx - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь изменить формулы в Excel, мне нужно изменить номер строки формул.

Я пытаюсь использовать заменить регулярное выражение, чтобы сделать это. Я использую l oop, чтобы перебрать строки в Excel, и мне нужно изменить формулу для строки, которая перебирает время. Вот пример кода:

    For i = 2 To rows_aux
            DoEvents

            Formula_string= "=IFS(N19='Z001';'xxxxxx';N19='Z007';'xxxxxx';0=0;'xxxxxxx')"
            Formula_string_new = regEx.Replace(Formula_string, "$1" & i)
            wb.Cells(i, 33) = ""
            wb.Cells(i, 33).Formula = Formula_string_new
      .
      .
      .
   Next i    

Мне нужно заменить ссылки на строки, но не ссылки в кавычках или двойные кавычки. Пример: если i = 2, я хочу, чтобы новая строка была такой:

"=IFS(N2='Z001';'xxxxxx';N2='Z007';'xxxxxx';0=0;'xxxxxxx')"

Я пытаюсь использовать это регулярное выражение:

([a-zA-Z]+)(\d+)

Но оно также меняет все в кавычках. Вот так: Если я = 2:

"=IFS(N2='Z2';'xxxxxx';N2='Z2';'xxxxxx';0=0;'xxxxxxx')"

Если кто-нибудь может мне помочь, я буду очень благодарен! Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Если вы можете идентифицировать некоторые уникальные особенности, как в примере с предыдущей скобкой (или двоеточием; и после равно =, то это может сработать

Sub test()
    Dim s As String, sNew As String, i As Long

    Dim Regex As Object
    Set Regex = CreateObject("vbscript.regexp")
    With Regex
      .Global = True
      .MultiLine = False
      .IgnoreCase = True
      .Pattern = "([(;][a-zA-Z]{1,3})(\d+)="
    End With

    i = 1
    s = "=IFS(NANA19='Z001';'xxxxxx';NA19='Z007';'xxxxxx';0=0;'xxxxxxx')"
    sNew = Regex.Replace(s, "$1" & i & "=")

    Debug.Print s & vbCr & sNew

End Sub
0 голосов
/ 19 февраля 2020

Как уже писали другие, есть, вероятно, лучшие способы написания этого кода. Но для регулярного выражения, которое будет захватывать только букву столбца в группе захвата # 1, попробуйте:

\$?\b(XF[A-D]|X[A-E][A-Z]|[A-W][A-Z]{2}|[A-Z]{2}|[A-Z])\$?(?:104857[0-6]|10485[0-6]\d|1048[0-4]\d{2}|104[0-7]\d{3}|10[0-3]\d{4}|[1-9]\d{1,5}|[1-9])d?

Обратите внимание, что это НЕ будет включать маркер абсолютной адресации $, но может изменить, если это было необходимо.

Обратите внимание, что вы можете полностью избежать l oop с помощью:

    Formula_string = "=IFS(N19=""Z001"",""xxxxxx"",N$19=""Z007"",""xxxxxx"",0=0,""xxxxxxx"")"
    Formula_string_new = regEx.Replace(Formula_string, "$1" & firstRow)

With Range(wb.Cells(firstRow, 33), wb.Cells(lastRow, 33))
    .Clear
    .Formula = Formula_string_new
End With

Когда мы напишем формулу в такой диапазон, ссылки будут автоматически отрегулируйте, как вы это делали в вашем l oop.

В зависимости от неустановленных факторов вы можете использовать свойство FormulaLocal вместо свойства Formula.

Редактировать:

Чтобы сделать это немного более надежным, в случае, если в кавычках есть строка, которая точно имитирует действительный адрес, вы можете попробовать проверить, чтобы убедиться, что цитата (одинарное или двойное) не предшествует цели и не следует за ней.

Pattern:    ([^"'])\$?\b(XF[A-D]|X[A-E][A-Z]|[A-W][A-Z]{2}|[A-Z]{2}|[A-Z])\$?(?:104857[0-6]|10485[0-6]\d|1048[0-4]\d{2}|104[0-7]\d{3}|10[0-3]\d{4}|[1-9]\d{1,5}|[1-9])d?\b(?!['"])

Replace:    "$1$2" & i

Однако это не является «пуленепробиваемым», так как различные комбинации включаемых данных могут совпадать. Если это проблема, дайте мне знать, и я придумаю что-нибудь более надежное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...