自动格式化小数位(Microsoft Excel)
John有一个数据输入工作表,允许用户输入信息。
他希望自动格式化一个单元格以准确显示用户键入的小数位数。例如,如果用户键入“ 12.345”,则他希望该单元格自动设置格式以显示3个小数位。 John知道他可以为某个单元格使用“通用”格式(这样做很好),但是如果用户输入一个以0结尾的值(例如“ 12.34500”),则该方法将不起作用,例如,他希望将其自动设置为格式显示5位小数。
如果您认为可以使用自定义格式来解决需求,那将行不通。利用我们可以想到的自定义格式,Excel会从显示的内容中删除所有结尾的零。 (或者相反,如果自定义格式包含“ 0”作为占位符,则它将在条目的末尾添加零。)
坦白地说,处理此问题的最简单方法是在开始输入信息之前将单元格格式设置为“文本”。这样,Excel将只接受输入的内容(包括任何结尾的零)并将其填充到单元格中。您还可以进一步将单元格的内容右对齐,以使它们至少看起来更像数字值。
这样做的缺点是您在使用公式中的值时必须格外小心。最安全的方法是,以这种方式将任何对单元格的引用简单地包围起来:
=VALUE(A1) * 1.375
另一种方法是创建一个宏,该宏检查输入到一系列单元格中的内容。首先将单元格格式设置为“文本”,然后从这些单元格创建一个命名范围(DataEntry)。然后,您可以将以下代码添加到您正在使用的工作表的代码表中:
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range Dim sEntry As String Dim dEntryNumber As Double Dim arr If Not Intersect(Target, Range("DataEntry")) Is Nothing Then Application.EnableEvents = False For Each c In Target.Cells If IsEmpty(c) Then c.NumberFormat = "@" ' Reset to Text format Else If IsNumeric(c) Then If Len(c.Value) = 0 Then c.NumberFormat = "@" ' Reset to Text format Else sEntry = c.Value dEntryNumber = CDbl(sEntry) arr = Split(sEntry, ".") If UBound(arr) = 1 Then ' Change NumberFormat in accordance with ' the number of digits after the decimal point c.NumberFormat = "0." & String(Len(arr(1)), "0") c.Value = dEntryNumber End If End If End If End If Next c Application.EnableEvents = True End If End Sub
每当工作表中发生任何更改时,都会触发该宏。然后,它检查该更改是否发生在DataEntry范围中的一个单元格中。如果是这样,则它将检查在单元格中输入的内容(Excel将其视为文本,因为这是单元格的格式)
并确定它是否为数字,并进一步确定小数点右边的位数。然后,它将单元格格式化为具有许多小数位,并将数值填充回该单元格中。
这种方法行不通的唯一条件是,如果将值放入DataEntry范围内的单元格中(该单元格将单元格转换为数字格式),然后在同一单元格中输入另一个数字值。在这种情况下,宏无法知道是否输入了任何尾随零。 (请记住,仅当单元格格式设置为“文本”时,才保留尾随零。由于单元格没有保留,Excel会舍弃尾随零,并且宏将使用该值,就像已输入该值一样。)
注意:
如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(1963)适用于Microsoft Excel 2007、2010、2013和2016。