Excel VBA范围.Find过程-找不到类型不匹配

Excel VBA范围.Find过程-找不到类型不匹配,excel,vba,Excel,Vba,我正在为我的工作场所建立一个数据库,这是一个大型科学中心的外展部。我们有很多学校违反了我们非常具体的合同,所以我们希望跟踪并减少这些违规行为 为了减少以后搜索数据库时出现的拼写错误,我希望用户在进入新学校时,调出用户表单,输入学校名称,然后单击搜索按钮,在列表框中填充与其输入内容相匹配的学校名称。如果他们点击该列表中的一所学校,表单会将其用作学校名称。如果没有,它会提示他们输入新的学校名称 我的代码现在非常基本。我试图使用Find&FindNext过程来调出一个学校名称的所有实例,但我得到了一个

我正在为我的工作场所建立一个数据库,这是一个大型科学中心的外展部。我们有很多学校违反了我们非常具体的合同,所以我们希望跟踪并减少这些违规行为

为了减少以后搜索数据库时出现的拼写错误,我希望用户在进入新学校时,调出用户表单,输入学校名称,然后单击搜索按钮,在列表框中填充与其输入内容相匹配的学校名称。如果他们点击该列表中的一所学校,表单会将其用作学校名称。如果没有,它会提示他们输入新的学校名称

我的代码现在非常基本。我试图使用Find&FindNext过程来调出一个学校名称的所有实例,但我得到了一个类型不匹配错误13,与我当前的代码,我找不到可能来自哪里。我已经检查过没有变量或Userform对象拼写错误

我希望Find函数只返回第一个单元格的范围,以便根据需要将其转换为.Address或.Value

Option Explicit

Private Sub cbtnSearchSchool_Click()

Dim lrow As Long
Dim schoolmatch As Range

'defines "lrow" as the last completely empty row in the table
lrow = Cells.find(What:="", _
        After:=Range("A1"), _
        LookIn:=xlValues, _
        LookAt:=xlPart, _
        SearchOrder:=xlByColumns, _
        SearchDirection:=xlNext, _
        MatchCase:=False, _
        SearchFormat:=False).Row

Range("A1").Activate

'defines "schoolmatch" variable as the first school in the list that
'matches what was entered in the text box.
Set schoolmatch = Range("SchoolName").find(What:=txtbSchoolName.Value, _
    After:=ActiveCell, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext, _
    MatchCase:=False, _
    SearchFormat:=False)

'returns value of first found cell to check for accuracy
MsgBox schoolmatch.Value
编辑:很抱歉,我最初将schoolmatch标注为一个范围,并在调试时将其更改为Object,更改前后都出现了相同的错误

它向我显示了我得到错误的那一行-它是Set schoolmatch=Range.Find操作,但我无法找出任何地方会混淆数据类型。我已经仔细检查了一个学名范围,并且检查了所有其他变量名的拼写错误

随着时间的推移,此列表中将有数千所学校,因此,在用户在表单上选择学校之前,必须使用此搜索功能筛选一些结果。

似乎是使用对象导致了此错误。另外,稍微调整一下lRow的分配方式,应该会运行得更好:

Option Explicit

Private Sub cbtnSearchSchool_Click()

Dim lrow As Long
Dim schoolmatch As Range

'defines "lrow" as the last completely empty row in the table
lrow = Range("A1").End(xlDown).Row

'defines "schoolmatch" variable as the first school in the list that
'matches what was entered in the text box.
Set schoolmatch = Range("SchoolName").find(What:=txtbSchoolName.Value, _
    After:=ActiveCell, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext, _
    MatchCase:=False, _
    SearchFormat:=False)

'returns value of first found cell to check for accuracy
MsgBox schoolmatch.Value
带有lRow的注释,如果说单元格A100是空的,而B100不是空的,它将不正确地将该行100指定为最后一行

如果您确实需要确保OP不会发生同样的情况,您可以在所有行中循环,直到出现空白。也许像这样:

lRow = 1
Do While WorksheetFunction.CountA(Rows(lRow)) <> 0
    lRow  = lRow  + 1
Loop
Debug.print "Last row is: " & lRow

lRow定义为Long,但您试图将其设置为Range对象。@braX How and where?@braX您的语句是错误的,因为Range末尾有.Row,这使它是数值而不是Range,谁应该被降票?它没有显示错误发生的行吗?还有,你的学名叫range,对吗?至于LROW,也许跳过find和Rangea&Ro.Sq.NoxLuff.Read,或者使用A1的XLDT,如果它是连续数据,并且你还有其他地方不考虑表的部分的空白。而且,学校比赛应该是一个范围,而不是我认为的对象。这可能会导致错误。@LindyNewman使用F8运行,它将逐行运行,当它执行有问题的行时,它将抛出错误,这样您就可以告诉我们哪一行是问题所在