我有一个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
答案 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
包含public
内Sheet1
方法的方法名称。
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