2017-09-10 1 views
2

In Excel VBA, ich weiß, ich kann eine Array-Formel für mehrere Zellen verwenden, indem Sie einen Bereich von Zellen von Col C auswählen und tun = A1: 10 * B1: B10 Strg-Shift-Enter.In Excel VBA, wie schreibe ich eine Funktion, die in einer Array-Formel arbeiten kann?

Aber angenommen, anstelle des Multiplikationsoperators möchte ich, dass es mein MyMult ist.

Wie würde ich die mymult-Funktion schreiben?

Function MyMult(a As Integer, b As Integer) 
    MyMult = a * b 
End Function 

Was ich habe, funktioniert nicht

enter image description here

+1

Was ist Ihre erwartete Ausgabe? '(1 * 2) * (1 * 3) * (1 * 4)' = '24'? – BruceWayne

+0

Ihr Beispiel ist unzureichend, da die beste Methode, die Anforderungen zu erfüllen, darin besteht, '= a1 * b1' in C1 zu platzieren und dann doppelt auf den Füllpunkt zu klicken. – Jeeped

+0

Warum werden 'a' und' b' auch als 'Integer' deklariert, wenn Sie sie als' Range' verwenden? – BruceWayne

Antwort

5

die Argumente als Variante erklären. Dann Application.Caller.HasArray verwenden zu überprüfen, ob die UDF als Matrixformel verwendet wird:

Public Function MyMult(a, b) 
    If Application.Caller.HasArray Then 
    Dim valsA(), valsB(), r& 
    valsA = a.Value 
    valsB = b.Value 

    For r = LBound(valsA) To UBound(valsA) 
     valsB(r, 1) = valsA(r, 1) * valsB(r, 1) 
    Next 

    MyMult = valsB 
    Else 
    MyMult = a * b 
    End If 
End Function 

Beachten Sie, dass Sie benötigen C1 auszuwählen: C3 vor STRG + SHIFT + ENTER.

+0

Oh cool, ich habe nie von dem 'HasArray'-Ding gewusst. Nettes Denken, daran muss ich mich erinnern. – BruceWayne

+0

Gibt es eine Möglichkeit für eine Array-Formel, die spezifische Zeile zu kennen und darauf zu reagieren? So zum Beispiel für die Multiplikationsfunktion, um sie nicht nur zu multiplizieren, sondern an das Ergebnis anzufügen, basierend darauf, welche Zeile es z. https://i.imgur.com/cITiW6Q.png – barlop

+0

Eine Array-Formel verarbeitet alle Zeilen in einem einzelnen Aufruf und gibt die Ergebnisse in einem Array zurück. Also ja, es ist möglich. In diesem Beispiel ist "r" der Index der Zeile. –

Verwandte Themen