我可以在 VBA 中为 Excel 创建跳转 table 吗?

Can I create a Jump table in VBA for Excel?

我编写了一个简单的翻译器/解析器来处理 EDI (830) 文档,使用多个 Select Case 语句来确定要执行的代码。我正在以二进制模式打开文件并将文档拆分为单独的行,然后将每一行拆分为各种元素,其中每行的第一个元素都有一个唯一的段标识符。

我写的代码完美无缺。但是,Select Case 需要检查每个 Case,直到找到匹配项或执行 Case Else。我对 Case 语句进行了排序,使出现最频繁的段(如在循环的情况下)放在最前面,以最大程度地减少实际执行代码之前的“检查”次数。

与其使用多个 Select Case,我更愿意为段标识符确定一个索引,然后使用该索引简单地调用适当的例程。我在 C 和汇编程序中使用过跳转表,并预计在 VBA.

中可能会实现类似的功能

您可以在 VBA 中执行跳转表,方法是使用 Application.Run 方法按名称调用适当的例程。下面的代码演示了它是如何工作的:

Public Sub JumpTableDemo()

  Dim avarIdentifiers() As Variant
  avarIdentifiers = Array("Segment1", "Segment2")
  Dim varIdentifier As Variant
  For Each varIdentifier In avarIdentifiers
    Run "Do_" & varIdentifier
  Next varIdentifier

End Sub

Public Sub Do_Segment1()
  Debug.Print "Segment1"
End Sub

Public Sub Do_Segment2()
  Debug.Print "Segment2"
End Sub

您可以按照以下示例在 Excel VBA 中执行此操作:

该示例假设您已将 EDI 文档拆分为两列,一列包含 'processing instruction',一列包含指令将处理的数据。

跳转 table 在右边,即 'processing instructions' 的不同列表加上每个指令的 Sub 到 运行 例程的名称。

密码是:

Option Explicit

Sub JumpTable()

    Dim wsf As WorksheetFunction
    Dim ws As Worksheet
    Dim rngData As Range '<-- data from your file
    Dim rngCell As Range '<-- current "instruction"
    Dim rngJump As Range '<-- table of values and sub to run for value
    Dim strJumpSub As String
    Dim strJumpData As String

    Set wsf = Application.WorksheetFunction '<-- just a coding shortcut

    Set ws = ThisWorkbook.Worksheets("Sheet1") '<-- change to your worksheet
    Set rngData = ws.Range("A2:A17") '<-- change to your range
    Set rngJump = ws.Range("E2:F4") '<-- change to your circumstances

    For Each rngCell In rngData
        strJumpSub = wsf.VLookup(rngCell.Value, rngJump, 2, False) '<-- lookup the sub
        strJumpData = rngCell.Offset(0, 1).Value '<-- get the data
        Application.Run strJumpSub, strJumpData '<-- call the sub with the data
    Next rngCell

End Sub

Sub do_foo(strData As String)
    Debug.Print strData
End Sub

Sub do_bar(strData As String)
    Debug.Print strData
End Sub

Sub do_baz(strData As String)
    Debug.Print strData
End Sub

确保您为跳转 table 中的每个条目都写了一个 Sub