我正在为我的工作场所建立一个数据库,这是一个大型科学中心的外展部门。我们有很多学校违反了我们(非常具体的)合同,因此我们希望跟踪并减少这些违规行为。
为了减少拼写错误,这会使以后搜索数据库变得更加困难,我希望用户(在进入新学校时)拉出Userform,输入他们学校的名称,然后单击搜索按钮以填充列表框中包含与其输入内容匹配的学校名称。如果他们点击该列表中的学校,表单将使用该作为学校名称。如果没有,它会提示他们输入新的学校名称。
我的代码现在很基本。我试图使用Find& amp; FindNext程序用于提取学校名称的所有实例,但我收到了类型不匹配错误(#13)和我目前的代码,我无法找到可能来自的地方。我检查过没有变量或Userform对象拼写错误。
我希望Find函数只返回第一个单元格的Range,以便我可以根据需要将其转换为.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
This is a photo of the Userform if anybody would like to see it.
编辑:对不起,我实际上将schoolmatch标注为Range,并在调试时将其更改为Object - 我在更改之前和之后得到了相同的错误。
它显示了我收到错误的行 - 它是Set schoolmatch = Range.Find
操作,但我无法弄清楚我将混合数据类型的任何地方。我有一个学校名称范围,我已经仔细检查,并且我已经检查了所有其他变量名称是否拼写错误。
随着时间的推移,此列表中将有数千所学校,因此在用户选择表单上的学校之前,必须使用此搜索功能来过滤某些结果。
答案 0 :(得分:1)
看起来使用Object
可能会导致错误。此外,稍微调整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