2016-05-19 17 views
1

私はCallingという名前のメインフォームを持っています。それは旅行と呼ばれるボタンを持っています。その旅行ボタンは:DoCmdを使用せずにクローズボタンを使用して生成されたVBAアクセスユーザーフォームを閉じるには

Private Sub btnTravel_Click() 
On Error GoTo btnTravel_Click_Err 

    DoCmd.OpenForm "Travel", acNormal, "", "", acFormEdit 
    'If you can find a cleaner way to open a form I will be thankful. 

btnTravel_Click_Exit: 
    Exit Sub 

btnTravel_Click_Err: 
    MsgBox Error$ 
    Resume btnTravel_Click_Exit 

End Sub 

旅行情報フォームは正しく機能します。その旅のフォームは、コードで閉じるボタンがあります。押すと

Private Sub bntClose_Click() 
    Unload Me 
End Sub 

、閉じるコードは、「実行時エラー 『361』を生成する:このオブジェクトをロードまたはアンロードすることはできません

あなたの助けがありますはるかに高く評価。

+1

なぜ 'docmd'なしでこれを行う必要がありますか? – LiamH

答えて

2

あなたは空の文字列とカンマを必要としない、また、あなたが、とにかく新しいレコードを編集して追加することができますフォームを開いたときのようacFormEditが必要なのです。

をあなたはこれを残す場合引数空白フォームはデータmで開きますフォームのAllowEdits、AllowDeletions、AllowAdditions、およびDataEntryの各アクセス許可で設定されたode。

DoCmd.OpenForm "Travel", acNormal 

次のサブルーチンについては、私の代わりにアンロードのdocmd.closeを使用します。保存したい、とあなたは、フォームを保存したい場合はacSaveYesacSaveNoを変更しない場合

Private Sub bntClose_Click() 
    Me.Undo 
    DoCmd.Close acForm, "Travel", acSaveNo 
End Sub 

me.undoは、オプションです。

EDIT:

私はちょうどあなたの質問を再読み込み、あなたがdocmdせずにこれをしたいタイトルに気づきました。

私はこれについて考えており、docmdは、VBAを使ったアクセスでフォームを閉じる標準的な方法です。 unloadをVBから継承しているかどうかはわかりませんが、アクセスを使用する場合はdocmd.closeに固執します。

0

"Unolad me"はアクセスフォームオブジェクトでは機能しません。 アクセスでは、DoCmd.Open/DoCmd.Closeを使用する必要がありますが、それよりも賢明で、アクセスフォームオブジェクトをオブジェクトとして使用できます。アクセス名には、フォームクラス名の先頭に「Form_」が付いています。 "YourForm"という名前のフォームを作成し、アクセス "Form_YourForm"クラスを作成します。実際のオブジェクトとして、このクラスを使用する:あなたが最初にそれを使用するときにVBAのアクセスがちょうどクラスForm_YourFormのうち、「暗黙のうちに」このオブジェクトを作成するためか、使用時にも

'Declare a typed variable 
    Dim f As Form_YourForm 

    'Create the object 
    Set f = New Form_YourForm 'This triggers the Open event 

    'Use the object 
    f.SetFocus 
    f.Resize 

    '... And eventually, dispose the object 
    Set f = Nothing 
    'Remember <<Unload f>> won't work, neither you can use DoCmd.Close 

、あなたはオブジェクト変数として直接Form_YourFormを使用することができますDoCmd.Open。 (はい、ちょっと混乱しますが、Accessは必ずしもプログラマースキルを必要としないユーザーのために作成されています)。 しかし、プロジェクトに存在するフォームクラスのいずれかとしてタイプされた変数オブジェクトを使用するたびに、Form_YourFormクラスの別のインスタンスが取得されます。これは、フォームのインスタンスを必要な数だけ開くことができることを意味します。 DoCmd.Openを使用してそれを実行することはできません。

主な「短所」は、別のモジュールからフォームオブジェクトを処理する必要があることです。 「フォーム」コレクションは引き続き使用できますが、指定したキーがわからないためフォームインスタンスに簡単にアクセスできません。また、独自のコードからフォームを閉じることはできませんが、型付き変数(Set f = nothing)のみを破棄します。

関連する問題