пропустить подсчет слов в скобках при разбиении строки на строки, чтобы в строках было одинаковое количество слов, которых нет в скобках - PullRequest
0 голосов
/ 08 июня 2019

пропустить подсчет слов в скобках при разбиении строки на строки, чтобы в строках было одинаковое количество слов, которые не находятся внутри скобок, но все же включают скобки в разделении. Для настройки моих ячеек см. Прикрепленное изображение:

skip counting words in parentheses

следующая функция UDF разбивает длинную строку на строки с предопределенным количеством слов в ячейке "D3".

Public Function SplitOnNth(ByVal inputStr$, ByVal StartPos&, ByVal NumWords&) As String

    Dim arr() As String, i As Long, newArr() As String
    arr = Split(inputStr)
    ReDim newArr(NumWords - 1)

    'Arrays are zero-based, but your string isn't. Subtract 1
    For i = StartPos - 1 To StartPos + NumWords - 2
        If i > UBound(arr) Then Exit For    'Exit if you loop past the last word in string

       'ANYTHING IN PARENTHESES SHOULD BE SKIPPED IN WORDS COUNT BUT INCLUDED IN THE WORDS SPLIT

        newArr(i - StartPos + 1) = arr(i)
    Next

    SplitOnNth = Join(newArr, " ")

End Function

Это то, что я пытался решить проблему. Он ужасно жестко запрограммирован и работает только для одного ряда. ВАША ПОМОЩЬ ОЧЕНЬ ЦЕНА И СПАСИБО В ПРЕДЕЛАХ.


              'ANYTHING IN PARENTHESES SHOULD BE SKIPPED IN WORDS COUNT BUT INCLUDED IN THE WORDS SPLIT

        If arr(i) Like "*(*" & "*)*" Then
            newArr(i - StartPos + 1) = arr(i) + " " + _
                                    arr(i + 1) + " " + _
                                    arr(i + 2) + " " + _
                                    arr(i + 3) + " " + _
                                    arr(i + 4) + " "
            Exit For
        Else
        newArr(i - StartPos + 1) = arr(i)
        End If

        'result in the first two rows is ok but not for the rest of the rows
        'One two three four
        '(1) five six seven eight

1 Ответ

1 голос
/ 08 июня 2019

Я бы использовал регулярные выражения, чтобы выполнить разбиение, и я бы возвратил результат в виде массива, из которого можно либо использовать функцию INDEX, чтобы вернуть соответствующую строку, либо ввести формулу в виде формулы массива над диапазон ячеек.

Вы заметите, в коде, два различных регулярных выражения в зависимости от того, хотите ли вы оставить в скобках подстроки с последующей или предшествующей строкой.

Также обратите внимание, что регулярное выражение будет обрабатывать несколько последовательных подстрок в скобках:

Редактировать: (исправлены ошибки)

Option Explicit
Function splitOnNth(inputString As String, numWords As Long) As String()
    Dim RE As Object, MC As Object
    Dim I As Long, J As Long
    Dim strArray() As String

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = "(?:(?:\([^)]+\)\s+)+)?\S+" 'in parentheses combined with following word
    '.Pattern = "\S+(?:(?:\s+\([^)]+\))+)?" 'in_parentheses combined with preceding word

    If .test(inputString) = True Then
        Set MC = .Execute(inputString)
        ReDim strArray(1 To Int(MC.Count / numWords + 1))

        J = 1
        For I = 1 To UBound(strArray)
            For J = J To numWords * I
                If J > MC.Count Then Exit For
                strArray(I) = strArray(I) & " " & MC(J - 1)
            Next J
            strArray(I) = Mid(strArray(I), 2)
        Next I
    End If
End With

splitOnNth = strArray

End Function

enter image description here

А вот объяснение регулярного выражения:

Разделить слова, кроме слов в скобках со следующим словом

(?:(?:\([^)]+\)\s+)+)?\S+

Создано с помощью RegexBuddy

...