如何使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 ,但这些方法的问题是:
- 代码可能很冗长,看起来很乱。
- 如果数字改变,那么条件也必须改变。
所以我的问题是:
如何使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
复制的数据项将与原始文件具有相同的格式:
所以如果A9的NumberFormat
是0.0000 ,那么B9也是如此。
编辑#1:
如果数据是在一个打开的记事本过程中开始的,我会:
- 手动( 或编程 )将数据存储为文本文件( .txt )
- 将文本文件导入到文本列中
- 将列中的每个项目转换为一个与文本格式一致的
NumberFormat
的Number
如果有任何伴随列的标识符可用于将数值分组为货币格式类别,那么问题就变得简单¹。
运行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
运行currencyConditionals子程序后的数据
¹ 格式掩码的例子可以在数字格式码中find。
虽然这个代码有点乱,但至less我尝试了Gary的学生在他的回答中提出的build议( 见编辑#1 )。 假设我想将原始数据放在列A中,并将所需格式放在列B中,那么我将:
- 在列A中设置数字格式为文本。 为此,请单击A列标题,然后查找“ 主页”菜单选项卡的“ 数字”部分,然后单击“ 数字”部分右下angular的箭头并select“文本”。
- 在记事本中复制( 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