В этой задаче я пытаюсь инкапсулировать каждое слово строки в ячейке 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]
{ }
{
в начале и }
в конце строки 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