Можно ли создать таблицу переходов в VBA для Excel?

Я написал простой переводчик / парсер для обработки документа EDI (830) с использованием нескольких Select Case операторы для определения кода, который будет выполнен. Я открываю файл в двоичном режиме и разделяю документ на отдельные строки, затем каждая строка разбивается на различные элементы, где первый элемент каждой строки имеет уникальный идентификатор сегмента.

Мой код работает отлично, как написано. Тем не мение, Select Case требует проверки каждого Case пока совпадение не найдено или Case Else выполнен. Я упорядочил Case операторы таким образом, что сегменты, которые появляются чаще всего (как в случае циклов), размещаются первыми, чтобы минимизировать количество "проверок перед тем, как код будет фактически выполнен.

Вместо использования нескольких Select Cases, я бы предпочел определить индекс для идентификатора сегмента и просто вызвать соответствующую подпрограмму, используя этот индекс. Я использовал таблицы переходов в 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 для каждой записи в таблице переходов.

Другие вопросы по тегам