【问题标题】:Using Split and Replace - VBA使用拆分和替换 - VBA
【发布时间】:2020-07-29 17:58:32
【问题描述】:

我在 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

但我得到的输出是这样的:

1,.3,4
1,2,3.4
1,.3.4,4
1,2,3,4

因此,宏对第一行和第二行非常有效,但不适用于所有其他行。 我注意到第三行正在使用第二行,但我不明白为什么 此外,如果我尝试将 i 增加到 4,则会收到错误“9-超出范围”。

提前感谢您的帮助。 亚历克斯

【问题讨论】:

  • 你在末尾有一些静态的Split(ActiveSheet.Range("A2"), ",")(2)) 而不是"A" &amp; i
  • 哦,对了,对不起,谢谢!
  • 我已更正,但仍有问题。你知道为什么这个宏在有 1,,2,2,3 的时候用 2 个逗号代替 1 个逗号吗?我得到 1,.2.2,3 而不是 1,.2,2,3
  • 我认为拆分函数只返回两个逗号之间的字段,有没有办法两个拆分单元格以获取逗号后的所有剩余字符串?

标签: vba replace split


【解决方案1】:

可能更简单的解决方案是查找双逗号“,,”,然后使用 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 建议修改

【讨论】:

  • 比我的干净多了,哈哈!
  • 谢谢,这看起来很不错!!但是作为一个初学者,你能解释一下你是如何在 sub 中传递一个范围的吗?我将始终用于此宏的范围是 A:A(A 的所有行)
  • 无论如何,您的解决方案工作得非常好,非常感谢
  • 如何检查一定数量的逗号之前是否有双逗号?因为在我的数据中,我总会在某个时候出现双逗号,这只是需要触及的开始
  • 是的,不在第一位的双逗号会破坏这个功能。必须在条件中使用InStr(c.Value2, ",,")=InStr(c.Value2, ",") 之类的东西。
【解决方案2】:

有点变通,但你可以使用这样的东西:

Option Explicit

Sub replaceComma()
    
    Dim r As Long
    Dim split_array As Variant
    
    For r = 1 To 4
   
        split_array = Split(Range("A" & r).Value, ",")
        
        'check if first comma followed by second comma
        'i.e. split(1) will be empty
        If split_array(1) = "" Then
            Range("A" & r).Value = split_array(0) & ",." & split_array(2) & "," & split_array(3)
        Else
            Range("A" & r).Value = split_array(0) & "," & split_array(1) & "," & split_array(2) & "." & split_array(3)
        End If
    
    Next r
    
End Sub

【讨论】:

    【解决方案3】:

    只是因为我喜欢公式,而我可以避免 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))
    

    这适用于任何带有三个逗号的示例:

    输入输出 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 ,,, ,.,

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2021-12-23
      • 2021-09-12
      • 2015-10-23
      • 2023-01-25
      • 2014-04-22
      • 2012-03-22
      • 1970-01-01
      • 2016-03-19
      相关资源
      最近更新 更多