我可以在VBA for Excel中创build一个跳转表吗?

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

我的代码完全按照书面工作。 但是, Select Case需要检查每个Case直到find匹配或执行Case Else 。 我已经对Case语句进行了sorting,使得出现频率最高的段(如循环的情况)首先被放置,以最小化在实际执行代码之前的“检查次数”。

而不是使用多个Select Case ,我宁愿为段标识符确定一个索引,并简单地使用该索引调用适当的例程。 我已经在C和汇编程序中使用了跳转表,并预期在VBA中可能会有类似的function。

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

 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文档分成了两列,一列是“处理指令”,一列是指令处理的数据。

跳转表在右边,即“处理指令”的明确列表加上为每个指令运行的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

Interesting Posts