繁体   English   中英

在 Excel 脚本中用点替换逗号

[英]Replacing commas with dots in Excel script

我想用点替换逗号,反之亦然

Public Sub VirgulaPunct()
Dim oRow As Range
Dim cell As Range
Dim i As Long, j As Long
Dim MyString As String
Dim aux As String

    Application.ScreenUpdating = False

    For i = Selection(Selection.Count).Row To Selection.Cells(1, 1).Row Step -1

        For j = Selection(Selection.Count).Column To Selection.Cells(1, 1).Column Step -1
            MyString = Cells(i, j).Value
            For Counter = 1 To Len(MyString)
                aux = Mid(MyString, Counter, 1)
                If aux = "." Then

                  MyString = Replace(MyString, ".", ",", 1)

                ElseIf aux = "," Then

                  MyString = Replace(MyString, ",", ".", 1)

                End If
            Next
            Cells(i, j).Value = MyString
        Next j
    Next i
    Application.ScreenUpdating = True
End Sub

基本问题是,如果将列设置为常规而不是文本,即使我们将“,”更改为“。” Excell 会自动将其再次更改为“,”。

为了避免这种情况,需要先将列设置为文本格式,然后我们可以执行替换功能:

这对我有用:

Worksheets("Name").Activate
Worksheets("Name").Columns(1).Select 'or Worksheets("SheetName").Range("A:A").Select
Selection.NumberFormat = "@"

Dim OriginalText As String
Dim CorrectedText As String

LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

    For i = 1 To LastRow

    OriginalText = Worksheets("Name").Cells(i, 1).Value

    CorrectedText = Replace(OriginalText, ",", ".")

    Worksheets("Name").Cells(i, 1).Value = CorrectedText

    Next i

可以使用 Range 对象的 Replace 方法

Sub ReplacePunct()

    Const sTEMPCOMMA = "|comma|"
    Const sTEMPDOT = "|dot|"
    Const sCOMMA = ","
    Const sDOT = "."

    If TypeName(Selection) = "Range" Then
        With Selection
            .Replace sCOMMA, sTEMPCOMMA, xlPart
            .Replace sDOT, sTEMPDOT, xlPart
            .Replace sTEMPCOMMA, sDOT, xlPart
            .Replace sTEMPDOT, sCOMMA, xlPart
        End With
    End If

End Sub

我试过同样的事情,但我得到了意想不到的结果。 我可以用手动查找和替换方法做我想做的事。 但是当我尝试使用 VBA 自动执行此操作时,我遇到了奇怪的格式问题。 我已经尝试了此处建议的解决方案,但同样的问题仍然存在。

我的解决方案是使用内置的 NUMBERVALUE function。

这是将点更改为逗号的解决方案。 它可以很容易地适应以相反的方式工作。

Sub ChangeToComma()

Dim c As Range
Dim num As Double

For Each c In Selection
    num = Application.WorksheetFunction.NumberValue(c.Value, ".", ",")
    c.Value = num
Next

End Sub

通过查看您的循环,您似乎不会多次访问任何单元格。 一个简单的 if 语句不能在这里工作吗?

if(Cells(i,j).Value = ',')
  Cells(i,j).Value = '.'
Elsif(Cells(i,j).Value = '.')
  Cells(i,j).Value = ',')
End

从 VB 而不是 VBA 的角度来看,我会考虑使用内置的Replace函数而不是循环遍历它。

所以,首先我会全部更换,; (或者如果可能有;在文本中我会使用其他东西,可能是字符组合,如;+;+或类似的),然后替换所有. ,最后全部替换; . .
可能不是很有效,但很容易。

这似乎是我对您之前问题的回答的延续,但如果是这样,我认为您误解了我的意思。 我已经采用了您的代码并根据我的建议对其进行了修改,但我还没有对其进行测试:

Public Sub VirgulaPunct()
Dim oRow As Range
Dim cell As Range
Dim i As Long, j As Long
Dim MyString As String
Dim aux As String

    Application.ScreenUpdating = False

    For i = Selection(Selection.Count).Row To Selection.Cells(1, 1).Row Step -1

        For j = Selection(Selection.Count).Column To Selection.Cells(1, 1).Column Step -1
            MyString = Cells(i, j).Value
            MyString = Replace(MyString, ",", ";+;", 1)
            MyString = Replace(MyString, ".", ",", 1)
            MyString = Replace(MyString, ";+;", ".", 1)
            Cells(i, j).Value = MyString
        Next j
    Next i
    Application.ScreenUpdating = True
End Sub

因此,正如我在之前的回答中所说,我对Replace进行了 3 次调用,但我对整个字符串而不是字符串中的每个字符进行了调用。

为了将来参考,如果您更新原始问题而不是创建一个新问题可能会更好,然后您可以在我的回答下为我发表评论,我已经看到您这样做了。

这是一个简单的函数,可以将“,”处的字符串分成两部分,然后用一个点将它们粘在一起。 但它只适用于一个逗号。

Public Function change_comma_to_dot(your_string As String)

change_comma_to_dot = Left(your_string, InStr(your_string, ",") - 1) & "." & Mid(your_string, InStr(your_string, ",") + 1)

End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM