2017-08-17 35 views
0

我想基本上做一個VLOOKUP,但我的單元格的內容過長VLOOKUP處理。因此,我使用這個VBA腳本通過一個定義的範圍進行搜索:Excel中 - 通過搜索範圍內使用VBA

Function betterSearch(searchCell, Range As String) 

     For Each cell In Range 
      If cell.Value = searchCell.Value Then 
        betterSearch = "Match" 
        Exit For 
      End If 
      betterSearch = "No match" 
     Next 

End Function 

該函數被稱爲(例如):=betterSearch(B33;'Master'!C:C)

然而,我不能得到一個輸出。我得到了雙眼,我犯了什麼錯誤?

+3

不應該'範圍作爲字符串'是範圍作爲範圍? – dwirony

+2

您的變量不應該與預先存在的方法具有相同的名稱。 'betterSearch(searchCell,Source As Range)'會更好。 –

回答

1

我正在交叉眼睛,我犯了什麼錯誤?

幾個。

  • 參數Range被聲明爲String,但顯然作爲好像它是一個Range對象。它應該被宣佈爲As Range
  • 名稱Range隱藏Global.Range,這可能是也可能不是問題(它不是,在這種情況下是)。在更廣泛的範圍內隱藏/遮蔽現有聲明通常是一個壞主意。
  • 該功能隱含地爲Public。如果明確的話更好。
  • 參數暗示通過ByRef,但沒有理由;他們應該通過ByVal
  • 參數searchCell是一個隱式Variant,但它用作好像它是一個Range對象;宣佈它As Range
  • 函數返回一個隱含Variant,但真正返回String。簽名應指定As String作爲返回類型。
  • 局部變量cell未聲明的,這意味着它是一個在即時隱含Variant。明確聲明,As Range
  • 使用未聲明的變量編譯的代碼沒有指定Option Explicit,這意味着VBA將愉快地編譯和運行任何錯字。避免愚蠢的尷尬問題,在上的每一個模塊指定Option Explicit,並聲明每一個變量
  • 在每次迭代中不必要地重新分配「不匹配」返回值。
  • 功能名稱是camelCase,但在每一個VBA類型庫的公共成員一貫PascalCase
  • 縮進不一致。

Rubberduck(我管理的一個開源的VBE插件項目)將通過它的靜態代碼分析獲得大部分這些點。

Option Explicit 

Public Function BetterSearch(ByVal searchCell As Range, ByVal source As Range) As String 
    Dim cell As Range 
    For Each cell In source 
     If cell.Value = searchCell.Value Then 
      BetterSearch = "Match" 
      Exit Function 
     End If 
    Next 
    BetterSearch = "No match" 
End Function 

IMO的功能會更加有用的,如果它返回一個Boolean,而不是一個「神奇的字符串」。找到時爲True,找不到時爲False

+0

非常感謝。我理解你的大部分意見,但是,我遇到了以下的怪事。如果源範圍與searchCell位於同一工作表上,它將起作用,但如果該範圍位於不同的工作表上,它將返回一個#VALUE!錯誤? – Tampert

+0

Gah,拼寫錯誤/複製粘貼錯誤...應該是'For Each cell in Source' - 固定。 –

+0

那一個我抓到;)但它只是不會跨越工作表? – Tampert