2017-02-05 1 views
2

Was ich versuche zu tun, ist meine eigene Funktion onlyDigits auf alle Elemente in einer Auswahl anwenden und dann summieren.Excel: Wie man eine benutzerdefinierte Funktion auf viele Elemente anwendet und sie dann summiert?

Mit Array-Funktionen, können Sie Dinge wie

{=SUM(SQRT(A2:A10))} 

Um alle die Quadratwurzeln aus einer Auswahl zu summieren. Was ich tun möchte ist, SQRT effektiv durch meine eigene Funktion zu ersetzen. Insbesondere möchte ich wie

etwas zu haben, in der Lage sein
{=SUM(PRODUCT(onlyDigits(A2:A10), B2:B10))} 

die onlyDigits auf jedem Element durchführt, multipliziert sie mit dem einen darunter, und fügt sie dann zu der Summe, die endgültige Summe in einer Zelle darstellt.

Meine Funktion onlyDigits nimmt seine Eingabe (eine Zelle) und ruft nur die Zahlen ab, es könnte also ein Problem sein, nicht nur numerische Eingaben zu erhalten (aber ich bin mir nicht sicher, also bin ich hier). Hier ist die Quelle, ich habe es von einer anderen Frage kopiert:

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 

Ist das möglich? Wenn ja, wie kann ich es tun? Vielen Dank!

+1

nicht sicher, ob ich verstehen, warum ist Ihre Funktion 'Wie String'? Soll nicht ein numerischer Wert zurückgegeben werden? sollte nicht "Long" oder "Double" sein? –

+0

Was meinen Sie mit "nicht nur numerische Eingabe erhalten"? Kannst du mehr Informationen geben? wie eine Stichprobe von Daten in einem Arbeitsblatt und wie diese 'Funktion' angewendet wird? Was ist das erwartete Ergebnis? –

Antwort

4

Sie benötigen ein Array zurück:

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 

Das Array zurückgegeben wird, ist horizontal, so dass Sie es umsetzen müssen:

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

Es muss Array eingegeben werden mit Ctrl-Shift-Enter .

enter image description here

+0

Schöne Erklärung –

Verwandte Themen