1

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

我的代码完全按照编写的方式工作。但是,Select Case需要检查每一个,Case直到找到匹配项或Case Else执行。我Case以这样一种方式对语句进行了排序,即最常出现的段(如循环的情况)被放置在最前面,以尽量减少实际执行代码之前的“检查次数”。

与其使用多个Select Cases,我更愿意为段标识符确定一个索引,并使用该索引简单地调用适当的例程。我在 C 和汇编程序中使用了跳转表,并且预计在 VBA 中可能会出现类似的功能。

4

2 回答 2

0

您可以在 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
于 2017-10-21T12:53:04.400 回答
0

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

在此处输入图像描述

该示例假设您已将 EDI 文档分成两列,一列包含“处理指令”,另一列包含指令将处理的数据。

跳转表在右侧,即“处理指令”的不同列表加上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

确保您已Sub为跳转表中的每个条目编写了一个。

于 2017-10-21T12:53:19.897 回答