2014-02-09 69 views
1

我有一個Excel工作表,其中包含一列中的一些字符串。有時所有條目的是相同的,有時不是:在VBA函數中傳遞Excel範圍,按數組處理並返回結果

enter image description here

enter image description here

我寫的函數傳遞的範圍內作爲一個參數:

= Dent_WG(A1:A6)

VBA函數應確定哪種情況爲真(所有條目=「A1」或至少一個條目=「Ag」),然後分別返回0或12:

Function DentWG(WG_Mat As Range) As Single 

Dim dat As Variant, rw As Variant, temp As Single 
dat = WG_Mat 
temp = 0 

For rw = LBound(dat, 1) To UBound(dat, 1) 
    If dat(rw, 1) = "Ag" Then 
     temp = 12 
    End If 
Next 

If temp = 12 Then 
    DentWG = 12 
Else 
    DentWG = 0 
End If 

端功能

然而,函數總是返回0,即使對於其中「銀」的範圍內發生第二殼體。我確信我無法正確地將範圍轉換爲數組或正確地將預期的邏輯應用於該數組。我的代碼有什麼問題?

回答

2

從你的問題......

的VBA函數應該確定哪些情況是真實的(所有條目=「鋁」,或至少一個條目=「 Ag「),然後分別返回0或12:

這就是你需要的。

Function DentWG(WG_Mat As Range) As Long 
    Dim ClCount As Long 

    ClCount = WG_Mat.Cells.Count 

    If Application.WorksheetFunction.CountIf(WG_Mat, "Al") = ClCount Then 
     DentWG = 0 
    ElseIf Application.WorksheetFunction.CountIf(WG_Mat, "Ag") > 0 Then 
     DentWG = 12 
    End If 
End Function 

同樣可以使用公式

=IF(COUNTIF(A1:A6,"Al")=(ROWS(A1:A6)*COLUMNS(A1:A6)),0,IF(COUNTIF(A1:A6,"Ag") > 0‌​,12,""))

如果它永遠是1列,那麼你不需要*COLUMNS(A1:A6)來實現。這會做。

=IF(COUNTIF(A1:A6,"Al")=ROWS(A1:A6),0,IF(COUNTIF(A1:A6,"Ag") > 0,12,""))

截圖

enter image description here

+1

當然!那個我太快了!不能刪除一個被接受的內容,雖然... – assylias

+0

@assylias:你仍然可以更新你的答案:) –

+0

@Siddharth路過:+1和檢查。感謝這兩個解決方案。他們都爲我工作得很好。我自己的解決方案,我已經在上面糾正過了,也適用。我看到你的解決方案調用Application.WorksheetFunction。在我的簡單應用程序中,資源不是問題,但一般來說:在VBA代碼中調用Application.WorksheetFunction比在嚴格遵循VBA方法的情況下更耗費資源? – jmaz

2

這個工作對我來說:

Function DentWG(WG_Mat As Range) As Single 
    Dim result As Single, cl as Range 
    result = 0 

    For Each cl In WG_Mat 
     If cl = "Ag" Then 
      DentWG = 12 
      Exit Function 
     End If 
    Next cl 

    DentWG = result 
End Function 
+0

這還沒有回答這個問題。 –

+0

@Alex P:不適合我,也許是因爲沒有聲明? – jmaz

+0

@Max:很好的地方。我相應地更新了代碼 –

2

你並不真的需要這樣的UDF。你可以只說:

=IF(COUNTIF(A1:A6,"Ag")>=1,12,0)

+0

+ 1對於非VBA解決方案:)然而,你錯過了一個部分'哪種情況是真的(所有條目=「Al」,或至少一個條目=「Ag」)' –

+0

你仍然忘了「Al」:) –

+0

@SiddharthRout是的,但從他的代碼中,我假定OP認爲輸入可靠地爲「Ag」或「Al」。無可否認,這是很多假設:-) – maybeWeCouldStealAVan