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

在VBA函数中传递Excel范围,作为数组处理,并返回结果,excel,vba,Excel,Vba,我有一个Excel工作表,列中有一些字符串。有时所有条目都相同,有时则不同: 我编写了一个函数,将范围作为参数传递: =凹痕(A1:A6) VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“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

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

我编写了一个函数,将范围作为参数传递:

=凹痕(A1:A6)

VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“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,即使对于范围内出现“Ag”的第二种情况也是如此。我确信我无法将范围正确地转换为数组,或者无法将预期的逻辑正确地应用于该数组。我的代码有什么问题吗?

这对我很有用:

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
这对我很有用:

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

你真的不需要一个自定义项。你可以说:


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

您实际上不需要自定义项。你可以说:

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

根据您的问题

VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“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
这就是你需要的

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”)=(行(A1:A6)*列(A1:A6)),0,IF(COUNTIF(A1:A6,“Ag”)>0‌​,12“”)

如果总是1列,则不需要
*列(A1:A6)
。这就行了

=IF(COUNTIF(A1:A6,“Al”)=行(A1:A6),0,IF(COUNTIF(A1:A6,“Ag”)>0,12,”)

屏幕截图

根据您的问题

VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“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
这就是你需要的

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”)=(行(A1:A6)*列(A1:A6)),0,IF(COUNTIF(A1:A6,“Ag”)>0‌​,12“”)

如果总是1列,则不需要
*列(A1:A6)
。这就行了

=IF(COUNTIF(A1:A6,“Al”)=行(A1:A6),0,IF(COUNTIF(A1:A6,“Ag”)>0,12,”)

屏幕截图



+1对于非VBA解决方案:)但是您遗漏了一部分
哪种情况是正确的(所有条目=“Al”,或至少一条条目=“Ag”)
您仍然忘记了“Al”:@SiddharthRout是的,但从他的代码中,我假设OP假设输入是可靠的“Ag”或“Al”。不可否认,这是一个很大的假设:-)请参见附件中的屏幕截图。问题的这一部分
VBA函数应该确定哪种情况是正确的(所有条目=“Al”,或至少一个条目=“Ag”),然后分别返回0或12:
,然后查看我发布的答案。必须这样做,因为没有人真正得到OP真正想要的东西…+1对于非VBA解决方案:)但是你错过了一部分
哪种情况是正确的(所有条目=“Al”,或至少一条条目=“Ag”)
你仍然忘记了“Al”:@SiddharthRout是的,但从他的代码中我假设OP假设输入是可靠的“Ag”或“Al”。不可否认,这是一个很大的假设:-)请参见附件中的屏幕截图。问题的这一部分
VBA函数应该确定哪种情况是正确的(所有条目=“Al”,或至少一个条目=“Ag”),然后分别返回0或12:
,然后查看我发布的答案。必须这样做,因为没有人真正得到OP真正想要的东西…这也不能回答问题。@Alex P:对我不起作用,可能是因为cl没有声明?从循环中退出函数…真的吗?这也不能回答问题。@Alex P:对我不起作用,可能是因为cl没有声明?从循环中退出函数…真的吗?@Siddharth Rout:+1并检查。感谢这两种解决方案。它们对我来说都很好。我自己的解决方案(我已在上面更正)也能起作用。我看到您的解决方案调用了Application.WorksheetFunction。在我的简单应用程序中,资源不是问题,但一般来说:在VBA代码中调用application.WorksheetFunction是否比严格使用VBA方法更占用资源?@assylias:相反,谢谢你纠正我的循环计数器。它完成了-我只是一个随意的vba er,你可以告诉我与专业的区别!;-)@西德哈特路线:+1并检查。感谢这两种解决方案。它们对我来说都很好。我自己的解决方案(我已在上面更正)也能起作用。我看到您的解决方案调用了Application.WorksheetFunction。在我的简单应用程序中,资源不是问题,但一般来说:在VBA代码中调用application.WorksheetFunction是否比严格使用VBA方法更占用资源?@assylias:相反,谢谢你纠正我的循环计数器。它完成了-我只是一个随意的vba er,你可以告诉我与专业的区别!;-)