我可以在 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
。
我编写了一个简单的翻译器/解析器来处理 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
。