4

さまざまな共有から多数のファイルをダウンロードし、それらのファイルを作業テーブルに連結し、関連情報を操作および計算し、特定のフィールド (および計算) をレポートとして多数の Excel ワークブックにエクスポートするという非常に複雑なプロセスがあります。

このプロセスは、1 つのボタンをクリックするだけでプロセス全体がエンド ツー エンドで実行されるようにコーディングされています。「インジケータ」として機能する一連のテキスト ボックスがあります (赤 - この部分は失敗、緑 - この部分は成功)。ご想像のとおり、プロセス全体のコードは巨大 (MSWord にコピーすると 32 ページ) であり、問​​題が発生したときに取り除くのは困難です。

コードを表にまとめて、よりモジュール化して扱いやすくしたいと思いました。実行したいアクションを含むコンボ ボックスと、操作したいレポート/ファイル/オブジェクトを含む 2 つ目のコンボ ボックスをセットアップしました (つまり、削除 - テーブル 2、取得 - ファイル 1、エクスポート - レポート 4)。del * from tbl_test のような単純なことを行う SQL ステートメントの作成に成功し、コンボ ボックスから問題なく実行できました。

私が知る必要があるのは、本質的にコード スニペットをテーブル (メモ フィールド) に配置し、一致するコンボを選択したときにその vba コードを実行する方法があるかどうかです。

IE 'Acquire - File1' のコードは完全に VBA コードです。ネットワーク ドライブをマップし、ファイルを検索し、ファイルをダウンロードして、ディレクトリに移動します。

IE 'Scrub - tblMain_Part1' のコードは、vba と sql コードの組み合わせです。ファイルの存在を確認し (vba)、見つかった場合は、メイン テーブルの一部を削除し (sql)、見つかったファイルの内容を追加し (sql)、モニターを更新して、ファイルが存在することを示します。完了しました (vba)。ファイルが見つからない場合は、モニター ボックスを赤に変更し、コマンド ボタンのキャプション (vba) を更新します。

私は vba の天才ではありませんが、自分自身を保持しています。私が考えたプロセスは、基本的にコードをテーブル内の管理可能なチャンクに分割できれば、プロセス全体を実行したい場合はコードスミペットを順番に呼び出すか、コードの一部を再実行するだけでよいというものでした。必要に応じて、アクションとレポート/ファイル/オブジェクトの組み合わせを選択します。

どんな考え/アイデアも大歓迎です。

4

4 に答える 4

2

コードをサブに分割するのが最善だと思います。ループするテーブルには、Sub-NameフィールドとblnSuccessフィールドがあります。コードは、各サブルーチンを実行するテーブルをループし、受け取ったエラーに基づいてblnSuccessを更新します。これにより、何が起こったのかを確認しようとすると、クエリ可能な結果セットが得られます。

于 2012-12-11T19:23:46.720 に答える
1

テーブルを使用するのではなく、操作ごとに異なるサブを持つモジュールを作成するだけだと思います。ボタンイベントで、コンボを選択した後、caseステートメントを実行します。

      dim strOperation as string
      strOperation = me!selectionOne
     Select Case strOperation        
    Case "delete": deleteTable(me!selectionTwo)
    Case "export": export(me!selectionTwo)
    case  "acquire": acquire(me!selectionTwo)     
     End Select

もちろん、取得、削除、およびエクスポートのメソッドをモジュールに記述し、そこで各操作に必要なパラメーターを設定します。

これは、これに取り組むために使用できる多くのアイデアの1つにすぎません。

于 2012-12-11T19:46:39.537 に答える
1

マクロの使用を検討してください。テーブルはいらないはずです。また、ハードコーディングされた SQL をクエリに移行することも検討してください。

于 2012-12-11T19:33:10.603 に答える
0

元の回答を編集するつもりでしたが、これは別の方法でオフになっているようです....

エラーが発生した場合に文字列を返す関数にコードを分割するのが最善だと思います。ループするテーブルには、strFunction、strError、およびstrObjectフィールドがあります。コードは、case ステートメントに基づいて各関数を実行するテーブルをループし、strObjectを文字列として渡し、受け取ったエラーに基づいてstrErrorを更新します。このプロセスの後でテーブルをクエリして、どのレコードにエラーがあるかを確認できます。

ボタンが cmdRunAll と呼ばれる場合、ここにそのコードがあります。

Private Sub cmdRunAll_Click()
    On Error GoTo ErrHandler
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("tblCode", dbOpenDynaset, dbSeeChanges)
    If Not rst.EOF Then
        With rst
            .MoveFirst
            Do While Not .EOF
                .Edit
                Select Case !strFunction
                    Case "fExport"
                        !strError = fExport(!strObject)
                End Select
                .Update
                .MoveNext
            Loop
        End With
    End If
    rst.Close
    Set rst = Nothing
    MsgBox "Processes complete"
Exit Sub
ErrHandler:
    Debug.Print Err.Description & " cmdRunAll_Click " & Me.Name
    Resume Next
End Sub

ここに簡単なサンプル関数があります

Public Function fExport(strTable As String) As String
    On Error GoTo ErrHandler
    Dim strError As String
    strError = ""
    DoCmd.TransferText acExportDelim, , strTable, "C:\users\IusedMyUserNameHere\" & strTable & ".txt"
    fExport = strError
Exit Function
ErrHandler:
    strError = Err.Description
    Resume Next
End Function
于 2012-12-11T22:22:51.283 に答える