2

最近、非常に古い Access データベースを引き継ぎました。このデータベースには、ユーザーがナビゲートしてデータを入力するのに役立つマクロがたくさん書かれています。したがって、これらのマクロが Access 97 で作成されたという事実にもかかわらず、コードを捨てることはステップ #1 ではありません....

非推奨の関数呼び出しを新しい関数呼び出しで削除することで、ほとんどのコードを機能させることができましたが、まだ正しく機能しない形式がいくつかあります。1つを解決する方法を理解できれば、他の問題も解決できると確信しています。

メイン マクロには、いくつかのボタンを備えたメニューがあります。ボタンをクリックするたびに、「OpenForm アクションがキャンセルされました」というエラーが表示されます。このボタンのコードは次のとおりです。

Option Compare Database   'Use database order for string comparisons

Private Sub Form_Open(Cancel As Integer)
    If IsLoaded("ServiceCircuit") Then
        Me![PropBtn].Visible = True
    Else
        Me![PropBtn].Visible = False
    End If

End Sub

Private Sub Form_Unload(Cancel As Integer)
    If IsLoaded("ServiceCircuit") Then
        Forms![ServiceCircuit].Visible = True
        Forms![ServiceCircuit]![CircuitPrefix].Requery
        Forms![ServiceCircuit]![CircuitPrefix] = Forms![Circuit]![CircuitPrefix]
        Forms![ServiceCircuit]![CircuitBase].Requery
        Forms![ServiceCircuit]![CircuitBase] = Forms![Circuit]![CircuitBase]
        'Forms!ServiceCircuit.Refresh
        Exit Sub
    Else
        If IsLoaded("DedicatedService") Then
            Forms![DedicatedService].Visible = True
            Forms!DedicatedService.Refresh
            Exit Sub
        End If

        If IsLoaded("Property") Then
            Forms![Property].Visible = True
            Forms!Property.Refresh
            Exit Sub
        End If
    End If
End Sub

Private Sub GRC_GotFocus()
    Me![GRC].Requery

End Sub

Private Sub PropBtn_Click()
    DoCmd.Close

    If IsLoaded("ServiceCircuit") Then
        Forms![ServiceCircuit].Visible = True
        DoCmd.Close
        'Forms![ServiceCircuit]![CircuitPrefix].Requery
        'Forms![ServiceCircuit]![CircuitPrefix] = Forms![Circuit]![CircuitPrefix]
        'Forms![ServiceCircuit]![CircuitBase].Requery
        'Forms![ServiceCircuit]![CircuitBase] = Forms![Circuit]![CircuitBase]
        'Forms!ServiceCircuit.Refresh
        Exit Sub
    Else
        If IsLoaded("DedicatedService") Then
            Forms![DedicatedService].Visible = True
            DoCmd.Close
            'Forms!DedicatedService.Refresh
            Exit Sub
        End If

        If IsLoaded("Property") Then
            Forms![Property].Visible = True
            Forms!Property.Refresh
            Exit Sub
        End If
    End If

End Sub

Private Sub Tariff_NotInList(NewData As String, Response As Integer)
    dumbvar = AddRecFromCombo(NewData, "Tariff")

    '  Continue without displaying default error message.
    Response = DATA_ERRCONTINUE

End Sub

私はVBに非常に慣れていないので、うまくいっていませんでしたが、これにどのように取り組むことができるか、または問題が何であるかについて困惑しています。

アップデート:

メイン メニュー フォームにブレークポイントを設定しました。実際のボタンのコードは次のとおりです。

Private Sub CircuitBtn_Click()
On Error GoTo Err_CircuitBtn_Click

    Dim DocName As String
    Dim LinkCriteria As String

    DocName = "Circuit"
    DoCmd.OpenForm DocName, , , LinkCriteria

Exit_CircuitBtn_Click:
    Exit Sub

Err_CircuitBtn_Click:
    MsgBox Err.description
    Resume Exit_CircuitBtn_Click

コードをステップDoCmd.OpenForm DocName, , , LinkCriteria実行すると、 にジャンプしErr_CircuitBtn_Clickます。他の場所にブレークポイントを設定できるとは思いません。これがエラーにジャンプする理由がわからない場合、メイン フォームの他のボタンは同じようにコーディングされています (メイン フォーム上)。コードの最初のチャンク (ポップアップするフォームのコード) にいくつかのブレークポイントを設定しようとしましたが、ブレークポイントがキャッチされません。そのフォームのボタンを押した場合に実行されるスクリプトであるため、ブレークポイントに到達することは決してないと思いますよね?

4

4 に答える 4

1

「OpenFormアクションがキャンセルされました」は、フォーム(「回路」)が正しく開かない場合に発生するエラーです。

そのコードはウィザードによって生成されたものであり、「Docname」と「LinkCriteria」の両方が冗長です。次のように入力して、すぐにウィンドウで試してください

`DoCmd.OpenForm "Circuit"`
于 2013-01-03T10:23:37.317 に答える
1

同じ問題が発生し、なんとか修正できました。

問題は、もともと[B]別のフォームをコピーしてフォームを作成したことでした[A]。そのため[B]、 はrecordsource( を必要としなかったrecordsourceとしても)と同じでした[A]

フォームだったクエリの名前を変更しました[A and B] recordsource。(レコードソースが必要なもの) を更新しました[A]が、それにも更新が必要であることに気づきません[B]でした。

(私にとって)修正は、フォームをバインドする必要がなかったため、 recordsourcefromを削除することでした。とはいえ、他の人にとっての修正は、開発中に変更された可能性のある または他のプロパティ値[B]を修正することかもしれません。recordsource

于 2014-12-31T16:09:46.333 に答える
0

アクセス365でこれに遭遇しました。クライアントの場所にインストールするためにデータベースをセットアップしました。これには、ネットワーク上のクライアントの場所で再リンクできるように、リンクされたテーブルの削除が含まれていました。

accde ファイルをテストしたところ、OpenForm アクションがキャンセルされたことがわかりました。頭をかきむしった後、accde が作成されたファイルに戻りました。同じ問題が発生しました。私はそれが私のカスタム リボンかもしれないと思ったが、違います。

次に、答えが得られることを期待して、そのファイルの VBA を逆コンパイルしました。次に、リボンをまとめて削除し、フォームを直接開こうとしました。レコード ソースが存在しないと表示されました。私は、「そうです、私はそれを見ています」のようでした。

次に、レコード ソース (この場合はクエリ) を開こうとしましたが、テーブルが見つからないと言われました。

もちろんです。データ テーブルへのリンクをすべて削除しました。

于 2020-10-15T16:55:17.917 に答える
-1

もう答えは必要ないと思いますが(質問してからしばらく経ちました)、他の人のために解決策を書きます:

エラー時 GoTo ErrorHandler

' エラーが発生する可能性のあるコードをここに挿入します

DoCmd.OpenQuery "クエリ名"

サブを終了

エラーハンドラ:

' ここにエラーを処理するコードを挿入します

MsgBox "クエリは実行されませんでした"

次を再開

于 2014-12-01T15:10:15.303 に答える