2017-06-03 249 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不必要的。无需节省内存。您的工作表数据将在较大的数据集中溢出。基本上整数是要避免的 - 因为利弊超过专业人士。