2017-10-18 90 views
1

我正在为我的工作场所(即大型科学中心的Outreach部门)开发数据库。我们有很多学校违反了我们(非常具体)的合同,所以我们希望追踪并减少这些违规行为。我想要用户(进入一所新学校时)拉起用户表单,输入学校名称,然后单击搜索按钮以填充与他们输入的学校名称匹配的列表框。如果他们点击该列表中的一所学校,该表单将使用该名称作为学校名称。如果没有,它会提示他们输入一个新的学校名称。VBA Range.Find程序 - 找不到类型不匹配

我的代码现在很基本。我正在尝试使用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的范围和原来只是改变它,而我是调试对象 - 我之前和改变之后得到了同样的错误。

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

随着时间的推移,这个列表中会有成千上万的学校,所以这个搜索功能对于用户在表单上选择一所学校之前过滤一些结果是必要的。

+1

lRow被定义为“Long”,但您试图将其设置为等于“Range”对象。 – braX

+0

@braX如何和在哪里? – sktneer

+0

@braX你的陈述是错误的,因为'range'末尾有'.Row',这使得它是数字而不是范围,谁应该低估自己的投票权 – Ibo

回答

1

看起来好像使用Object可能会导致错误。此外,有轻微的调整,以如何lRow分配,这应该更好地运行:与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 

的注意事项,如果说电池A100是空的,但B100不是,它会不恰当地分配该行(行100 )作为最后一行。

如果您确实需要确保不会发生这种情况(与您的OP相同),您可以遍历所有行直到空白。也许这样:

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

非常感谢大家的帮助!显然这是我希望我的查找功能在A1上开始,但是我的命名范围从A2开始。

再次感谢大家愿意帮助像我这样的自学成才的新手清理我的代码!