Macro : Somme en décibel

Bonjour à tous,

voilà mon problème : j'ai régulièrement des données à traiter en décibel (échelle logarithmique). Il m'arrive souvent de devoir effectuer des sommes logarithmiques sur ces données. J'aimerais donc créer une macro basée sur le modèle de la somme qui me permette de le faire.

En gros la macro s'utiliserai de la manière suivante :

Dans une cellule on écrit =sdb(plage de donnée) et on obtient le résultat de la somme en dB de la plage de donnée continue (une colonne par exemple) ou discontinue (valeurs discrètes dans un tableau).

Mathématiquement, une somme en dB s'exprime de la manière suivante :

sdb(x1,x2,... xn) = 10 * log10 ( 10^(x1/10) + 10^(x2/10)+ ... + 10^(xn/10) )

Exemple simple de vérification sdb(90, 90, 90, 90) = 96.

Y a-t-il des personnes qui auraient des idées de démarche pour effectuer cette macro. (il me semblait qu'on pouvait récupérer les codes VBA des fonctions implémentées dans excel mais je ne retrouve pas comment faire. cela m'aurait permis de reprendre le code de la somme et de l'adapter à mon problème).

Merci beaucoup !

Bonjour

Function sdb(plage As Range)
    Dim cel As Range
    sdb = 0
    For Each cel In plage
        sdb = sdb + 10 ^ (cel / 10)
    Next
    sdb = 10 * Application.WorksheetFunction.Log10(sdb)
End Function
122somme-db.xlsm (13.81 Ko)

Merci beaucoup pour cette réponse,

Ce code marche très bien sur une plage continue mais par contre, il ne me permet pas de traiter les plages discontinues. Comment serait-il possible que le code "sdb(A1;A5;A7;B8)" fonctionne ?

Bonjour,

cette fonction attend un seul paramètre et là tu lui en passes 4.

Met ta ref multiple entre ( ) pour n'en faire qu'un :

=sdb((A1;A5;A7;B8))

eric

Bonjour Eric,

Hélas ça ne marche pas plus comme ça. Je pense que cela vient de la déclaration comme "Range" qui est forcément continue (enfin je pense ^^'). Il suffirait de déclarer plage autrement par contre je n'ai aucune idée de ce que ça peut être...

Post provisoire inutile, la solution se situe ci-dessous :

Voici la version corrigée, avec Areas

Comme le signale Eric, ne pas oublier la double parenthèse dans ce cas !

Function sommeDB(plage As Range)
    Application.Volatile
    Dim cell As Range
    temp = 0
    For i = 1 To plage.Areas.Count
        For Each cell In plage.Areas(i)
            temp = temp + 10 ^ (cell / 10)
        Next
    Next i
    sommeDB = 10 * Application.WorksheetFunction.Log10(temp)
End Function

Formidable ! Merci beaucoup à tous les deux !

Je maintiens que ça fonctionne sans modification, la simple boucle dans les cellules est suffisante. Voir PJ.

eric

PS : .volatile est superflu ici, elle est bien ré-évaluée si un des arguments est modifié.

125classeur1.xlsm (14.53 Ko)

Merci Eric pour ton apport ... je ne connaissais pas cette astuce quelque part logique puisque la double parenthèse permet de "leurrer" excel sur le fait qu'il n'y a qu'un seul argument à la fonction !

Rechercher des sujets similaires à "macro somme decibel"