在VBA中获取“错误:类型不匹配”

时间:2010-11-19 06:58:37

标签: vba variables excel-vba compiler-errors excel

我遇到了运行时错误13。类型不匹配。但我无法弄清楚为什么。有什么帮助吗?

Sub Separate_with_OR_without_comission()

Dim I As Integer
Dim WRng As Range
Dim NoRng As Range
Dim NameRgn As Range
Dim TotalCRng As Range

Set WRng = Range("with_comission")
Set NoRng = Range("without_comission")
Set NameRgn = Range("total_comission_name")
Set TotalCRng = Range("ttotal_comission")

 For I = 1 To NameRgn.Rows.Count
    If TotalCRng.Rows(I) > 0 Then           // ERROR HERE
        WRng.Rows(I) = NameRgn.Rows(I)
    End If
    If TotalCRng.Rows(I) < 1 Then           // AND HERE
        NoRng.Rows(I) = NameRgn.Rows(I)
    End If
 Next I
End Sub

当我尝试使用其他测试单元时很好,问题出在那些......但它们是“ttotal_comission”中的数字为什么VBA将其作为其他东西?

3 个答案:

答案 0 :(得分:3)

问题是Rows(I)返回范围对象,而不是整数值。您应完全符合以下声明:TotalCRng.Rows(I).Cells(1, 1).ValueTotalCRng.Cells(1, 1).Value。按原样写,如果它恰好是单个单元格,Excel将从Ro​​ws(I)返回值,在这种情况下调用范围的value属性,否则会引发您看到的类型不匹配错误,因为您是试图将范围与整数进行比较。

示例:

'no error
Debug.Print Sheet1.Range("B1")

'type mismatch error
Debug.Print Sheet1.Range("B1:B12")

另外,请记住,只有合并范围的左上角单元格才会实际返回值。

答案 1 :(得分:2)

你可以使用这样的结构:

for each c in range("rangeName1")
    'if the source range is 3 columns to the right, same row'
    c = c.offset(0,3).value  
next c

答案 2 :(得分:0)

如果您要检查每行中单元格的值,则需要遍历单元格并单独比较这些值。

如果范围只是单列,而不是循环遍历每一行,您可以遍历每个单元格以获得相同的效果。

 For I = 1 To NameRgn.Rows.Count
    For j = 1 to NameRgn.rows(I).cells.count
    If TotalCRng.Rows(I).cells(j).value > 0 Then           // ERROR HERE
        WRng.Rows(I).cells(j) = NameRgn.Rows(I).cells(j)
    End If
    If TotalCRng.Rows(I).cells(j).value < 1 Then           // AND HERE
        NoRng.Rows(I).cells(j) = NameRgn.Rows(I).cells(j)
    End If
    Next j
 Next I