2017-06-03 46 views
0

我有以下功能:VBA函數 - 參數是不可選的

Function EntryInTable(stringToBeFound As String, arr1 As Variant) As Integer 

EntryInTable = 0 
Rem default return value if value not found in array 
     For i = LBound(arr1, 1) To UBound(arr1, 1) 
     If StrComp(stringToBeFound, arr1(i, 1), vbTextCompare) = 0 Then 
      EntryInTable = EntryInTable + 1 
      Exit For 
     End If 
Next i 

End Function 

該數組包含以下範圍的數據:

Dim arr() As Variant 
    Set r3 = Sheets("Konten Tabelle").Range("Tabelle4[[Konto]:[Gruppe]]") 
    i = r3.Rows.Count 
    Rem Datenfeld für die Konten-Tabelle 
    ReDim arr(1 To i, 1 To 2) 
    For j = 1 To i 
     arr(j, 1) = r3.Cells(j, 1) 
     arr(j, 2) = r3.Cells(j, 2) 
    Next 

本身的功能似乎做工精細,但在調用時我收到錯誤參數是不可選的:

Call EntryInTable(Target.Value, arr) 
If EntryInTable > 0 Then 
     Debug.Print EntryInTable 
End If 

我已經在許多論壇,包括這個Wi取得成功。感謝任何人的答案。

+0

arr包含什麼? – inarilo

+0

對不起,只是更新了問題。 – Dooey

回答

2

的問題是在這兩條線...

If EntryInTable > 0 Then 
     Debug.Print EntryInTable 

因爲函數EntryInTable需要兩個參數,你不傳遞任何。

在調用子代替聲明整型變量,而這樣函數被調用一次,否則即使你傳遞正確的參數的功能將與這些線被稱爲三次......

  1. Call EntryInTable(Target.Value, arr)
  2. If EntryInTable > 0 Then
  3. Debug.Print EntryInTable

你可以試試這樣的事情...

Dim cnt As Integer 
cnt = EntryInTable(Target.Value, arr) 
If cnt > 0 Then 
     Debug.Print cnt 
End If 
+0

該功能也有一個錯誤,我猜想,它不會返回任何值 – inarilo

+0

嗯,我不這麼認爲。你是否嘗試過這個功能,並注意到它的一個問題? – sktneer

+0

不,你說得對 – inarilo

0

使用呼叫在這裏是不必要的。該函數不會自動返回賦值給變量。 當你輸入這個 - If EntryInTable > 0時,你再次調用沒有參數的函數。

你需要將其分配給另一個變量,如:

Dim entryPoint as Long 
entryPoint = EntryInTable(Target.Value, arr) 
If EntryInTable > 0 Then 
    Debug.Print EntryInTable 
End If 

也必須定義EntryInTable返回一個長:

Function EntryInTable(stringToBeFound As String, arr1 As Variant) As Long 

Integer是在VBA不必要的。無需節省內存。您的工作表數據將在較大的數據集中溢出。基本上整數是要避免的 - 因爲利弊超過專業人士。