2017-10-19 70 views
0

我想根据第二个单元格的小数位数来更改我的范围的格式。任何想法? 我使用下面的函数来计算小数(作品)每个范围的VBA编号格式不同

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(细胞(2,b))×0" 没有按牛逼的工作,但我希望这使它可以理解的,你帮

回答

2

这种替换代码:

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 
+2

所提出的功能将失败整数和使用上比任何一个时期作为小数点分隔其他系统。使用Application.International(xlDecimalSeparator)。 – Excelosaurus

+0

@Excelosaurus,谢谢你指出。我修改了我发布的功能。 – Mahesh

+1

由于强制格式,它现在返回0或1。不要以为你会把它塞进一个干净的单行内容中:-)我会用If Round(aNumber,0)= aNumber Then CountDecimalPlaces = 0 Else CountDecimalPlaces = Len(Split(CStr(aNumber)),Application。国际(xlDecimalSeparator),比较:= vbBinaryCompare)(1)))结束如果。 – Excelosaurus

0

您可以修改您的十进制计数如下为好。

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