2016-04-28 27 views
1

So habe ich ziemlich die spezifische Aufgabe. Ich möchte eine Funktion erstellen, die Dezibeleinheiten zusammenfügt. Derzeit haben Sie zur Eingabe etwas wiedB Rechner? VBA-Funktion schreiben

=10*LOG10(10^(A1/10)+10^(A2/10))

und machen dies auch länger, wenn Sie wie 15 Teile haben Sie zusammen fügen. Irgendwie ein Schmerz.

Idealerweise würde es wie die Excel-Funktion SUM funktionieren und nur irgendeinen Eingang aufnehmen. Kann mir jemand helfen, das zusammenzusetzen, oder mir zumindest zeigen, wie SUM aussehen würde, wenn man es von Grund auf neu erstellen müsste?

Best, T. Heng

+0

Endcode endete als : Funktion DBADD3 (ParamArray nums()) als doppelt Dim DBPrTot als Variante DBPrTot = 0 F oder i = LBound (nums) Um UBound (nums) DBPrTot = DBPrTot + 10^(nums (i)/10) Next i DBADD3 = 10 * WorksheetFunction.Log10 (DBPrTot) End Function –

Antwort

1

Die unten ist ein sehr einfaches Beispiel eines User Defined Function (die in einem Standardmodul eingegeben werden sollte), die eine beliebige Anzahl von Parametern erfolgen kann und die Summe dieser Parameter zurückzukehren. Ihr Beispiel scheint eine fortgeschrittenere Logik zu beinhalten, also müssen Sie mein Beispiel erweitern. Lassen Sie uns wissen, wenn Sie mehr Hilfe benötigen.

Function AddSomeDigits(ParamArray nums()) As Double 
    Dim vRunningTotal As Variant 

    vRunningTotal = 0 

    For i = LBound(nums) To UBound(nums) 
     vRunningTotal = vRunningTotal + nums(i) 
    Next i 

    AddSomeDigits = vRunningTotal 
End Function 
+0

Ich mag mit * ParamArray * ............... könntest du etwas wirklich * SUM() * damit machen. –

+0

Sehr gutes Beispiel! Das ist ungefähr wie SUM. Wenn ich die Gleichung berücksichtigen muss, möchte ich, dass der Teil, der in die LOG10-Funktion geht, diese Eingänge verwendet. Ich habe Probleme mit diesen Iterationen. Kannst du mir helfen? Ist es klar, was ich ausgehend von meinem ursprünglichen Beitrag verlange? Funktion DBADD3 (ParamArray nums()) As Double Dim DBPrTot As Variant DBPrTot = 0 Für i = LBound (nums) Um UBound (nums) DBPrTot = DBPrTot + 10^(nums (i)/10) Als nächstes i DBADD3 = 10 * wf.Log10 (DBPrTot) End Function Ist das, was ich habe jetzt –

+0

‚code'Function DBADD3 (ParamArray nums()) As Double Dim DBPrTot As Variant DBPrTot = 0 Für i = LBound (nums) Um UBound (nums) DBPrTot = DBPrTot + 10^(nums (i)/10) Next i DBADD3 = 10 * wf.Log10 (DBPrTot) End Function –

3

Diese kleine UDF() wird Ihnen mehr Flexibilität:

Public Function decibelle(rng As Range, N As Long) As Double 
    Dim wf As WorksheetFunction, i As Long, Z As Double 
    Set wf = Application.WorksheetFunction 
    For i = 1 To N 
     Z = Z + 10^(rng(i)/10) 
    Next i 
    decibelle = 10 * wf.Log10(Z) 
End Function 

wo das erste Argument ist der Bereich der Eingänge und das zweite Argument ist die Anzahl der Eingänge:

enter image description here

EDIT # 1:

und wenn Sie wollen, dass die UDF() mehr wie SUM sein() betrachten:

Public Function decibelle2(rng As Range) As Double 
    Dim wf As WorksheetFunction, r As Range, Z As Double 
    Set wf = Application.WorksheetFunction 
    For Each r In rng 
     Z = Z + 10^(r.Value/10) 
    Next r 
    decibelle2 = 10 * wf.Log10(Z) 
End Function 

so könnte man es verwenden möchte:

=decibelle2(A1:A2) 
+0

Oh, das ist schlau und funktioniert gut! Was, wenn ich Parameter wählen wollte, die nicht aufeinanderfolgen? Wie A1: A2, A4, A6 und so weiter? Wie mit ParamArray unten? –

+0

@ T.Heng Ich stimme zu, dass "ParamArray" eine große Verbesserung für diesen Code wäre ................. Leider bin ich kein Experte für 'ParamArray' ........... Wenn Sie mit einer Version von * UDF() * zufrieden sind, sollten Sie eine neue Frage zum Problem "ParamArray" öffnen. –

+0

Aw, vielen Dank! Ich hab es geschafft! –