如何使Excel不截断0格式化十进制数字?

假设我在记事本中有以下随机数字:

1.19 0.040 10.1123 23.110 21.223 2.35456 4.0 10234.0009 456798.7500 123 34.560 40060 33.7876 

如果我复制上面的数字并将其粘贴到Excel中,则数字格式将更改为此

 1.19 0.04 10.1123 23.11 21.223 2.35456 4 10234.0009 456798.75 123 34.56 40060 33.7876 

我打算复制粘贴数字而不更改其原始格式,例如:

  • 0.040保持0.040,而不是0.04;

  • 4.0保持4.0,而不是4;

  • 456798.7500保持456798.7500,而不是456798.75; 等等。

我知道我可以使用条件格式

 If condition_1 Then Cells(...).NumberFormat = "0.00" ElseIf condition_2 Then Cells(...).NumberFormat = "0.000" ... Else result_else End If 

或使用Select … Case Statement ,但这些方法的问题是:

  1. 代码可能很冗长,看起来很乱。
  2. 如果数字改变,那么条件也必须改变。

所以我的问题是:

如何使Excel不会截断在十进制数字结尾的0?

PS我想保留值作为数字, 而不是文本。


附录:我不明白为什么会降低这个OP,因为这种表示在财务数据中很重要,例如:外汇或汇率。

如果我把你的原始数据放在列A (你的发布格式),并运行这个:

 Sub CopyFull() Dim A As Range, B As Range Set A = Range("A1:A13") Set B = Range("B1:B13") A.Copy B End Sub 

复制的数据项将与原始文件具有相同的格式:

在这里输入图像描述

所以如果A9NumberFormat0.0000 ,那么B9也是如此。

编辑#1:

如果数据是在一个打开的记事本过程中开始的,我会:

  1. 手动( 或编程 )将数据存储为文本文件( .txt
  2. 将文本文件导入到文本列中
  3. 将列中的每个项目转换为一个与文本格式一致的NumberFormatNumber

如果有任何伴随列的标识符可用于将数值分组为货币格式类别,那么问题就变得简单¹。

currency_conditional_before
运行currencyConditionals子过程之前的数据

•欧元应使用欧元,有3位小数,并绿色
•JPN应使用¥,有4位小数,并为深红色
•GPD应该使用英镑,有0位小数,并且是深蓝色
•美元应该使用$,有2位小数,并且是蓝色的

运行代码。

 Option Explicit Sub currencyConditionals() Dim a As Long, aCURRs As Variant, aFRMTS As Variant aCURRs = Array("EUR", "JPY", "GBP", "USD") aFRMTS = Array("[color10]_([$€-2]* #,##0.000_);[color3]_([$€-2]* (#,##0.000);[color15]_(* -??_);[color46]_(@_)", _ "[color9]_([$¥-411]* #,##0.0000_);[color9]_=[$¥-411]* (#,##0.0000);[color15]_(* -??_);[color46]_(@_)", _ "[color11]_([$£-809]* #,##0_-;[color11]-[$£-809]* #,##0_-;[color15]_-[$£-809]* -_);[color46]_-@_-", _ "[color5]_($* #,##0.00_);[color5]_($* (#,##0.00);[color15]_($* -??_);[color46]_(@_)") With Worksheets("Sheet2") With .Cells(1, 1).CurrentRegion With .Offset(1, 5).Resize(.Rows.Count - 1, 1) .FormatConditions.Delete For a = LBound(aCURRs) To UBound(aCURRs) With .FormatConditions.Add(Type:=xlExpression, _ Formula1:="=$C2=" & Chr(34) & aCURRs(a) & Chr(34)) .NumberFormat = aFRMTS(a) End With Next a End With End With End With End Sub 

currency_conditional_after
运行currencyConditionals子程序后的数据


¹ 格式掩码的例子可以在数字格式码中find。

虽然这个代码有点乱,但至less我尝试了Gary的学生在他的回答中提出的build议( 见编辑#1 )。 假设我想将原始数据放在列A中,并将所需格式放在列B中,那么我将:

  1. 在列A中设置数字格式为文本。 为此,请单击A列标题,然后查找“ 主页”菜单选项卡的“ 数字”部分,然后单击“ 数字”部分右下angular的箭头并select“文本”。
  2. 在记事本中复制( Ctrl C )原始数据,然后单击单元格A1并粘贴( Ctrl V )数据。

运行这个代码:

 Sub Keeping_Number_Format_1() Last_Row = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To Last_Row 'Determine the number of the decimal places Dec_Number = Len(Cells(i, 1)) - InStr(Cells(i, 1), ".") 'Return the number found in the input string (each cells in column A) Cells(i, 2) = Val(Cells(i, 1)) 'Set the data in column B to specific formats If Dec_Number = Len(Cells(i, 1)) Then Cells(i, 2).NumberFormat = "0" ElseIf Dec_Number = 1 Then Cells(i, 2).NumberFormat = "0.0" ElseIf Dec_Number = 2 Then Cells(i, 2).NumberFormat = "0.00" ElseIf Dec_Number = 3 Then Cells(i, 2).NumberFormat = "0.000" ElseIf Dec_Number = 4 Then Cells(i, 2).NumberFormat = "0.0000" 'I add these lines just in case the given numbers exceed 4 decimal places. 'You can add the lines as you wish. ElseIf Dec_Number = 5 Then Cells(i, 2).NumberFormat = "0.00000" ElseIf Dec_Number = 6 Then Cells(i, 2).NumberFormat = "0.000000" End If Next i End Sub 

或者可以运行上述代码的较短版本。 它在Microsoft Excel中使用了REPT函数 ,因此它不需要在将来更改代码,因为它适用于具有任意小数位数的数据。

 Sub Keeping_Number_Format_2() Last_Row = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To Last_Row Dec_Number = Len(Cells(i, 1)) - InStr(Cells(i, 1), ".") Cells(i, 2) = Val(Cells(i, 1)) If Dec_Number = Len(Cells(i, 1)) Then Cells(i, 2).NumberFormat = "0" Else Cells(i, 2).NumberFormat = "0." & WorksheetFunction.Rept("0", Dec_Number) End If Next i End Sub