Можно ли создать таблицу переходов в VBA для Excel?
Я написал простой переводчик / парсер для обработки документа EDI (830) с использованием нескольких Select Case
операторы для определения кода, который будет выполнен. Я открываю файл в двоичном режиме и разделяю документ на отдельные строки, затем каждая строка разбивается на различные элементы, где первый элемент каждой строки имеет уникальный идентификатор сегмента.
Мой код работает отлично, как написано. Тем не мение, Select Case
требует проверки каждого Case
пока совпадение не найдено или Case Else
выполнен. Я упорядочил Case
операторы таким образом, что сегменты, которые появляются чаще всего (как в случае циклов), размещаются первыми, чтобы минимизировать количество "проверок перед тем, как код будет фактически выполнен.
Вместо использования нескольких Select Case
s, я бы предпочел определить индекс для идентификатора сегмента и просто вызвать соответствующую подпрограмму, используя этот индекс. Я использовал таблицы переходов в C и Ассемблере, и ожидаемые аналогичные функции могут быть возможны в VBA.
2 ответа
Вы можете создавать таблицы переходов в 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 на два столбца: один с "инструкцией обработки", а другой с данными, которые будут обрабатываться инструкцией.
Таблица переходов расположена справа, т.е. отдельный список "инструкций по обработке" плюс имя 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
для каждой записи в таблице переходов.