在 Excel VBA 中,我無法將所有出現的地方都更改{MyText}為小寫。
我一直在瀏覽整個 A 和 B 列,每次在 {} 之間找到一個文本時,我都會將其更改為小寫。
我的代碼僅在第一次出現時有效,但是當單元格中出現多次時,我將無法將它們全部更改為小寫。
例如,在一個單元格中,我們有“Bla Bla Bla {Abc} bla bla {xYz} 和 {HELLO}”
結果我會得到“Bla Bla Bla {abc} bla bla {xYz} and {HELLO}”
但是我希望它是這樣的:
“Bla Bla Bla {abc} bla bla {xyz} 和 {hello}”
即使我再次運行代碼,它也僅在第一次出現時應用,下面是我擁有的 VBA:
Set MyRange = Worksheets("Sheet1").Range("G:G,H:H")
Dim temp As String
For Each c In MyRange
If c.Value Like "*{*" Then
temp = Split(c.Value, "{")(1)
temp = Split(temp, "}")(0)
c.Value = Replace(c.Value, temp, LCase(temp))
Else
End If
Next c
End Sub
uj5u.com熱心網友回復:
正則運算式是一個很好的方法。但是,如果您正在尋找 VBA 解決方案,請嘗試以下方法。如測驗用例所示,該代碼解釋了錯誤輸入:
Option Explicit
Private Sub Test()
Debug.Print Lowercase("Bla Bla Bla {Abc} bla bla {xYz} and {HELLO}")
Debug.Print Lowercase("Bla Bla Bla bla bla ")
Debug.Print Lowercase("Bla Bla Bla and {HELLO")
End Sub
Private Function Lowercase(ByVal Value As String) As String
Dim i As Integer
Dim j As Integer
j = 1
Do
If j > 0 Then
i = InStr(j, Value, "{")
If i > 0 Then
j = InStr(i, Value, "}")
If j > 0 Then Mid(Value, i 1, j - i - 1) = LCase(Mid(Value, i 1, j - i - 1))
End If
End If
Loop While i > 0 And j > 0
Lowercase = Value
End Function
uj5u.com熱心網友回復:
我的答案版本決議了這一行,因為您可以替換相同的文本,但不能用“{}”括起來:
Option Explicit
Sub test()
Dim origText As String
Dim lowerText As String
origText = "Bla Abc Bla {Abc} bla bla {xYz} and {HELLO}"
lowerText = MakeItLower(origText)
Debug.Print "original text: " & origText
Debug.Print " lower text: " & lowerText
End Sub
Function MakeItLower(ByVal text As String) As String
Dim result As String
Dim pos0 As Long
Dim pos1 As Long
Dim pos2 As Long
pos0 = 1
pos1 = InStr(1, text, "{", vbTextCompare)
Do While pos1 > 0
result = result & Mid$(text, pos0, pos1 - pos0 1)
pos2 = InStr(pos1, text, "}", vbTextCompare)
If pos2 > 0 Then
Dim textToReplace As String
textToReplace = Mid$(text, pos1 1, pos2 - pos1 - 1)
result = result & LCase(textToReplace) & "}"
pos0 = pos2 1
End If
pos1 = InStr(pos2, text, "{", vbTextCompare)
Loop
MakeItLower = result
End Function
uj5u.com熱心網友回復:
一個簡單的非 RegEx 解決方案可以像這樣作業:
Sub test()
Debug.Print LowerCaseBrackets("Bla Bla Bla {Abc} bla bla {xYz} and {HELLO}")
End Sub
Public Function LowerCaseBrackets(ByVal InputString As String) As String
Dim SplitStarts() As String
SplitStarts = Split(InputString, "{")
Dim iStart As Variant
For iStart = LBound(SplitStarts) 1 To UBound(SplitStarts)
Dim EndPos As Long
EndPos = InStr(SplitStarts(iStart), "}")
SplitStarts(iStart) = LCase(Left$(SplitStarts(iStart), EndPos - 1)) & Mid$(SplitStarts(iStart), EndPos)
Next iStart
LowerCaseBrackets = Join(SplitStarts, "{")
End Function
Split會將字串分成以下部分:
Bla Bla Bla
Abc} bla bla
xYz} and
HELLO}
由于第一部分總是在第一個左括號之外,我們省略它并從下一個開始
For iStart = LBound(SplitStarts) 1
我們回圈遍歷字串的以下部分,并在這部分中查找結束括號的位置
EndPos = InStr(SplitStarts(iStart), "}")
然后我們把它的左邊的藝術轉換成小寫
LCase(Left$(SplitStarts(iStart), EndPos - 1))
并附加其余的
& Mid$(SplitStarts(iStart), EndPos)
在那個回圈之后,我們的SplitStarts陣列看起來像:
Bla Bla Bla
abc} bla bla
xyz} and
hello}
我們使用左括號加入它
LowerCaseBrackets = Join(SplitStarts, "{")
得到我們的最終字串
Bla Bla Bla {abc} bla bla {xyz} and {hello}
另一種替代解決方案可能是
Public Function LowerCaseBrackets(ByVal InputString As String) As String
Dim Pos As Long
Do While InStr(Pos 1, InputString, "{")
Dim EndPos As Long
EndPos = InStr(Pos 1, InputString, "}")
Mid(InputString, Pos 1, EndPos - 1) = LCase(Mid(InputString, Pos 1, EndPos - 1))
Pos = EndPos
Loop
LowerCaseBrackets = InputString
End Function
uj5u.com熱心網友回復:
這種方法怎么樣?
我建議您使用布林值(±偽代碼)來跟蹤大括號“區域”的內部或外部:
dim b_inside as Boolean;
dim Line as string; ' this is the text you're going to manipulate
for (int i = 0, i < Line.Length, i ):
if Line[i] == "{" then b_inside = True;
if Line[i] == "}" then b_inside = False;
if b_inside and
(Line[i] >= "A") and
(Line[i] <= "Z")
then Line[i] = LowerCase(Line[i])
next i
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/447195.html
上一篇:Excel計數非空單元格
