[英]How to call an Excel VBA function, when the function's name is in a cell
我有一個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
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
是一個類的實例,該類包含使用1個參數的GenerateReport
方法。
編輯 :如果您可以使用,請將函數放在工作表中(例如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
作為替代建議:
您是否考慮過以“相關函數”名稱作為參數調用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")
最后,只要您不動態創建報告生成功能,我就會重新考慮您的設計方法。 因為,當報表功能為靜態時,您只能在定義的一組功能之間進行選擇。
如果您將函數(或子)的名稱存儲在變量中,則可以使用Run Method
-請參見此鏈接
例如,如果變量fncName = ws.Range("J1").value
然后您可以使用
Application.Run fncName
如果您的函數/子函數需要參數,則此方法最多允許30個參數。請嘗試提供工作簿,模塊和函數名稱的完整路徑,以避免任何潛在的沖突。 這樣就可以在任何工作簿中調用函數,而不必擔心沖突。
EVALUATE
函數方法可能會有用:
debug.Print Sheet2.Cells(1,1).Value
Day(Now())&Month(Now())&Year(Now())
Debug.Print Evaluate(Sheet2.Cells(1,1).Value)
2792012
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.