每个范围的 VBA Numberformat 不同

Posted

技术标签:

【中文标题】每个范围的 VBA Numberformat 不同【英文标题】:VBA Numberformat differently for each range 【发布时间】:2017-10-19 14:52:34 【问题描述】:

我想根据第二个单元格中的小数位数更改我的范围格式。任何的想法? 我正在使用以下函数来计算小数(有效)

Function CountDecimalPlaces(aNumber As Double) As Long

Dim len1 As Long, len2 As Long
len1 = Len(CStr(aNumber))
len2 = Len(CStr(Int(aNumber)))
CountDecimalPlaces = len1 - len2 + CLng(len1 <> len2)

End Function

并想用它来格式化我的范围与不同的小数位数

For b = 1 To lastCol

Range(cells(3,b),cells(50,b)).NumberFormat = "0." & CountDecimalPlaces (Cells(2, b)) x 0

Next b

当然我知道 "CountDecimalPlaces (Cells(2, b)) x 0" 不起作用,但我希望它能让你理解它的帮助

【问题讨论】:

【参考方案1】:

用这个替换你的代码:

Range(cells(3,b),cells(50,b)).NumberFormat = "0." & String(CountDecimalPlaces(Cells(2, b)), "0")

String 接受两个强制参数:

Number: 一个字符必须重复的次数

Character: 必须重复的字符

这是计算数字中小数位数的另一种方法:

Function CountDecimalPlaces(aNumber As Double) As Long
    CountDecimalPlaces = Len(Split(CStr(aNumber), ".")(1))
End Function

编辑(根据 Excelosaurus 的建议):

Function CountDecimalPlaces(aNumber As Double) As Long
    If Int(aNumber) = aNumber Then
        CountDecimalPlaces = 0
    Else
        CountDecimalPlaces = Len(Split(CStr(aNumber), Application.International(xlDecimalSeparator))(1))
    End If
End Function

【讨论】:

对于整数和使用除句点以外的任何内容作为小数分隔符的系统,建议的函数将失败。使用 Application.International(xlDecimalSeparator)。 @Excelosaurus,感谢您指出这一点。我已经修改了我发布的功能。 由于强制格式,它现在返回 0 或 1。不要以为你会把它塞进一个干净的单行里:-) 我会选择 If Round(aNumber, 0) = aNumber Then CountDecimalPlaces = 0 Else CountDecimalPlaces= Len(Split(CStr(aNumber), Application. International(xlDecimalSeparator), Compare:=vbBinaryCompare)(1))) End If.【参考方案2】:

您也可以如下修改计数小数点。

 Function CountDecimalPlaces(aNumber As Double) As String

 Dim len1 As Long, len2, lenX As Long
 Dim i As Integer
 Dim answer As String
 answer = "0."
 len1 = Len(CStr(aNumber))
 len2 = Len(CStr(Int(aNumber)))
 lenX = len1 - len2 + CLng(len1 <> len2)
 If lenX > 0 Then
     For i = 1 To lenX
         answer = answer & "0"
     Next i     
 End If
 CountDecimalPlaces = answer
 End Function

并像这样在您的主要功能中使用:

 Range(cells(3,b),cells(50,b)).NumberFormat = CountDecimalPlaces (Cells(2, b))

【讨论】:

以上是关于每个范围的 VBA Numberformat 不同的主要内容,如果未能解决你的问题,请参考以下文章

VBA NumberFormat 实现

.NumberFormat VBA 函数 Chr 转义序列

使用 NumberFormat VBA Excel 添加文本

在 VBA excel 中动态设置单元格的 NumberFormat [关闭]

在 Excel VBA 中使用 .NumberFormat 格式化小数位

excel日期格式与vba中的不同