在VBA函数中传递Excel范围,在数组中处理,返回结果

时间:2014-02-09 18:49:52

标签: excel-vba vba excel

我有一个Excel工作表,列中包含一些字符串。有时所有条目都是相同的,有时不是:

enter image description here

enter image description here

我写了一个函数来传递范围作为参数:

= Dent_WG(A1:A6)

VBA函数应确定哪种情况为真(所有条目=“Al”,或至少一个条目=“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

结束功能

但是,即使对于在该范围内出现“Ag”的第二种情况,该功能也始终返回0。我确定我无法正确地将范围转换为数组或正确地将预期逻辑应用于该数组。我的代码出了什么问题?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你真的不需要UDF。你可以这样说:

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

答案 2 :(得分:2)

从你的问题......

  

VBA函数应确定哪种情况为真(所有条目=“Al”,或至少一个条目=“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