2017-10-19 71 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))