2016-07-06 3 views
1

私は2つのフォームを使用しています。このコードの元のフォームは、予約された予定の週次サマリを示しています。各チームの毎日の予定数と毎日および毎週の合計を表示するテキストボックスが含まれています。私はすべてのテキストボックスのダブルクリックイベントを関数に置き換えました。テキストボックスをダブルクリックすると、別のフォームがそのテキストボックスに数えられるレコードを表示するために使用されます。ユーザーがすでに詳細フォームを開いていて、フォームでフィルターを選択していて、まだフィルターを適用していない場合は、すべて機能します。フォームビューがフィルタービーフォームであるかどうかをチェックする方法

詳細フォームが開いているかどうかを確認します。そうでない場合は、カウントされた予定のレコードを表示するSQLスティンで開きます。詳細フォームがすでに開いている場合は、フィルタが適用されているかどうかを確認し、フィルタを削除してフィルタを適用し、カウントされた予定のレコードを表示します。

If CurrentProject.AllForms("MyForm").IsLoaded = False Then 
    DoCmd.OpenForm "MyForm", , mysql 
Else 
    If Forms("MyForm").FilterOn = True Then Forms("MyForm").FilterOn = False 
    Forms("MyForm").Filter = myfil 
    Forms("MyForm").FilterOn = True 
End If 

詳細フォームがフォームビュー/状態でフィルタに含まれているかどうかを確認するにはどうすればよいですか?そうであれば、それを閉じます。だから私は、カウントされた予定のレコードを表示するフィルタを適用することができます。

+0

これらの場合は既に開いているフォームを閉じてから、フィルタでそのフォームを再度開くだけです。 - フリッカーを避けるため、これを実行中に 'Application.Echo False'を実行することができます。 – Andre

+0

私はこのアプローチを検討していますが、ユーザーがフォームのサイズを変更して好みに合わせるため、フォームの位置とサイズを記録して、同じ場所とサイズで再度開く必要があります。私はまた、エラーをキャッチしてクローズをトリガーして再オープンすることも考えました。私はチェックできるフォームのプロパティがあることを望んでいたが、私はそれを見つける運がなかった。 – tonyuk1977

+0

これは私にはより多くの情報を提供しますが、問題の解決策は見つけられません。質問をより具体的にする方法はhttps://msdn.microsoft.com/en-us/library/office/ff191892.aspxです。 acFilterByForm、acFilterAdvancedなどのこれらのファイラー補助機能をテストするにはどうすればよいですか? – tonyuk1977

答えて

0

ああ、いいえFilterイベントで見つけてください!それは、FilterApplyFilterイベントに設定し、クリアされ

Option Compare Database 
Option Explicit 

Public bFilterByForm As Boolean 

私はFilterByForm状態を保存し、外部からアクセスすることができMyFormのモジュールでパブリック変数を使用します

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer) 

    ' acShowAllRecords = 0 
    ' acApplyFilter = 1 
    ' acCloseFilterWindow = 2 
    Debug.Print "Form_ApplyFilter: " & ApplyType 

    ' I don't think checking for ApplyType is necessary - 
    ' in each case the filter windows is closed. 

    ' FilterByForm is finished! 
    bFilterByForm = False 

End Sub 

Private Sub Form_Filter(Cancel As Integer, FilterType As Integer) 

    ' acFilterByForm = 0 
    ' acFilterAdvanced = 1 
    Debug.Print "Form_Filter: " & FilterType 

    If FilterType = acFilterByForm Then 
     ' FilterByForm is active! 
     bFilterByForm = True 
    End If 

End Sub 

と、この変数を使用して、呼び出し元のサブはFilterByForm状態をチェックすることができます。

If Form_MyForm.bFilterByForm Then 
    ' FilterByForm is active: close the form! 
    DoCmd.Close acForm, "MyForm" 
    DoCmd.OpenForm "MyForm", , mysql 
End If 
+0

これで、フォームを閉じて再度開くのではなく、フィルタービーフォームを取り消す方法を理解する必要があります。 – tonyuk1977

0

大変お手数ですが、私の最終的な解決策はフォームを開いたままにするためのわずかな編集作業です。詳細はAKA MyFormを

Public Sub RunApplyFilter() 
Forms("MyForm").SetFocus 
DoCmd.RunCommand acCmdApplyFilterSort 
End Sub 

を形成し、最終的なチェックがMyFormをFilterByFormがビューであるかどうかを識別するためにアンドレの方法を使用する私はこの機能を追加しました。

If CurrentProject.AllForms("MyForm").IsLoaded = False Then 
    DoCmd.OpenForm "MyForm", , mysql 
Else 
    If [Form_MyForm].bFilterByForm = True Then Forms("MyForm").RunApplyFilter 
    If Forms("MyForm").FilterOn = True Then Forms("MyForm").FilterOn = False 
    Forms("MyForm").Filter = myfil 
    Forms("MyForm").FilterOn = True 
End If 

もう一度Andreに感謝します。

+0

私はacCmdApplyFilterSortをacCmdCloseWindowに置き換えました。フィルタウィンドウを閉じると、フィルタを適用しなくても大丈夫でしたが、ウィンドウが閉じると "レコードがありません"というエラーが表示されます。何か案は? – tonyuk1977

関連する問題