Excel 仅更改单元格的一部分中的特定字符
我想更改文本中的特定字符,因此我需要查找所有“;”字符并将它们更改为“$”,但仅当它们位于括号中时 因此,可能只有少数情况: 例1 文本(没关系;没关系);好啊 应该是: 文本(可以$不可以);嗯 例2 文本(没关系;没关系);好的 应该是: 文本(可以$不可以);ok(tekst$)ok 例3 文本(它是好的;(好的;)它不是好的); 应该是: 文本(ok$(ok$)不ok) 所以我开始替换字符串代码,但问题是我的代码现在甚至在“)”之后也替换字符,我不希望这样 我是否应该以某种方式计算需要更改的字符串,设置开始位置并仅更改它们?但问题是,如果我们有更多的括号,它将不起作用 最好的方法是什么Excel 仅更改单元格的一部分中的特定字符,excel,vba,Excel,Vba,我想更改文本中的特定字符,因此我需要查找所有“;”字符并将它们更改为“$”,但仅当它们位于括号中时 因此,可能只有少数情况: 例1 文本(没关系;没关系);好啊 应该是: 文本(可以$不可以);嗯 例2 文本(没关系;没关系);好的 应该是: 文本(可以$不可以);ok(tekst$)ok 例3 文本(它是好的;(好的;)它不是好的); 应该是: 文本(ok$(ok$)不ok) 所以我开始替换字符串代码,但问题是我的代码现在甚至在“)”之后也替换字符,我不希望这样 我是否应该以某种方式计算需要更
Sub Removetext()
s = Range("A1").Value
Dim start As Integer
Dim end1 As Integer
start = InStr(1, s, "(")
end1 = InStr(1, s, ")")
s = Left(s, start - 1) & Replace(s, ";", "$", start)
End Sub
这里有一种方法,避免使用regexp,因为我使用它的次数不够,不需要花很多力气就能记住如何使用它
Sub x()
Dim i As Long, lb As Long, rb As Long, r As Range
Range("A1:A4").Copy Range("B1")
For Each r In Range("B1:B4")
For i = 1 To Len(r.Value)
If Mid(r, i, 1) = "(" Then lb = lb + 1
If Mid(r, i, 1) = ")" Then rb = rb + 1
If Mid(r, i, 1) = ";" Then
If lb > 0 And rb < lb Then r.Characters(i, 1).Text = "$"
End If
Next i
Next r
End Sub
subx()
尺寸i为长,磅为长,rb为长,r为范围
范围(“A1:A4”)。复印范围(“B1”)
对于范围内的每个r(“B1:B4”)
对于i=1至Len(r值)
如果Mid(r,i,1)=“(那么lb=lb+1
如果Mid(r,i,1)=“”,则rb=rb+1
如果Mid(r,i,1)=“;”那么
如果lb>0且rb
字符之间的替换(自定义项)
- 如果左侧出现的
(左括号)多于左侧出现的LeftChar
(右括号)righchar
,FindChar
将替换为FindChar
ReplaceChar
- 在
中,对于Excel
中的字符串,可以如下使用:A1
=RBC(A1)
- 在
中,请参见下文VBA
Option Explicit
Function RBC( _
ByVal aString As String, _
Optional ByVal LeftChar As String = "(", _
Optional ByVal RightChar As String = ")", _
Optional ByVal FindChar As String = ";", _
Optional ByVal ReplaceChar As String = "$") _
As String
If Len(aString) > 0 Then
Dim Parts() As String
Parts = Split(aString, FindChar)
Dim Result As String
Result = Parts(0)
Dim cLen As Long
Dim lCount As Long
Dim rCount As Long
Dim n As Long
For n = 1 To UBound(Parts)
cLen = Len(Result)
lCount = cLen - Len(Replace(Result, LeftChar, ""))
rCount = cLen - Len(Replace(Result, RightChar, ""))
If lCount > rCount Then
Result = Result & ReplaceChar & Parts(n)
Else
Result = Result & FindChar & Parts(n)
End If
Next n
RBC = Result
End If
End Function
Sub testRBC()
Const aString As String = "(it's ok; (ok;)it's not; ok);"
Debug.Print RBC(aString)
End Sub
' Results in column B:
Sub testRBC2()
Dim rng As Range
Set rng = Range("A1:A100000")
Dim Data As Variant
Data = rng.Value
Dim i As Long
For i = 1 To UBound(Data, 1)
Data(i, 1) = RBC(Data(i, 1))
Next i
rng.Offset(, 1).Value = Data
End Sub
你可能想研究正则表达式,但如果你不想了解所有这些,你可以遍历每个字符并跟踪左括号的位置,右括号和分号,并使用Characters属性。我添加了
regex
标记,只是为了有人可以帮助它。这里没有理由使用regex标记。它忽略了的边缘大小写代码>括号外括号内,如(;)ok;)
。如果这是一个问题。这看起来很好,唯一的问题是@ChristoferWeber所说的,如果我们有案例:(没关系;(好;)没关系;好);在部分“它不是”中,应该是“它不是$”,所以无论何时我们在任何开括号中,开关都应该被激活是的,忽略了这一点。你的文本是否会遵循正常规则,即括号总是成对出现,先左后右?我已经修改了上面的代码,你能再试一次吗?此更新正常工作。是的,文本将遵循正常规则,谢谢