Я пытаюсь передать функцию (2 функции, на самом деле) в качестве аргументов для Sub с линией:VBA: Передача функции в качестве аргумента
Call OpenPulledReports(GetFilePaths(), GetFileNames())
Я не уверен, если я нужно ()
в конце имен, но я получаю ошибку Argument not optional
.
Вот эти две функции:
Function GetFilePaths(ByRef GetDateItems) As String
Dim fp As String
Dim cy2c As String
cy2c = GetDateItems(currentYear2char)
fp.PartMasterFilePath = "path1" & cy2c & "\" & currentMonth & "\"
fp.SupplierMasterFilePath = "path 2" & cy2c & "\" & currentMonth & "\"
GetFilePaths = fp
End Function
Function GetFileNames(ByRef GetDateItems) As String
Dim f As String
Dim cd As String
cd = GetDateItems.currentDate
f.FargoPlant = "part master for SM - blah1 - " & cd & ".xls"
f.Logistics = "part master for SM - blah2 - " & cd & ".xls"
f.PES = "part master for SM - blah3 - " & cd & ".xls"
f.Torreon = "part master for SM - blah4 - " & cd & ".xls"
f.FargoSM = "Supplier Master - blah5 - " & cd & ".xls"
f.TorreonSM = "Supplier Master - blah6 - " & cd & ".xls"
GetFileNames = f
End Function
И я предполагаю, что я буду включать GetDateItems()
, поскольку он ссылается на обе эти функции:
Function GetDateItems() As String
Dim d As String
d.currentMonth = Format(Date, "mmmm") 'July
d.currentDate = Format(Date, "mm-dd-yy") '06-09-15
d.currentYear2char = Format(Date, "yy") '15
d.currentYear4char = Format(Date, "yyyy") '2015
d.currentFiscalMonth = Format(DateAdd("m", 1, Date), "mm") '08
d.wsDate = currentFiscalMonth & currentYear4char '082015
GetDateItems = d
End Function
Я был первоначально только с помощью ByRef
к каждому DateItem
, FilePath
и FileName
пункту, но решил поместить их в свои собственные функции, чтобы очистить свой код вверх.
Большое спасибо за ваше время.
EDIT:
Я @ Брэд пытается использовать объект теперь вместо String.
Я теперь получаю «объект переменной или с блока переменной не установлено» ошибка времени выполнения на линии d.currentMonth = ...
Function GetDateItems() As String
Dim d As Object
d.currentMonth = Format(Date, "mmmm") 'July
d.currentDate = Format(Date, "mm-dd-yy") '06-09-15
d.currentYear2char = Format(Date, "yy") '15
d.currentYear4char = Format(Date, "yyyy") '2015
d.currentFiscalMonth = Format(DateAdd("m", 1, Date), "mm") '08
d.wsDate = currentFiscalMonth & currentYear4char '082015
GetDateItems = d
End Function
Основываясь на этом: http://www.cpearson.com/excel/Classes.aspx, я чувствую, что я делаю неправильно , но я не уверен, как это сделать правильно.
вы получаете аргумент не обязательным, поскольку 'OpenPulledReports' считает, что вы пропусканием _results_ из' 'GetFileNames' и GetFilePaths' не самой функции.Я не думаю, что вы сможете пройти _function_, как в VBA. Это более новая языковая функция. – Brad
Вы не можете передавать функции в VBA. Вы можете вызвать функцию по имени с помощью «Application.Run» или вызвать метод объекта с именем «CallByName», но вы не можете передавать фактические функции. Мне кажется, вам не нужно их пропускать, почему бы вам просто не передать результаты функций? – GSerg
@Brad и @GSerg в порядке, поэтому я пытаюсь получить 'GetFileNames()', чтобы принять 'GetDateItems (currentDate)' в качестве аргумента, но я не могу понять, что синтаксис правильный. Возможно, было бы разумнее вернуться к использованию 'ByRef' для всего, поскольку аргументы функции не являются опцией? Изменить: @mumfy – Tawm