2016-03-05 85 views
0

所以我寫了一個簡單的函數在VBA中,我想在我的Excel工作簿中使用它。我寫了下面的代碼:#VALUE錯誤從我的VBA功能

Option Explicit 
Public Function KOLICINA(fiksnacena As Long, ceni() As Long, nedela() As Long) As Long 
    Dim brojac As Integer 
    For brojac = 1 To UBound(nedela) 
     If Not ((IsEmpty(nedela(brojac) Or nedela(brojac) = 0) And ceni(brojac) <> fiksnacena)) Then KOLICINA = nedela(brojac) 
    Next brojac 
End Function 

當我嘗試(使用=KOLICINA(18;G22:G26;H22:H26)) 工作表單元格中使用它,我得到的#VALUE錯誤。 我不明白爲什麼。函數應該經過nedela數組,如果它找到非空或不同於0的值,並且ceni數組中的匹配單元格與fiksnacena不同,它應該返回nedela中單元格的值。

+0

也許把'ceni()'和'nedela()'改成'Range'而不是'Long'? –

+0

'然後KOLICINA = nedela(brojac)'也許可以替換爲'Then',接着是'KOLICINA = nedela(brojac)',然後是'Exit Function',然後是'End If'。一旦你找到了返回值,爲什麼繼續循環(除非你想要最後一場比賽)? –

+0

顯然你的意思是如果不是(IsEmpty(nedela(brojac))或nedela(brojac)= 0)和ceni(brojac)<> fiksnacena Then'。 – GSerg

回答

3

您不能簡單地將單元格範圍引用傳遞給UDF,並將其解釋爲單個維數的long數組。

Public Function KOLICINA(fiksnacena As Long, ceni As Range, nedela As Range) As Long 
    Dim brojac As Long, vCeni As Variant, vNedela As Variant 
    vCeni = ceni.Value2 
    vNedela = nedela.Value2 
    For brojac = LBound(vNedela, 1) To UBound(vNedela, 1) 
     If Not ((IsEmpty(vNedela(brojac, 1) Or vNedela(brojac, 1) = 0) And vCeni(brojac, 1) <> fiksnacena)) Then 
      KOLICINA = vNedela(brojac, 1) 
      Exit For 
     End If 
    Next brojac 
End Function 

當您將範圍引用中的值轉儲到數組中時,總是以二維數組結束;在你的例子中,它是1到5,1到1.

爲了進一步說明這一點,如果你在轉換它們並從CSE結束UDF以後,你的原始UDF代碼可以工作,值作爲數組進行處理。

=KOLICINA(18, VALUE(TRANSPOSE(G22:G26)), VALUE(TRANSPOSE(H22:H26))) 

以[ctrl] + [shift] + [enter]結束。

+0

謝謝大家,特別是@Jeeped,你的回答解決了我的問題。初學者的錯誤 –