2017-10-18 73 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開始。

再次感謝大家願意幫助像我這樣的自學成才的新手清理我的代碼!