4

我有一个 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,然后按下“生成”按钮。如何根据用户选择运行相关功能。相关功能的名称(每个报告一个功能)列在报告列表的特定列 (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

4 回答 4

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包含方法名称,它是public内部的方法Sheet1

EDIT2:假设您已将此方法放在名为class1. 这是你要做的

dim reportHelper as Class1
set reportHelper = new Class1

CallByName reportHelper, c.Offset(0, 1).Value, vbMethod
于 2012-09-27T13:04:19.160 回答
2

就像一个替代建议:

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

然后,您可以只SELECT CASE调用这个相关函数,然后您就可以处理输入错误,以防相关函数名称出现错误。

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

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

于 2012-09-27T13:09:01.393 回答
1

如果您将函数(或子)的名称存储在变量中,则可以使用Run Method- 请参阅此链接

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

然后你可以使用调用函数

Application.Run fncName

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

于 2012-09-27T13:53:11.550 回答
0

一个EVALUATE 函数方法可能会有用:

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

Debug.Print Evaluate(Sheet2.Cells(1,1).Value)
2792012
于 2012-09-27T12:42:47.797 回答