2017-10-10 445 views
3

我有1列,它应该包含一个数量,但它有不正确的格式,它被视为文本。VBA - 替换字符串中的字符

enter image description here

因此,有必要更换白白点,然后用逗号的点。我有代码:

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 

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

非常感谢!

+0

何时以及如何调用这些子?只是将列数据类型更改为所需的格式会不会更容易? – Quirinux

+0

该代码显示正确,但可能值得明确声明工作表,例如Worksheets(“Sheet1”)。Columns(“P”)... – Leroy

回答

0

按我的区域设置你的数据,点作为小数点分隔符和逗号用作千位分隔符。话虽如此,下面的代码为我工作,并产生预期的输出。

为了测试代码,我复制了网页上的数字并粘贴在工作表上,它们看起来像下面那样...

enter image description here

代码:

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

输出:

enter image description here

0

这是一个办法做到这一点:

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位,它会返回一个标准输出。

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

0

你的代码适合我,如果它在你的情况下不起作用,我认为该列被格式化为文本;只需将格式更改为数字或标准。

试试这个:

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 
0

,不需要宏观干预,简单的办法是选择具有文本值,转到Data标签栏==>Text to Columns ==>下一步==>下一步==>选择General列数据格式。

enter image description here

enter image description here

enter image description here

你也可以告诉Excel中如果逗号是小数点或千个分隔符(在高级选项)...

enter image description here

+1

由于混合使用小数点分隔符 – Tom

+0

,作品,如果它不能自动识别,你可以随时使用高级文本设置... –

+1

没有在我的测试中工作,但没有尝试使用我看到你现在的'高级文本导入设置“添加 – Tom

1

尝试使用这个。代码首先更改语言以匹配列中的小数点分隔符。这使得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 
0

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

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列)