【问题标题】:VBA - replace characters in stringVBA - 替换字符串中的字符
【发布时间】:2018-03-21 15:31:55
【问题描述】:

我有 1 列,应该包含一个金额,但它的格式不正确,它被视为文本。

因此,有必要将点替换为空,然后将逗号替换为点。我有代码:

Private Sub Correction_of_dot()
    Dim i As String
    Dim k As String
    i = "."
    k = ""
    Columns("P:P").Replace what:=i, replacement:=k, lookat:=xlPart, MatchCase:=False
End Sub

Private Sub Correction_of_comma()
    Dim i As String
    Dim k As String
    i = ","
    k = "."
    Columns("P:P").Replace what:=i, replacement:=k, lookat:=xlPart, MatchCase:=False
End Sub

但它什么也没做...没有错误,只是加载然后什么都没有发生。你能告诉我,我做错了什么或者我可以做得更好吗?

非常感谢!

【问题讨论】:

  • 何时以及如何调用这些 Subs?将列数据类型更改为所需的格式不是更容易吗?
  • 代码看似正确,但可能值得明确声明工作表,例如 Worksheets("Sheet1").Columns("P")...

标签: vba excel replace


【解决方案1】:

您可以遍历列并使用替换功能。

Dim i As Long
Dim finalRow As Long

finalRow = SheetX.Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 to finalRow

   SheetX.Cells(i, 1).Value = Replace(SheetX.Cells(i, 1).Value, ".", "")
   SheetX.Cells(i, 1).Value = Replace(SheetX.Cells(i, 1).Value, ",", ".")

Next i

注意:我没有对此进行测试 - 但它应该可以工作。 另外:将 SheetX 更改为任何合适的工作表 CodeName 并根据需要更改列引用(本示例中的列 1)

【讨论】:

    【解决方案2】:

    尝试使用它。代码首先更改您的语言以匹配列中的小数分隔符。然后使 Excel 将其识别为存储为文本的数字。然后它使用text to columns 将范围转换为数字,然后将小数(和千位)分隔符重置为应有的值 - 现在将您的数据存储为数字

    Sub CorrectIncorrectNumberFormat()
        With Application
            .UseSystemSeparators = False
            .DecimalSeparator = ","
            .ThousandsSeparator = "."
        End With
    
        'Update to your applicable range I've set it to sheet1 Column A
        With Sheet1
            With Range(.Cells(1, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1))
                .TextToColumns Destination:=.Cells(1), DataType:=xlDelimited, _
                    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
                    :=Array(1, 1), TrailingMinusNumbers:=True
            End With
        End With
    
        With Application
            .DecimalSeparator = "."
            .ThousandsSeparator = ","
            .UseSystemSeparators = True
        End With
    End Sub
    

    【讨论】:

      【解决方案3】:

      不需要宏干预的简单解决方案是选择带有文本值的列,转到DataTab==>Text to Columns==>Next==>Next==>选择General列数据格式。

      您还可以告诉 Excel 逗号是小数还是千位分隔符(在高级选项下)...

      【讨论】:

      • 由于混合了小数分隔符,这在这种情况下不起作用
      • 其实可以的,万一不能自动识别,你可以随时使用高级文本设置...
      • 在我的测试中没有用,但没有尝试使用 Advanced Text Import Settings,我看到你现在已经添加了
      • 对于大型数据集,这显然是最有效的解决方案,包括来自 VBA
      【解决方案4】:

      根据我的区域设置,点用作小数分隔符,逗号用作千位分隔符。话虽如此,以下代码适用于我并产生预期的输出。

      为了测试代码,我从网页上复制了数字并粘贴在工作表上,它们如下所示...

      代码:

      Sub Test()
      With Range("P:P")
          .Replace ".", ""
          .Replace ",", "."
          .NumberFormat = "0.00"
      End With
      End Sub
      

      输出:

      【讨论】:

        【解决方案5】:

        您的代码对我来说很好;如果在您的情况下不起作用,我认为该列已格式化为文本;只需将格式更改为数字或标准。

        试试这个:

        Private Sub Correction_of_dot()
            Columns("P:P").Select
            Selection.NumberFormat = "General"
        
            Dim i As String
            Dim k As String
            i = "."
            k = ""
            Columns("P:P").Replace what:=i, replacement:=k, lookat:=xlPart, MatchCase:=False
        
            i = ","
            k = "."
            Columns("P:P").Replace what:=i, replacement:=k, lookat:=xlPart, MatchCase:=False
        End Sub
        

        【讨论】:

          【解决方案6】:

          这是一种方法:

          Public Sub TestMe()
          
              Debug.Print generateNumber("1.525,32")
              'works with mixed formats:
              Debug.Print generateNumber("12,525.33")
              Debug.Print generateNumber("1,112.525,35")
          
          End Sub
          
          Public Function generateNumber(strInput As String) As Double
          
              strInput = Replace(Replace(strInput, ".", ""), ",", "")
          
              generateNumber = CDbl(Left(strInput, Len(strInput) - 2))
          
              'getting the first digit after the comma
              generateNumber = generateNumber + 0.1 * CLng(Mid(strInput, Len(strInput) - 1, 1))
          
              'getting the second digit after the comma
              generateNumber = generateNumber + 0.01 * CLng(Mid(strInput, Len(strInput), 1))
          
          End Function
          

          如果输入是标准的,整数后有 2 位,它将返回标准输出。

          它在格式上有一个小的优点,因为在不同的国家,分隔符是不同的。

          【讨论】:

            猜你喜欢
            • 2017-05-27
            • 1970-01-01
            • 1970-01-01
            • 2011-08-18
            • 1970-01-01
            • 1970-01-01
            • 2011-12-17
            相关资源
            最近更新 更多