Excel-vba Разделение слов, затем инкапсуляция, затем разделение символов и инкапсуляция

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

{[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 ответа


Вам просто нужно сбросить 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

введите описание изображения здесь


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

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

Option Explicit
Function enCapsulate()
    Const str As String = "apples are sweet"
    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

введите описание изображения здесь


Есть идеи?

10000