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 をマークし、[生成] ボタンを押します。ユーザーの選択に基づいて関連する機能を実行するにはどうすればよいですか。関連する関数の名前 (レポートごとに 1 つの関数) は、レポートのリストの特定の列 (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

注:これは、1 つのパラメーターを受け取るmyReportGeneratorメソッドを保持するクラスのインスタンスであると想定していGenerateReportます。

編集:うまくいく場合は、関数をシート内に配置します(たとえば、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
于 2012-09-27T13:04:19.160 に答える
2

別の提案として:

「関連する関数」名をパラメーターとして 1 つの関数を呼び出すことを考えましたか?

次に、この関連する関数を呼び出すようにするだけで、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 に答える