2014-10-06 138 views
0

我有一組數據,其格式不同,例如B,KB,MB,GB和TB。我已經編寫代碼來刪除單位並轉換爲GB。我的問題是,最後一節'b到kb'會導致類型不匹配錯誤。我不明白爲什麼我已經將相同的代碼應用於每次轉換?提前致謝。VBA類型不匹配錯誤

這裏是我的代碼:

Sub RemoveUnits() 
Dim r As Range 
Dim x As Long 
For Each r In ActiveSheet.UsedRange 
w = r.Value 

'GB 
    If InStr(w, "gb") > 0 Then 
     r = Left$(r, Len(r) - 2) 
     Debug.Print (r.Value) 
    'No conversion required 
'TB 
    ElseIf InStr(w, "tb") > 0 Then 
     r = Left$(r, Len(r) - 2) 
     r = r * 1024 
     Debug.Print (r.Value) 
    'Convert tb to gb 
'MB 
    ElseIf InStr(w, "mb") > 0 Then 
     r = Left$(r, Len(r) - 2) 
     r = (1/1024) * r 
     Debug.Print (r.Value) 
'Convert mb to gb 
'KB 
    ElseIf InStr(w, "kb") > 0 Then 
     r = Left$(r, Len(r) - 2) 
     r = (1/1048576) * r 
     Debug.Print (r.Value) 
'B to KB 
    ElseIf InStr(w, "b") > 0 Then 
     r = Left$(r, Len(r) - 1) 
     r = (1/1024) * r 
     debung.Print (r.Value) 




    End If 
Next r 
End Sub 

回答

0

我看到了兩個可能的問題。

  1. 您已將r設置爲範圍。
  2. 您試圖將數值與字符串值相乘。將字符串轉換爲數字值,然後執行必要的操作。

例如

r = Left$(r, Len(r) - 2) 
r = r * 1024 

試試這個

r = Val(Trim(r)) * 1024 

同樣改變r = (1/1024) * rr = (1/1024) * Val(Trim(r))等等...

注:我假設r存儲數值作爲字符串。

0

原因:儘量使用公共Debug.Print而不是深奧debung.Print在你的上ElseIf。通常代碼突出顯示是一個好朋友。另外,補充的諷刺意味是,幫助您調試的代碼首先會導致異常。 :-)

建議:Left$期望一個String作爲第一個參數,而傳遞一個Excel.Range對象。有時是不行的......

嘗試(並解決這個問題的所有代碼):

Sub RemoveUnits() 
     '... Local declarations' 
     Dim w As String 

     For Each r In ActiveSheet.UsedRange 
       Let w = CStr(r.Value) 

       ' ... The other cases' 

       ElseIf InStr(w, "b") > 0 Then 
         Let w = Left$(w, Len(w) - 1) 
         Let r.Value = (1/1024) * CDbl(w) 
         Debug.Print r.Value 
       End If 
     Next r 
End Sub 

的建議部分是類似於Siddharth Rout答案,與它使用的計算的String的區別作爲中間變量,而不是Range之一。

+0

除了'debung.Print',我不確定,你的回答與我的不同:) – 2014-10-06 13:03:05

+0

@SiddharthRout嗨Siddharth。我希望你不要以我自己寫的答案與你有相似之處。另外,我希望你的評論並不意味着我偷走了你的答案。 :-) – 2014-10-06 13:29:13

+0

如果我本人將採取它,我已經downvoted;)不,我不是說你偷了答案。我之所以這樣說,是因爲我沒有看到發佈類似答案的理由...... – 2014-10-06 13:35:21