'Type Mismatch' VBA 中的 .Find() 方法出错
'Type Mismatch' Error with .Find() method in VBA
我正在 Excel VBA 中编写一个子程序,并且在尝试将 .Find() 的结果分配给范围变量。我非常有信心我的类型是合适的,所以可能某处存在语法错误?
非常感谢您的帮助:
(星号前面的行是抛出错误的地方)
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
可能tRng没有设置,所以问题不在于find的返回值,而在于你给它的参数。
我认为问题出在"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"
如果您因为所有合乎逻辑的解释(例如上面的那些)都不合适而挠头,那可能是腐败。我有一个实时工作簿示例,其中看起来很荒谬,sheet(上面什么也没有;击中控制端落在 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 语句可以防止类型不匹配错误,不仅在您 "illegally" 或不正确设置不在搜索范围内的 "After:" 时,而且至少在某些损坏的情况下工作簿,例如我遇到的 IRL。损坏的工作簿是可怕的,极其危险的,但微软不会解决这个问题,所以损坏将会发生;像上面这样的测试至少可以发出潜在的损坏警报(如果适用),以及简单地识别您是否有不允许的(After 和 {expression})组合的基本功能。
我正在 Excel VBA 中编写一个子程序,并且在尝试将 .Find() 的结果分配给范围变量。我非常有信心我的类型是合适的,所以可能某处存在语法错误?
非常感谢您的帮助: (星号前面的行是抛出错误的地方)
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
可能tRng没有设置,所以问题不在于find的返回值,而在于你给它的参数。
我认为问题出在"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"
如果您因为所有合乎逻辑的解释(例如上面的那些)都不合适而挠头,那可能是腐败。我有一个实时工作簿示例,其中看起来很荒谬,sheet(上面什么也没有;击中控制端落在 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 语句可以防止类型不匹配错误,不仅在您 "illegally" 或不正确设置不在搜索范围内的 "After:" 时,而且至少在某些损坏的情况下工作簿,例如我遇到的 IRL。损坏的工作簿是可怕的,极其危险的,但微软不会解决这个问题,所以损坏将会发生;像上面这样的测试至少可以发出潜在的损坏警报(如果适用),以及简单地识别您是否有不允许的(After 和 {expression})组合的基本功能。