Вызов подпрограмм и значений в пользовательской функции (Excel) - PullRequest
0 голосов
/ 24 января 2012

Буду признателен, если кто-то поможет в том, что, вероятно, простое решение. Ниже приведен краткий код для пользовательской функции в Excel.
Я называю столбцы (в большой электронной таблице) для расчета в SUMIFS расчете. Если я хочу, чтобы те же столбцы были названы и использовать переменные WRITEOFF1 и WRITEOFF "в другой пользовательской функции, как я могу это сделать? Я попытался установить имена столбцов в подпрограмме (в том же VBA Project и Module), а затем попытался вызвать подпрограмму, но, похоже, я не могу передать имена другой функции.

Может кто-нибудь помочь с решением?

Заранее большое спасибо.


Public Function WRITEOFF(rev_date As Variant) As Variant

  Application.Volatile (True)

  Set Order_Type = Sheets("KRONOS").Range("$D:$D")
  Set Final_Price = Sheets("KRONOS").Range("$H:$H")
  Set PaidAlt = Sheets("KRONOS").Range("$I:$I")
  Set Excl_Rev = Sheets("KRONOS").Range("$K:$K")
  Set PAmount1 = Sheets("KRONOS").Range("$O:$O")
  Set First_PD = Sheets("KRONOS").Range("$Q:$Q")
  Set PMethod1 = Sheets("KRONOS").Range("$R:$R")
  Set PAmount2 = Sheets("KRONOS").Range("$T:$T")
  Set PayDate2 = Sheets("KRONOS").Range("$V:$V")
  Set PMethod2 = Sheets("KRONOS").Range("$W:$W")
  Set PAmount3 = Sheets("KRONOS").Range("$Y:$Y")
  Set PayDate3 = Sheets("KRONOS").Range("$AA:$AA")
  Set PMethod3 = Sheets("KRONOS").Range("$AB:$AB")
  Set PAmount4 = Sheets("KRONOS").Range("$AD:$AD")
  Set PayDate4 = Sheets("KRONOS").Range("$AF:$AF")
  Set PMethod4 = Sheets("KRONOS").Range("$AG:$AG")
  Set Vstatus = Sheets("KRONOS").Range("$DL:$DL")
  Set Team = Sheets("KRONOS").Range("$DO:$DO")


        WRITEOFF1 = Application.WorksheetFunction.SumIfs( _
            PAmount1 _
            , Team, "<>9" _
            , Vstatus, "<>rejected", Vstatus, "<>unverified" _
            , First_PD, rev_date _
            , PMethod1, "Write Off")

        WRITEOFF2 = Application.WorksheetFunction.SumIfs( _
            PAmount2 _
            , Team, "<>9" _
            , Vstatus, "<>rejected", Vstatus, "<>unverified" _
            , PayDate2, rev_date _
            , PMethod2, "Write Off")

        WRITEOFF3 = Application.WorksheetFunction.SumIfs( _
            PAmount3 _
            , Team, "<>9" _
            , Vstatus, "<>rejected", Vstatus, "<>unverified" _
            , PayDate3, rev_date _
            , PMethod3, "Write Off")

        WRITEOFF4 = Application.WorksheetFunction.SumIfs( _
            PAmount4 _
            , Team, "<>9" _
            , Vstatus, "<>rejected", Vstatus, "<>unverified" _
            , PayDate4, rev_date _
            , PMethod4, "Write Off")

            WRITEOFF = WRITEOFF1 + WRITEOFF2 + WRITEOFF3 + WRITEOFF4
End Function

1 Ответ

0 голосов
/ 17 мая 2013

Вы должны создать их как именованные диапазоны, которые сохранят их для всех функций, но также предоставят их в виде диапазонов, с которыми можно работать непосредственно на рабочем листе.

Вставка именованных диапазонов из ленты формул, Диспетчер имен,Новое:

Name Manager

В VBA вы можете ссылаться на них как:

x = Application.WorksheetFunction.Sum(Order_Type)

На рабочем листе вы также можете ссылаться на них в ячейке:

=(Sum(Order_Type)) или =VLOOKUP("Steve",Order_Type,2,False) и т. Д.

Если вы предпочитаете не использовать именованные диапазоны, установите переменные как Public, а затем в функции вызовите подпрограмму для назначения диапазонов:

Public Order_Type As Range
Public Final_Price As Range

Function MyFunction()

'Call procedure to set the public variables
SetPublicVars

'Perform your function
MyFunction = Application.WorksheetFunction.Sum(Order_Type)

End Function

Private Sub SetPublicVars()

Set Order_Type = Sheets(1).Range("D:D")
Set Final_Price = Sheets(1).Range("H:H")


End Sub
...