'类型不匹配' VBA中的.Find()方法出错

时间:2015-02-11 17:28:16

标签: excel-vba find runtime-error vba excel

我在Excel VBA中编写了一个子文件,并且它一直给我一个类型不匹配的'尝试将.Find()的结果分配给Range变量时出现错误消息。我觉得我的类型很合适,所以在某处可能会出现语法错误?

非常感谢帮助: (前面带有星号的行是抛出错误的地方)

Sub totalTiger(fCode As String, project As String, ttls() As Double)

    'Set shorcuts to Worksheets
    Dim this As Workbook:   Set this = ThisWorkbook
    Dim proj As Worksheet:  Set proj = this.Worksheets(project)

    'Dim req variables
    Dim tRng As Range:  Set tRng = proj.Range("A:A").Find(What:="Program Description")   'Establish where Staff data ends and Tiger data begins
    ***Dim rng As Range:   Set rng = proj.Range("C:C").Find(What:=fCode, After:=tRng)   'First fCode entry***

    'For each fCode entry BEFORE the Tiger data, sum the assignments by month
    Do While Not rng Is Nothing And rng.row > tRng.row

        'For each month
        For col = 4 To 15

            'Add this month's assignment to our running total
            ttls(col - 4) = ttls(col - 4) + CDbl(proj.Cells(rng.row, col).Value)

        Next

        'Update the rng reference
        Set rng = proj.Range("C:C").Find(What:=fCode, After:=rng)

    Loop

End Sub

3 个答案:

答案 0 :(得分:2)

我认为问题出在“After:= tRng”:它可能超出了“find”的范围

Dim rng As Range:   Set rng = proj.Range("C:C").Find(What:=fCode, After:=tRng)

尝试删除“After:= tRng”,如果删除后仍然有效,请尝试插入正确的范围。

Dim rng As Range:   Set rng = proj.Range("C:C").Find(What:=fCode)

我不确定这是你需要的,但你可以尝试:

Dim rng:    Set rng = proj.Range("C:C").Find(What:=fCode, After:=proj.Range("C" & tRng.Row))

它找到第一个'fCode',从找到“Program Description”的行开始

答案 1 :(得分:0)

有可能将tRng设置为空,因此问题不在于find的返回值,而在于您提供的参数。

答案 2 :(得分:0)

如果由于所有逻辑解释(例如上述解释)都不适合而挠头,则可能是腐败。我有一个实时工作簿示例,其中看起来很荒谬的是,一张工作表(上面什么都没有;击中控制端在A1上)可重复显示?activesheet.usedrange.address,并给出“ $ B $ 1:$ A $ 1”和?activesheet .usedrange.count给出0。

因此,在执行查找之前,最严格的编码防御应该进行测试,

If Not Intersect(tRng, proj.Range("A:A")) Is Nothing

对于上面的示例,在{expression} .find的任何常规范围表达式之前,

If Not Intersect(tRng, {expression}) Is Nothing

您的“其他”可能会深入研究该问题,例如

msgbox tRng.address & "/" & {expression}.address

If语句将防止类型不匹配错误,不仅在您“非法”或不正确地设置了不在搜索范围内的“ After:”时,而且在某些情况下(例如,我有)遇到了IRL。腐败的工作簿令人恐惧,残酷的危险,但是Microsoft不会解决问题,因此腐败将会发生。像这样的测试至少会发出潜在的损坏警报(如果适用),并具有基本的功能,即简单地识别您是否有不允许的(After and {expression})组合。