Excel:如何将用户定义的函数应用于多个元素然后求它们?

时间:2017-02-05 17:17:58

标签: excel excel-vba vba

我想要做的是将我自己的函数onlyDigits应用于选择中的所有元素,然后对它们求和。

使用数组函数,您可以执行

之类的操作
{=SUM(SQRT(A2:A10))}

总结选择的所有平方根。我想要做的是用我自己的功能有效地替换SQRT。具体来说,我希望能够有像

这样的东西
{=SUM(PRODUCT(onlyDigits(A2:A10), B2:B10))}

仅对每个元素执行数字,将其乘以下面的元素,然后将其加到总和中,表示一个单元格中的最终总和。

我的函数onlyDigits接受它的输入(一个单元格)并只检索它的数字,所以它不仅可以接收数字输入(但我不确定,因此我在这里)。这是来源,我从另一个问题复制了它:

Function onlyDigits(s As String) As String
    ' Variables needed (remember to use "option explicit").   '
    Dim retval As String    ' This is the return string.      '
    Dim i As Integer        ' Counter for character position. '

    ' Initialise return string to empty                       '
    retval = ""

    ' For every character in input string, copy digits to     '
    '   return string.                                        '
    For i = 1 To Len(s)
        If Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= "9" Then
            retval = retval + Mid(s, i, 1)
        End If
    Next

    ' Then return the return string.                          '
    onlyDigits = retval
End Function

这可能吗?如果是这样,我该怎么办?非常感谢!

1 个答案:

答案 0 :(得分:4)

您需要返回一个数组:

Function onlyDigits(s As Range) As Variant()
    ' Variables needed (remember to use "option explicit").   '
    Dim retval() As Variant    ' This is the return string.      '
    Dim i As Integer        ' Counter for character position. '

    ' Initialise return string to empty                       '
    ReDim retval(1 To s.Cells.Count)

    ' For every character in input string, copy digits to     '
    '   return string.
    For j = 1 To s.Cells.Count '
        For i = 1 To Len(s(j))
            If IsNumeric(Mid(s(j), i, 1)) Then
               retval(j) = retval(j) + Mid(s(j), i, 1)
            End If
        Next i
        retval(j) = CLng(retval(j))
    Next j

    ' Then return the return string.                          '
    onlyDigits = retval

End Function

返回的数组是水平的,因此您需要转置它:

=SUMPRODUCT(TRANSPOSE(onlyDigits(A1:A5)),B1:B5)

需要使用Ctrl-Shift-Enter输入数组。

enter image description here