1

Select Case複数のステートメントを使用して EDI (830) ドキュメントを処理し、実行するコードを決定する単純なトランスレーター/パーサーを作成しました。バイナリ モードでファイルを開き、ドキュメントを個々の行に分割すると、各行はさまざまな要素に分割され、各行の最初の要素には一意のセグメント識別子が含まれます。

私のコードは、書かれたとおりに完全に機能します。ただし、一致が見つかるか実行されるまで、Select Case毎回チェックする必要があります。コードが実際に実行される前の「チェック」の数を最小限に抑えるために、(ループの場合のように) 最も頻繁に現れるセグメントが最初に配置されるように、ステートメントを順序付けました。CaseCase ElseCase

複数の を使用するよりもSelect Case、セグメント ID のインデックスを決定し、そのインデックスを使用して適切なルーチンを呼び出すことをお勧めします。私は C と Assembler でジャンプ テーブルを使用してきましたが、VBA でも同様の機能が可能であると予想していました。

4

2 に答える 2

0

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
于 2017-10-21T12:53:04.400 に答える
0

以下の例に従って、Excel VBA でこれを行うことができます。

ここに画像の説明を入力

この例では、EDI ドキュメントを 2 つの列に分割したと想定しています。

ジャンプ テーブルは右側にあります。つまり、「処理命令」の個別のリストと、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 に答える