VBA хранит код для глобального использования - PullRequest
0 голосов
/ 14 июня 2011

Я создавал несколько функций, каждая из которых использует один и тот же код. Данный код от Dim Order_Type As Range до Set PMethod10 = Sheets("KRONOS").Range("$BK:$BK").

Как я могу поместить это в глобальную функцию или что-то подобное, чтобы только вызывать эту функцию и не использовать весь код снова каждый раз?

Public Function BANKING1(rev_date As Date) As Variant

  Dim Order_Type As Range
  Dim Final_Price As Range
  Dim PaidAlt As Range
  Dim Excl_Rev As Range
  Dim PAmount1 As Range
  Dim PMethod1 As Range
  Dim PAmount2 As Range
  Dim PayDate2 As Range
  Dim PMethod2 As Range
  Dim Vstatus As Range
  Dim Team As Range

  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 Vstatus = Sheets("KRONOS").Range("$DL:$DL")
  Set Team = Sheets("KRONOS").Range("$DO:$DO")

  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 PAmount5 = Sheets("KRONOS").Range("$AI:$AI")
  Set PayDate5 = Sheets("KRONOS").Range("$AK:$AK")
  Set PMethod5 = Sheets("KRONOS").Range("$AL:$AL")

  Set PAmount6 = Sheets("KRONOS").Range("$AN:$AN")
  Set PayDate6 = Sheets("KRONOS").Range("$AP:$AP")
  Set PMethod6 = Sheets("KRONOS").Range("$AQ:$AQ")

  Set PAmount7 = Sheets("KRONOS").Range("$AS:$AS")
  Set PayDate7 = Sheets("KRONOS").Range("$AU:$AU")
  Set PMethod7 = Sheets("KRONOS").Range("$AV:$AV")

  Set PAmount8 = Sheets("KRONOS").Range("$AX:$AX")
  Set PayDate8 = Sheets("KRONOS").Range("$AZ:$AZ")
  Set PMethod8 = Sheets("KRONOS").Range("$BA:$BA")

  Set PAmount9 = Sheets("KRONOS").Range("$BC:$BC")
  Set PayDate9 = Sheets("KRONOS").Range("$BE:$BE")
  Set PMethod9 = Sheets("KRONOS").Range("$BF:$BF")

  Set PAmount10 = Sheets("KRONOS").Range("$BH:$BH")
  Set PayDate10 = Sheets("KRONOS").Range("$BJ:$BJ")
  Set PMethod10 = Sheets("KRONOS").Range("$BK:$BK")


            BANKING1 = Application.WorksheetFunction.SumIfs( _
            PAmount1 _
            , Team, "<>9" _
            , Vstatus, "<>rejected", Vstatus, "<>unverified" _
            , Excl_Rev, "<>1" _
            , PMethod1, "<>Credit" _
            , PMethod1, "<>Amendment" _
            , PMethod1, "<>Pre-paid" _
            , PMethod1, "<>Write Off" _
            , First_PD, rev_date)

End Function

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Вы не возвращаете никаких значений, поэтому вам не нужно создавать функцию, в которой вы можете использовать подпрограмму. Однако, поскольку все, что вы делаете, это устанавливаете переменные Range, вам, вероятно, следует просто присвоить им все именованные диапазоны и удалить весь этот код. Затем вы бы ссылались на них так:

Range("Final_Price").Value = 30

Вот видео по именованным диапазонам , , вот еще , а вот учебник .

2 голосов
/ 14 июня 2011

Вы не можете объявить свою переменную где-то еще, но вы можете делегировать объект, чтобы хранить их для вас.

Создайте класс и поместите в него этот код:

Option Explicit

Public Order_Type As Range
Public Final_Price As Range
Public PaidAlt As Range
Public Excl_Rev As Range
Public PAmount1 As Range
Public PMethod1 As Range
Public PAmount2 As Range
Public PayDate2 As Range
Public PMethod2 As Range
Public Vstatus As Range
Public Team As Range


Private Sub Class_Initialize()
  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 Vstatus = Sheets("KRONOS").Range("$DL:$DL")
  Set Team = Sheets("KRONOS").Range("$DO:$DO")

  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 PAmount5 = Sheets("KRONOS").Range("$AI:$AI")
  Set PayDate5 = Sheets("KRONOS").Range("$AK:$AK")
  Set PMethod5 = Sheets("KRONOS").Range("$AL:$AL")

  Set PAmount6 = Sheets("KRONOS").Range("$AN:$AN")
  Set PayDate6 = Sheets("KRONOS").Range("$AP:$AP")
  Set PMethod6 = Sheets("KRONOS").Range("$AQ:$AQ")

  Set PAmount7 = Sheets("KRONOS").Range("$AS:$AS")
  Set PayDate7 = Sheets("KRONOS").Range("$AU:$AU")
  Set PMethod7 = Sheets("KRONOS").Range("$AV:$AV")

  Set PAmount8 = Sheets("KRONOS").Range("$AX:$AX")
  Set PayDate8 = Sheets("KRONOS").Range("$AZ:$AZ")
  Set PMethod8 = Sheets("KRONOS").Range("$BA:$BA")

  Set PAmount9 = Sheets("KRONOS").Range("$BC:$BC")
  Set PayDate9 = Sheets("KRONOS").Range("$BE:$BE")
  Set PMethod9 = Sheets("KRONOS").Range("$BF:$BF")

  Set PAmount10 = Sheets("KRONOS").Range("$BH:$BH")
  Set PayDate10 = Sheets("KRONOS").Range("$BJ:$BJ")
  Set PMethod10 = Sheets("KRONOS").Range("$BK:$BK")
End Sub

Тогда ваша функция:

Public Function BANKING1(rev_date As Date) As Variant
  Application.Volatile True

  With New Class1
    BANKING1 = Application.WorksheetFunction.SumIfs( _
              .PAmount1 _
              , .Team, "<>9" _
              , .Vstatus, "<>rejected", .Vstatus, "<>unverified" _
              , .Excl_Rev, "<>1" _
              , .PMethod1, "<>Credit" _
              , .PMethod1, "<>Amendment" _
              , .PMethod1, "<>Pre-paid" _
              , .PMethod1, "<>Write Off" _
              , .First_PD, rev_date)
  End With

End Function

Все эти поля, не указанные в ваших DIM s, также должны быть перечислены как Public.

Кроме того, экземпляр Class1 может храниться в глобальной переменной на листе, поэтому вам не нужно каждый раз создавать новый экземпляр, но в то же время Excel любит забывать глобальные ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...