当函数的名称在单元格中时,如何调用Excel VBA函数

时间:2012-09-27 12:38:05

标签: excel excel-vba vba

我有一个XLS,可以检索动态生成的报告列表:

    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”按钮。如何根据用户选择运行相关功能。相关功能的名称(每个报告一个功能)列在报告列表中的特定列(Col J)中(见下文)。

debug.print行,我希望它使用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

4 个答案:

答案 0 :(得分:3)

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个参数。

编辑:如果它适用于您,请将功能放在工作表内(例如Sheet1)。
CallByName Sheet1, c.Offset(0, 1).Value, vbMethod

假设c.Offset(0, 1).Value包含publicSheet1方法的方法名称。

EDIT2 :假设您已将此方法放在名为class1的类中。 这就是你要做的事情

dim reportHelper as Class1
set reportHelper = new Class1

CallByName reportHelper, c.Offset(0, 1).Value, vbMethod

答案 1 :(得分:2)

正如另一种建议:

您是否考虑过使用“相关函数”-name作为参数调用ONE函数?

然后你可以让SELECT CASE调用这个相关的函数然后你就可以处理输入错误了,以防realevant函数名称出现故障。

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")

最后,只要您不动态创建报告生成功能,我就会重新考虑您的设计方法。因为,当报表函数是静态的时,您只能在已定义的一组中进行选择。

答案 2 :(得分:1)

如果您拥有存储在变量中的函数(或Sub)的名称,则可以使用Run Method - 请参阅此link

例如,如果变量fncName = ws.Range("J1").value

然后您可以使用

调用该函数
Application.Run fncName

如果您的函数/ sub需要参数,则此方法最多允许30个。尝试并提供工作簿,模块和函数名称的完整路径以避免任何潜在的冲突。然后可以在任何工作簿中调用函数而不用担心冲突。

答案 3 :(得分:0)

EVALUATE 函数方法可能会有用:

debug.Print Sheet2.Cells(1,1).Value
Day(Now())&Month(Now())&Year(Now())

Debug.Print Evaluate(Sheet2.Cells(1,1).Value)
2792012