使用Split和Replace-VBA

使用Split和Replace-VBA,vba,replace,split,Vba,Replace,Split,我在VBA中面临一个奇怪的问题。 我正在尝试编写一个宏,它将逗号替换为一个点 我的条件是: 如果第一个逗号后跟另一个逗号,则用点替换第二个逗号 否则,用点替换第三个逗号 因此,输入/输出应如下所示: INPUT OUTPUT 1,,3,4 1,.3,4 1,2,3,4 1,2,3.4 1,,3,4 1,.3,4 1,2,3,4 1,2,3.4 Sub replaceComma() For i = 1 T

我在VBA中面临一个奇怪的问题。 我正在尝试编写一个宏,它将逗号替换为一个点

我的条件是:

  • 如果第一个逗号后跟另一个逗号,则用点替换第二个逗号
  • 否则,用点替换第三个逗号
因此,输入/输出应如下所示:

INPUT           OUTPUT
1,,3,4          1,.3,4
1,2,3,4         1,2,3.4
1,,3,4          1,.3,4
1,2,3,4         1,2,3.4
Sub replaceComma()
For i = 1 To 3
   
    If Left(Split(ActiveSheet.Range("A" & i), ",")(1), 1) = "" Then
        ActiveSheet.Range("A" & i) = Replace(ActiveSheet.Range("A" & i), "," & Split(ActiveSheet.Range("A" & i), ",")(2), "." & Split(ActiveSheet.Range("A2"), ",")(2))
    ElseIf Left(Split(ActiveSheet.Range("A" & i), ",")(1), 1) <> "" Then
        ActiveSheet.Range("A" & i) = Replace(ActiveSheet.Range("A" & i), "," & Split(ActiveSheet.Range("A" & i), ",")(3), "." & Split(ActiveSheet.Range("A2"), ",")(3))

    End If
Next i
End Sub
我的宏如下所示:

INPUT           OUTPUT
1,,3,4          1,.3,4
1,2,3,4         1,2,3.4
1,,3,4          1,.3,4
1,2,3,4         1,2,3.4
Sub replaceComma()
For i = 1 To 3
   
    If Left(Split(ActiveSheet.Range("A" & i), ",")(1), 1) = "" Then
        ActiveSheet.Range("A" & i) = Replace(ActiveSheet.Range("A" & i), "," & Split(ActiveSheet.Range("A" & i), ",")(2), "." & Split(ActiveSheet.Range("A2"), ",")(2))
    ElseIf Left(Split(ActiveSheet.Range("A" & i), ",")(1), 1) <> "" Then
        ActiveSheet.Range("A" & i) = Replace(ActiveSheet.Range("A" & i), "," & Split(ActiveSheet.Range("A" & i), ",")(3), "." & Split(ActiveSheet.Range("A2"), ",")(3))

    End If
Next i
End Sub
因此,宏对第一行和第二行非常有效,但对其他所有行都不起作用。 我注意到第三排正在使用第二排,但我不明白为什么 此外,如果我尝试将I增加到4,我会得到一个错误“9-超出范围”

提前感谢你的帮助。
Alex

一个可能更简单的解决方案是查找双逗号“,”,然后使用excel替换函数替换出现的第二个或第三个逗号

Sub replaceComma(r As Range)
    Dim c As Range
    For Each c In r.Cells
        If InStr(c.Value2, ",,") = InStr(c.Value2, ",") Then
            c.Value2 = Application.WorksheetFunction.Substitute(c.Value2, ",", ".", 2)
        Else
            c.Value2 = Application.WorksheetFunction.Substitute(c.Value2, ",", ".", 3)
        End If
    Next c
    
End Sub
PS:我将函数改为使用范围作为参数,但您可以将其修改为使用循环


PPS:根据LS_dev的建议进行修改

可能更简单的解决方案是查找双逗号“,”,然后使用excel替换函数替换出现的第二个或第三个逗号

Sub replaceComma(r As Range)
    Dim c As Range
    For Each c In r.Cells
        If InStr(c.Value2, ",,") = InStr(c.Value2, ",") Then
            c.Value2 = Application.WorksheetFunction.Substitute(c.Value2, ",", ".", 2)
        Else
            c.Value2 = Application.WorksheetFunction.Substitute(c.Value2, ",", ".", 3)
        End If
    Next c
    
End Sub
PS:我将函数改为使用范围作为参数,但您可以将其修改为使用循环


PPS:根据LS_dev的建议进行了一些修改,但您可以使用以下内容:

选项显式
子替换逗号()
变暗,变长
Dim split_阵列作为变体
对于r=1到4
拆分数组=拆分(范围(“A”&r).Value,”,“”)
'检查第一个逗号是否后跟第二个逗号
'即,拆分(1)将为空
如果拆分数组(1)=“”,则
范围(“A”&r).Value=split_数组(0)和“,.”和split_数组(2)和“,”和split_数组(3)
其他的
范围(“A”&r).Value=split_数组(0)和“,”和split_数组(1)和“,”和split_数组(2)和“,”和split_数组(3)
如果结束
下一个r
端接头

有点麻烦,但您可以使用以下方法:

选项显式
子替换逗号()
变暗,变长
Dim split_阵列作为变体
对于r=1到4
拆分数组=拆分(范围(“A”&r).Value,”,“”)
'检查第一个逗号是否后跟第二个逗号
'即,拆分(1)将为空
如果拆分数组(1)=“”,则
范围(“A”&r).Value=split_数组(0)和“,.”和split_数组(2)和“,”和split_数组(3)
其他的
范围(“A”&r).Value=split_数组(0)和“,”和split_数组(1)和“,”和split_数组(2)和“,”和split_数组(3)
如果结束
下一个r
端接头

