当函数名称在单元格中时如何调用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 MethodRun 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