簡體   English   中英

函數名稱在單元格中時如何調用Excel VBA函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM