Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 仅更改单元格的一部分中的特定字符_Excel_Vba - Fatal编程技术网

Excel 仅更改单元格的一部分中的特定字符

Excel 仅更改单元格的一部分中的特定字符,excel,vba,Excel,Vba,我想更改文本中的特定字符,因此我需要查找所有“;”字符并将它们更改为“$”,但仅当它们位于括号中时 因此,可能只有少数情况: 例1 文本(没关系;没关系);好啊 应该是: 文本(可以$不可以);嗯 例2 文本(没关系;没关系);好的 应该是: 文本(可以$不可以);ok(tekst$)ok 例3 文本(它是好的;(好的;)它不是好的); 应该是: 文本(ok$(ok$)不ok) 所以我开始替换字符串代码,但问题是我的代码现在甚至在“)”之后也替换字符,我不希望这样 我是否应该以某种方式计算需要更

我想更改文本中的特定字符,因此我需要查找所有“;”字符并将它们更改为“$”,但仅当它们位于括号中时

因此,可能只有少数情况:

例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所说的,如果我们有案例:(没关系;(好;)没关系;好);在部分“它不是”中,应该是“它不是$”,所以无论何时我们在任何开括号中,开关都应该被激活是的,忽略了这一点。你的文本是否会遵循正常规则,即括号总是成对出现,先左后右?我已经修改了上面的代码,你能再试一次吗?此更新正常工作。是的,文本将遵循正常规则,谢谢