2016-04-28 4 views
1

Итак, у меня есть конкретная задача. Я хочу создать функцию, которая добавит единицы децибела вместе. В настоящее время, вы должны ввести что-то вродеdB калькулятор? Запись функции VBA

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

и сделать это еще больше, если у вас есть как 15 части, которые вы хотите добавить вместе. Вид боли.

В идеале он будет работать как функция excel SUM и просто принимать любые данные. Может ли кто-нибудь помочь мне собрать это вместе или, по крайней мере, показать мне, что будет выглядеть СУМ, если бы вам нужно было создать его с нуля?

Лучший, Т. Хэн

+0

Конец кода заканчивал тем, : Функция DBADD3 (ParamArray nums()) As Double Dim DBPrTot As Variant DBPrTot = 0 F или я = LBound (НУМС) К UBound (Nums) DBPrTot = DBPrTot + 10^(НУМС (я)/10) Далее я DBADD3 = 10 * WorksheetFunction.Log10 (DBPrTot) End Function –

ответ

1

Ниже очень простой пример User Defined Function (который должен быть набран в стандартный модуль), который может принимать любое количество параметров и возвращает сумму этих параметров. Ваш пример, по-видимому, связан с более сложной логикой, поэтому вам придется расширить свой пример. Сообщите нам, если вам нужна дополнительная помощь.

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

Мне нравится используя * ParamArray * ..............., вы можете сделать что-то ДЕЙСТВИТЕЛЬНО близко к * SUM() *, используя его. –

+0

Очень хороший пример! Это очень похоже на СУММ. Если мне нужно учитывать уравнение, я хочу, чтобы часть, входящая в функцию LOG10, использовала эти входы. У меня возникли проблемы с использованием этих итераций. Можете ли вы мне помочь? Понятно, что я прошу, основываясь на моем оригинальном посте? Функция DBADD3 (ParamArray НУМС()) как двойная Тусклого DBPrTot As Variant DBPrTot = 0 Для я = LBound (НУМСА) К UBound (НУМС) DBPrTot = DBPrTot + 10^(НУМС (я)/10) Следующий i DBADD3 = 10 * wf.Log10 (DBPrTot) End Function Это то, что я сейчас –

+0

«code'Function DBADD3 (ParamArray Nums()) As Double Dim DBPrTot как вариант DBPrTot = 0 Для I = LBOUND (Nums) К UBound (НУМС) DBPrTot = DBPrTot + 10^(НУМС (я)/10) Далее я DBADD3 = 10 * wf.Log10 (DBPrTot) End Function –

3

Этот маленький UDF() даст вам больше гибкости:

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 

, где первый аргумент является диапазон входов и второй аргумент число входов:

enter image description here

РЕДАКТИРОВАТЬ # 1:

и если вы хотите UDF() быть больше как SUM() считают:

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 

, чтобы вы могли использовать его как:

=decibelle2(A1:A2) 
+0

О, это отлично и хорошо работает! Что делать, если я хотел бы выбирать параметры, которые не были последовательными? Как A1: A2, A4, A6 и т. Д.? Например, с ParamArray ниже? –

+0

@ T.Heng Я согласен с тем, что 'ParamArray' станет БОЛЬШИМ улучшением этого кода ................. к сожалению, я не эксперт по использованию ParamArray' ............ Я предлагаю, чтобы после того, как вы удовлетворены версией * UDF() *, откройте новый вопрос в вопросе 'ParamArray'. –

+0

Aw, спасибо тонны! Я понял! –

Смежные вопросы