excel VBA中的.Find()方法出现“类型不匹配”错误

sr4lhrrt  于 2023-06-25  发布在  其他
关注(0)|答案(4)|浏览(239)

我在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
bgibtngc

bgibtngc1#

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

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))

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

tquggr8v

tquggr8v2#

如果你因为所有的逻辑解释(比如上面的那些)都不合适而挠头,那可能是腐败。我有一个活的工作簿的例子,虽然看起来很荒谬,但一张表(上面什么都没有;击中控制端降落在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

你的“Else”可以深入到问题中,例如:

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

If语句可以防止Type Mismatch错误,不仅是在您“非法”或不正确地设置了不在搜索范围内的“After:”时,而且至少在某些损坏工作簿的情况下,如我遇到的IRL。腐败的工作簿是可怕的,残酷的危险,但微软不会解决这个问题,所以腐败将发生;诸如上述的测试将至少用于发出潜在的损坏警报(如果适用的话),以及用于简单地识别是否具有不允许的(After和{expression})组合的基本功能。

yrwegjxp

yrwegjxp3#

有可能tRng被设置为nothing,所以问题不在于find的返回值,而在于你给予它的参数。

50pmv0ei

50pmv0ei4#

我的“类型不匹配”来自目标字符串对于find函数来说太长。VBA没有给出其他信息,所以它需要一点尝试和错误。

相关问题