2014-10-06 97 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