2016-04-28 11 views
1

So habe ich versucht, eine Funktion zum Hinzufügen von Dezibel in VBA zu erstellen. Ich habe versucht, ParamArray zu verwenden, aber ich habe Probleme mit der Informationsverarbeitung. Idealerweise würde es als SUM() funktionieren und einfach alle Eingaben übernehmen und in eine Formel und einen Boom werfen.Param Array Probleme mit Eingabe

Gerade jetzt, ich habe:

Function DBADD3(ParamArray nums()) As Double 
Dim DBPrTot As Variant 
'this will be input into the log function at the end 

DBPrTot = 0 
'initializing value for use in for loop 
For i = LBound(nums) To UBound(nums) 
    DBPrTot = DBPrTot + 10^(nums(i)/10) 
    'all of the values gathered from ParamArray are being input into this running total 

Next i 

DBADD3 = 10 * WorksheetFunction.Log10(DBPrTot) 
'throwing the DBPrTot running value into our end equation 

End Function 

Ich mag würde es einen Eingang wie DBADD3 (A1: A3, A5, A7) zu nehmen und noch etwas zu produzieren. Kann jemand helfen?

Antwort

4

Sie müssen also wissen, welche Art von Informationen weitergegeben werden. Im vorherigen Beispiel von Ihrem anderen Beitrag wurden Zahlen direkt übergeben, so dass ihr Wert leicht zugänglich war. In diesem Fall übergeben Sie eine Reihe von Bereichen (sowohl Gruppen von Bereichen als auch einzelne Zellen). Sie müssen also jedes Array durchlaufen, um die Bereichsgruppe zu ziehen, und dann den Bereich durchlaufen, um individuelle Werte zu erhalten.

Siehe unten für ein Beispiel einer Grund SUM Stil Funktion:

Function ReturnValues(ParamArray args()) As Double 
    Dim dRunningTotal As Double 

    dRunningTotal = 0 

    For i = LBound(args) To UBound(args) 
     For Each cel In args(i) 
      dRunningTotal = dRunningTotal + cel.Value 
     Next cel 
    Next i 

    ReturnValues = dRunningTotal 
End Function 

Edited hinzufügen: Sie für den Typ des Parameters testen, so dass Sie Fehler gegen das Werfen schützen können, und auch zu handhaben Umstände, unter denen Sie sowohl Reichweite und Werte in den Parametern aufweisen, dh =ReturnValues(A1:A10, 7, 9, B1:B4)

Function ReturnValues(ParamArray args()) As Double 
    Dim dRunningTotal As Double 

    dRunningTotal = 0 

    For i = LBound(args) To UBound(args) 
     If TypeName(args(i)) = "Range" Then 
      For Each cel In args(i) 
       dRunningTotal = dRunningTotal + cel.Value 
      Next cel 
     Else 
      dRunningTotal = dRunningTotal + args(i) 
     End If 
    Next i 

    ReturnValues = dRunningTotal 
End Function 
+0

Bitte ein 'in args' Schleife anstelle einer einfachen' For' Schleife mit einem Zähler, erklären For Each Varg verwenden Sie die Variable 'cel' , verwende 'TypeOf args (i) ist Range' in anstelle von 'TypeName' und testen, ob' IsNumeric (cel.Value) 'vor dem Hinzufügen zu' dRunningTotal'. Ansonsten ist das eine gute Antwort, +1. – Leviathan

+0

Hey @ user3561813 Ich habe ein weiteres Addendum. Das funktioniert gut, ABER wenn der Wert 0 ist, kommt es merkwürdig hoch. Ich würde gerne alle Iterationen überspringen, die 0 mit einer if-Anweisung oder etwas enthalten. Was denken Sie? Ich denke etwas in der Richtung von Wenn args (i) = 0 Dann dRunningTotal = dRunningTotal –

+0

@ T.Heng Es ist nichts falsch mit dem Hinzufügen Ihrer eigenen Business-Logik zu dem Code. Es würde wahrscheinlich so aussehen: 'Wenn cel.Value <> 0 Dann' 'dRunningTotal = dRunningTotal + cel.Value' – user3561813