Разделенные слова затем инкапсулируют, затем разделяют символы и инкапсулируют - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь заключить каждое слово строки в ячейку A1 между двумя фигурными скобками '{' '}', а затем заключить каждую букву / символ каждого слова в скобки '[' ']'.
Итак, строка: "яблоки сладкие" становится:

{[a] [p] [p] [l] [e] [s]} {[a] [r] [e]} {[s] [w] [e] [e] [t]}

В результате повторяется каждое заключенное в скобки слово внутри следующего:

{[a] [p] [p] [l] [e] [s]} { [a] [p] [p] [l] [e] [s] [a] [r] [e]} { [a] [p] [p] [l] [e] [s] [a] [r] [e] [s] [w] [e] [e] [t]}

Жирные частине должно быть там.результат отображается в B2.

Sub splitEncapsulate()

    Dim myString As String
    Dim intoStrArr() As String
    Dim i As Integer
    Dim myWord As String

    myString = ActiveSheet.Range("A1").Value
    'splits the string based on the delimeter space
    intoStrArr = Split(myString, " ")
    myWord = ""

    'loops through the string
    For i = LBound(intoStrArr) To UBound(intoStrArr)

        myWord = intoStrArr(i)

        'loop each character in myWord
         For j = 1 To Len(myWord)
             'encapsulate each character with '[ ]'
             char = "[" & Mid(myWord, j, 1) & "]"

             'group characters again
              joinedChars = joinedChars & char

         Next j

        'encapsulate each word with '{ }' and add space in between words
        newtxt = newtxt + "{ " + joinedChars + " }" + " "

    Next i
    ActiveSheet.Range("A1").Offset(0, 1).Value = newtxt
End Sub

Ответы [ 2 ]

3 голосов
/ 18 мая 2019

Вы можете использовать регулярные выражения

  • Заменить каждый символ 'x' на [x]
  • Заменить каждую последовательность символов на { }
  • Добавить{ в начале и } в конце строки

Option Explicit
Function enCapsulate(str As String)
    Dim sRes As String
    Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "(\S)"
    .Global = True
    sRes = .Replace(str, "[$1]")
    .Pattern = "(\S)\s+"
    sRes = .Replace(sRes, "$1 } { ")
    sRes = "{ " & Trim(sRes) & " }"
End With
enCapsulate = sRes

End Function

enter image description here

2 голосов
/ 18 мая 2019

Вам просто нужно сбросить joinedChars, так как в каждом цикле он остается неизменным:

после

newtxt = newtxt + "{ " + joinedChars + " }" + " "

добавить

joinedChars = ""

(Использование F8 для пошагового выполнения кода очень помогает. Это позволяет видеть каждую строчку отдельно, поэтому во втором цикле я увидел, что при первом использовании joinedChars она уже удерживала apples данных, поэтому перед повторным использованием необходимо очистить их).

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

Function splitEncapsulate(cel As Range)

' Enter the code here, with my suggestion above
' but replace `ActiveSheet.Range("A1").Offset(0, 1).Value = newtxt` with the next line:
splitEncapsulate = Trim(newtxt)
End Function

enter image description here

...