Vba 如何知道单元格的数据类型

Vba 如何知道单元格的数据类型,vba,excel,casting,runtime-error,Vba,Excel,Casting,Runtime Error,我已经在这里停留了一段时间,并且得到运行时错误13-类型不匹配 Dim Qty, ItemCost, Tot Qty = wi.Range("C" & i).Value2 'Qty ItemCost = wi.Range("K" & i).Value2 'Item Cost Tot = CInt(Qty) * CInt(ItemCost) 当我在C和K列单元格上尝试IsNumeric时,它们都是真的,但我仍然得到了那个错误 我还尝试:

我已经在这里停留了一段时间,并且得到运行时错误13-类型不匹配

Dim Qty, ItemCost, Tot
Qty = wi.Range("C" & i).Value2              'Qty
ItemCost = wi.Range("K" & i).Value2         'Item Cost
Tot = CInt(Qty) * CInt(ItemCost)
当我在C和K列单元格上尝试IsNumeric时,它们都是真的,但我仍然得到了那个错误

我还尝试:

Tot = Qty * ItemCost

以及将其转换为整数或双精度数据类型的其他不同组合

我还手动将C列和K列格式化为数字


错误仍然存在。我不知道我做错了什么

你需要2件东西:

  • 制作数值变量的更好方法
  • 一个更好的方法来发现哪里出了问题
考虑:

Sub dural()
    Dim Qty As Long, Qty_Text As String, wi As Worksheet, i As Long
    Set wi = ActiveSheet
    i = 1

    Qty_Text = Trim(wi.Range("C" & i).Text)
    On Error GoTo wtf
        Qty = CLng(Qty_Text)
    On Error GoTo 0
    Exit Sub
wtf:
    MsgBox wi.Name & vbCrLf & i & vbCrLf & wi.Range("C" & i).Text
    On Error GoTo 0
End Sub

你需要2件事:

  • 制作数值变量的更好方法
  • 一个更好的方法来发现哪里出了问题
考虑:

Sub dural()
    Dim Qty As Long, Qty_Text As String, wi As Worksheet, i As Long
    Set wi = ActiveSheet
    i = 1

    Qty_Text = Trim(wi.Range("C" & i).Text)
    On Error GoTo wtf
        Qty = CLng(Qty_Text)
    On Error GoTo 0
    Exit Sub
wtf:
    MsgBox wi.Name & vbCrLf & i & vbCrLf & wi.Range("C" & i).Text
    On Error GoTo 0
End Sub

将变量实际声明为所需类型如何。现在它们被设置为
Variant
(默认情况下不声明特定变量)。因此
将数量设置为双精度,将项目成本设置为双精度,将Tot设置为双精度(或将每个值分别转换为整数而不是双精度)。我建议您单独转换每个值,找出导致错误的原因,然后找出原因,如果它们实际上应该是数字。确定。我可以在单元格中键入abc并将其格式化为数字。这并不意味着它是一个数字。崩溃后,将鼠标悬停在
Qty
ItemCost
变量上,查看其中的内容,或设置一个监视(右键单击,监视)或打开“局部变量”窗口。空字符串不是数字
CInt(“”
爆炸时出现类型不匹配错误。宏启动时,
i
的值是多少?查找导致问题的单元格,然后你可以说“我100%确定它们包含数字,没有文本”。如果它包含一个数字,它不会爆炸。我不会发布一个创可贴的答案;Gary的答案是正确的,您需要实际的类型化变量,并且您需要一种更好的方式来查看发生了什么。很高兴它起到了作用,但是如果你的代码能正常工作,我强烈建议你把它带到,在那里,评审员将剖析你的代码,并指出你可以改进的一切,使你的代码更易于阅读和维护,更安全/更不容易出错,而且速度更快。那么,把你的变量声明为你想要的类型怎么样。现在它们被设置为
Variant
(默认情况下不声明特定变量)。因此
将数量设置为双精度,将项目成本设置为双精度,将Tot设置为双精度(或将每个值分别转换为整数而不是双精度)。我建议您单独转换每个值,找出导致错误的原因,然后找出原因,如果它们实际上应该是数字。确定。我可以在单元格中键入abc并将其格式化为数字。这并不意味着它是一个数字。崩溃后,将鼠标悬停在
Qty
ItemCost
变量上,查看其中的内容,或设置一个监视(右键单击,监视)或打开“局部变量”窗口。空字符串不是数字
CInt(“”
爆炸时出现类型不匹配错误。宏启动时,
i
的值是多少?查找导致问题的单元格,然后你可以说“我100%确定它们包含数字,没有文本”。如果它包含一个数字,它不会爆炸。我不会发布一个创可贴的答案;Gary的答案是正确的,您需要实际的类型化变量,并且您需要一种更好的方式来查看发生了什么。很高兴它起到了作用,但是如果你的代码能正常工作,我强烈建议你把它带到,在那里,评审员将剖析你的代码,并指出你可以改进的一切,使你的代码更易于阅读和维护,更安全/更不容易出错,速度更快。关于
出错转到wtf
的额外积分,但我已经看到了
Sub-dural()
次数太多。:)@吉普车下次我会用更多的想象力…………那
Sub-Jeeped()
呢?
错误转到wtf时的加分呢
,但是我已经看过
Sub-dural()
太多次了。:)@吉普车下次我会用更多的想象力…………那
Sub-Jeeped()
??
Sub dural()
    Dim Qty As Long, Qty_Text As String, wi As Worksheet, i As Long
    Set wi = ActiveSheet
    i = 1

    Qty_Text = Trim(wi.Range("C" & i).Text)
    On Error GoTo wtf
        Qty = CLng(Qty_Text)
    On Error GoTo 0
    Exit Sub
wtf:
    MsgBox wi.Name & vbCrLf & i & vbCrLf & wi.Range("C" & i).Text
    On Error GoTo 0
End Sub