我在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
答案 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})组合。