2015-07-10 5 views
1

Я пытаюсь передать функцию (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, я чувствую, что я делаю неправильно , но я не уверен, как это сделать правильно.

+1

вы получаете аргумент не обязательным, поскольку 'OpenPulledReports' считает, что вы пропусканием _results_ из' 'GetFileNames' и GetFilePaths' не самой функции.Я не думаю, что вы сможете пройти _function_, как в VBA. Это более новая языковая функция. – Brad

+1

Вы не можете передавать функции в VBA. Вы можете вызвать функцию по имени с помощью «Application.Run» или вызвать метод объекта с именем «CallByName», но вы не можете передавать фактические функции. Мне кажется, вам не нужно их пропускать, почему бы вам просто не передать результаты функций? – GSerg

+0

@Brad и @GSerg в порядке, поэтому я пытаюсь получить 'GetFileNames()', чтобы принять 'GetDateItems (currentDate)' в качестве аргумента, но я не могу понять, что синтаксис правильный. Возможно, было бы разумнее вернуться к использованию 'ByRef' для всего, поскольку аргументы функции не являются опцией? Изменить: @mumfy – Tawm

ответ

0

Вы действительно не можете передавать функции в VBA, к сожалению, и OpenPulledReports() считает, что он получает 2 значения.
Итак, вы звоните OpenPulledReports(GetFilePaths(), GetFileNames()) думает, что он получает вывод от GetFilePaths() и GetFileNames(), которые затем получают ошибки, так как вы не передаете им правильные входы.

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