基于VBA条件的Excel产品

基于VBA条件的Excel产品,vba,excel,Vba,Excel,有人知道如何在基于工作表的SUMPRODUCT调用中使用VBA函数吗 这很好,将N列中的值相加,其中L列包含“Y”,A列包含与K列不同的值 =SUMPRODUCT(--(Input!L1:L100="Y"), --(Input!A1:A100<>Input!K1:K100), Input!N1:N100) 我的VBA中有一个名为MatchNames的函数,但我无法计算它需要返回什么才能工作。我尝试返回一个布尔整数数组(设置为0或1),我尝试在返回结果之前转置结果,但没有任何效果。我

有人知道如何在基于工作表的SUMPRODUCT调用中使用VBA函数吗

这很好,将N列中的值相加,其中L列包含“Y”,A列包含与K列不同的值

=SUMPRODUCT(--(Input!L1:L100="Y"), --(Input!A1:A100<>Input!K1:K100), Input!N1:N100)
我的VBA中有一个名为MatchNames的函数,但我无法计算它需要返回什么才能工作。我尝试返回一个布尔整数数组(设置为0或1),我尝试在返回结果之前转置结果,但没有任何效果。我已经通过MatchNames函数进行了调试,它确实返回了一些“有用”的东西(即一个布尔数组),因此,不是函数在一段时间内爆炸,而是我得到了#值!当我尝试在产品中使用它时

这是我的VBA函数

Public Function MatchNames(ByVal rng1 As Range, rng2 As Range) As Boolean()
    Dim blnOut() As Boolean
    Dim k As Long

    ReDim blnOut(rng1.Rows.Count - 1)

    For k = 1 To rng1.Rows.Count
        If rng1.Cells(k, 1).Value <> "" Then
            If rng1.Cells(k, 1).Value <> rng2.Cells(k, 1).Value Then
                blnOut(k - 1) = True
            End If
        End If
    Next

    MatchNames = blnOut
End Function
公共函数匹配名(ByVal rng1作为范围,rng2作为范围)作为布尔值()
Dim blnOut()作为布尔值
暗k一样长
ReDim blnOut(rng1.Rows.Count-1)
对于k=1到rng1.Rows.Count
如果rng1.Cells(k,1).Value为“”,则
如果rng1.Cells(k,1)。值rng2.Cells(k,1)。值,则
blnOut(k-1)=真
如果结束
如果结束
下一个
MatchNames=blnOut
端函数

我认为您的MatchNames数组需要按照您的建议进行转置(因为它似乎返回的是一行值的等效值,这与SUMPRODUCT中的其他值列不起作用)

我不知道如何在VBA中转置,但如果不能这样做,那么就在SUMPRODUCT中转置,如

=SUMPRODUCT(--(输入!L1:L100=“Y”),--转置(匹配名称(输入!A1:A100,输入!K1:K100)),输入!N1:N100)

但转置的使用意味着公式现在需要使用
CTRL+SHIFT+ENTER

…或者您可以使用MMULT,它将1x100范围乘以100x1,即

=MMULT(匹配名称(输入!A1:A100,输入!K1:K100)+0,输入!N1:N100*(输入!L1:L100=“Y”)


对于后一个公式的工作范围总和-输入!N1:N100-必须全部为数字

ahhh是的,谢谢。太棒了。在返回之前,我曾尝试在代码中进行转置,这意味着我不能将对象作为布尔数组返回,但在公式中进行转置是有效的。谢谢您可以让您的UDF返回一个二维数组(1列和n行),而不是使用转置。如果返回1和0而不是布尔值,则也不需要--。
Public Function MatchNames(ByVal rng1 As Range, rng2 As Range) As Boolean()
    Dim blnOut() As Boolean
    Dim k As Long

    ReDim blnOut(rng1.Rows.Count - 1)

    For k = 1 To rng1.Rows.Count
        If rng1.Cells(k, 1).Value <> "" Then
            If rng1.Cells(k, 1).Value <> rng2.Cells(k, 1).Value Then
                blnOut(k - 1) = True
            End If
        End If
    Next

    MatchNames = blnOut
End Function