仅仅因为我喜欢可以避免VBA的公式,我建议使用公式:

=SUBSTITUTE(A1;",";".";IFERROR(FIND(",,";A1)*0+2;3))
这对给定的示例有效,但会将
1,2,4
呈现为
1,2,4
,这将违反给定的规则

因此,我不得不建议:

=SUBSTITUTE(A1;",";".";IF(FIND(",";A1;FIND(",";A1)+1)=FIND(",";A1)+1;2;3))
或者,使用布尔运算:

=SUBSTITUTE(A1;",";".";3-(FIND(",";A1;FIND(",";A1)+1)=FIND(",";A1)+1))
这适用于任何带有三个逗号的样本:

Input Output 1,2,3,4 1,2,3.4 1,2,3, 1,2,3. 1,2,,4 1,2,.4 1,2,, 1,2,. 1,,3,4 1,.3,4 1,,3, 1,.3, 1,,,4 1,.,4 1,,, 1,., ,2,3,4 ,2,3.4 ,2,3, ,2,3. ,2,,4 ,2,.4 ,2,, ,2,. ,,3,4 ,.3,4 ,,3, ,.3, ,,,4 ,.,4 ,,, ,., 输入输出 1,2,3,4 1,2,3.4 1,2,3, 1,2,3. 1,2,,4 1,2,.4 1,2,, 1,2,. 1,,3,4 1,.3,4 1,,3, 1,.3, 1,,,4 1,.,4 1,,, 1,., ,2,3,4 ,2,3.4 ,2,3, ,2,3. ,2,,4 ,2,.4 ,2,, ,2,. ,,3,4 ,.3,4 ,,3, ,.3, ,,,4 ,.,4 ,,, ,.,
因为我喜欢避免VBA的公式,所以我建议使用公式:

=SUBSTITUTE(A1;",";".";IFERROR(FIND(",,";A1)*0+2;3))
这对给定的示例有效,但会将
1,2,4
呈现为
1,2,4
,这将违反给定的规则

因此,我不得不建议:

=SUBSTITUTE(A1;",";".";IF(FIND(",";A1;FIND(",";A1)+1)=FIND(",";A1)+1;2;3))
或者,使用布尔运算:

=SUBSTITUTE(A1;",";".";3-(FIND(",";A1;FIND(",";A1)+1)=FIND(",";A1)+1))
这适用于任何带有三个逗号的样本:

Input Output 1,2,3,4 1,2,3.4 1,2,3, 1,2,3. 1,2,,4 1,2,.4 1,2,, 1,2,. 1,,3,4 1,.3,4 1,,3, 1,.3, 1,,,4 1,.,4 1,,, 1,., ,2,3,4 ,2,3.4 ,2,3, ,2,3. ,2,,4 ,2,.4 ,2,, ,2,. ,,3,4 ,.3,4 ,,3, ,.3, ,,,4 ,.,4 ,,, ,., 输入输出 1,2,3,4 1,2,3.4 1,2,3, 1,2,3. 1,2,,4 1,2,.4 1,2,, 1,2,. 1,,3,4 1,.3,4 1,,3, 1,.3, 1,,,4 1,.,4 1,,, 1,., ,2,3,4 ,2,3.4 ,2,3, ,2,3. ,2,,4 ,2,.4 ,2,, ,2,. ,,3,4 ,.3,4 ,,3, ,.3, ,,,4 ,.,4 ,,, ,.,

你有一些静态的
Split(ActiveSheet.Range(“A2”),“,”)(2))
而不是
“A”&i
哦,对了,对不起,谢谢!我改正了,但我仍然有一个问题。你知道为什么这个宏在有1,2,2,3的情况下用2个逗号代替1个逗号吗?我得到的是1、.2.2,3,而不是1、.2,2,3。我认为分割函数只返回两个逗号之间的字段,有没有办法分割单元格以获得逗号后的所有剩余字符串?你有一些静态的
分割(ActiveSheet.Range(“A2”),“,”,”(2))
结尾,而不是
“a”&I
哦,是的,对不起,谢谢!我改正了,但我仍然有一个问题。你知道为什么这个宏在有1,2,2,3的情况下用2个逗号代替1个逗号吗?我得到的是1,.2.2,3,而不是1,.2,2,3。我认为分割函数只返回两个逗号之间的字段,有没有办法分割单元格以获得逗号后的所有剩余字符串?比我的干净多了,哈哈!谢谢,这看起来很漂亮!!但是作为一个初学者,你能给我解释一下你是如何通过潜艇的射程的吗?我将始终使用的这个宏的范围是A:A(A的所有行),无论如何,您的解决方案工作得非常好,非常感谢您如何检查在一定数量的逗号之前是否有一个双逗号?因为在我的数据中,在某一点上,我总是会有双逗号,这只是需要触摸的开始。是的,不在第一位的双逗号会破坏这个函数。必须在条件下使用类似于
InStr(c.Value2,“,”)=InStr(c.Value2,“,”)
的东西。比我的干净多了,哈哈!谢谢,这看起来很漂亮!!但是作为一个初学者,你能给我解释一下你是如何通过潜艇的射程的吗?我将始终使用的这个宏的范围是A:A(A的所有行),无论如何,您的解决方案工作得非常好,非常感谢您如何检查在一定数量的逗号之前是否有一个双逗号?因为在我的数据中,我总是在某个点上有两个逗号,它