当函数名称在单元格中时如何调用Excel VBA函数
我有一个XLS检索一个dynamic生成的报告列表:
B | C | D | E | F | G | H | I | J 1 1 | Bob |Jones |bjones| rep 1|Sales Report | Desc.| X | fnGenerateSalesReport 2 1 | Bob |Jones |bjones| rep 2|Revenue Rep. | Desc.| _ | fnGenerateRevenueReport 3 1 | Bob |Jones |bjones| rep 3|Customer List| Desc.| _ | fnGenerateCustReport 4 1 | Bob |Jones |bjones| rep 4|Stock Report | Desc.| _ | fnGenerateStockReport
用户在他们想要生成的报告(列I)旁边标记X,并按下“GENERATE”button。 如何根据用户的select获取相关function? 相关function的名称(每个报告一个function)列在报告列表中的特定列(Col J)中(见下文)。
在debug.print
行我希望它调用dynamic值保存在c.Offset(0, 1).Value
Dim ws As Worksheet, rng As Range, stRows As Long Dim c As Range Set ws = Sheets("AVAILABLE REPORTS") Set rng = ws.Range("B12:B12") Set rng = ws.Range(rng, rng.End(xlDown)) stRows = rng.Rows.Count Set rng = ws.Range("I12:I12") Set rng = ws.Range("I12:I" & 11 + stRows) For Each c In rng.Cells If c.Value = "X" Or c.Value = "x" Then Debug.Print "> [" & c.Value & " (" & c.Offset(0, 1).Value & ")]" End If Next
For Each c In rng.Cells If c.Value = "X" Or c.Value = "x" Then CallByName myReportGenerator, "GenerateReport", vbMethod, c.Offset(0, 1).Value End If Next
注意:我假定myReportGenerator
是一个持有GenerateReport
方法的类的实例,它需要1个参数。
编辑 :如果它与你一起工作,放置在一个工作表内的function(如Sheet1
)。
CallByName Sheet1, c.Offset(0, 1).Value, vbMethod
假定c.Offset(0, 1).Value
包含方法名称,它是Sheet1
一个public
方法。
编辑2 :假设你已经把这个方法放在一个名为class1
的类中。 这是你要做的
dim reportHelper as Class1 set reportHelper = new Class1 CallByName reportHelper, c.Offset(0, 1).Value, vbMethod
正如另一个build议:
你有没有想过用“相关函数”-name作为参数调用ONE函数?
然后你可以创build一个SELECT CASE
来调用这个相关的函数,并且你可以处理input错误,以防realevant函数的名字是faultive。
For Each c In rng.Cells If c.Value like "X" Then CallRelevantFunction c.Offset(0, 1).Value End If Next
如果需要, CallRelevantFunction
甚至可以有多个参数。
CallRelevantFunction ("rep 1", "fnGenerateSalesReport")
最后,只要不是dynamic创build报表生成函数,我会重新考虑您的devise方法。 因为,当报告函数是静态的,那么你只能在它们的定义集之间进行select。
如果存储在variables中的Function(或Sub)的名称可以使用Run Method
( Run Method
– 请参阅此链接
例如,如果variablesfncName = ws.Range("J1").value
那么你可以使用调用该函数
Application.Run fncName
如果你的函数/子需要参数,这个方法允许多达30个。试着给出工作簿,模块和函数名的完整path,以避免任何潜在的冲突。 然后可以在任何工作簿上调用函数,而不用担心冲突。
一个EVALUATE
函数方法可能是有用的:
debug.Print Sheet2.Cells(1,1).Value Day(Now())&Month(Now())&Year(Now()) Debug.Print Evaluate(Sheet2.Cells(1,1).Value) 2792012