- ベストアンサー
コンボボックスの更新
アクセス2000を使用しています. 業務名というコンボボックスがあるサブフォームをいくつかのフォームで表示しています。 コンボボックスの内容を編集したり追加、削除も出来るように業務名一覧というフォームを作成して、閉じるボタンをクリックした時のイベントで更新をする作業をしたいのですが、 Private Sub cmd閉じる_Click() DoCmd.Close Forms!F業務名一覧.Requery で更新するという所までは分かるのですが、 Forms!フォーム名.サブフォーム名.コンボボックス名.Requery とすると、開いていないフォームがあるためにエラーになってしまいます。 なにか良い方法があれば教えて下さい.
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 よく分からないのですが、コンポボックスのあるフォームは幾つか開いている 状態ですか?それとも1つだけですか? で以下の方法で解決はできると思います。 1.業務名一覧フォームに可視しないテキストボックス(仮の名前「元フォーム」) を作ります。 2.業務名一覧フォームを呼び出す時(開く時)に「元フォーム」にユニークな値を 設定する。 例えば「フォーム1」から呼び出す時は「1」「フォーム2」から呼び出す時は 「2」とかを設定する。 3.業務名一覧フォームを閉じる時、開いているフォームが1つだけならば(多分 呼び出し元のフォームだと思うのですが・・・)そのフォームに対して「Requery」 を実行する。 例) ------------------------------------------------------------------ Private Sub cmd閉じる_Click() Dim MF As Integer MF = Me![元フォーム] DoCmd.Close Forms!F業務名一覧.Requery Select Case MF Case 1 Forms!フォーム1.サブフォーム名.コンボボックス名.Requery Case 2 Forms!フォーム2.サブフォーム名.コンボボックス名.Requery End Select End Sub ------------------------------------------------------------------ 複数開いている状態であれば「SelectObject」コマンドでフォームが開いてい るかどうかをチェックした後に「Requery」を実行する。 例) ------------------------------------------------------------------ Private Sub cmd閉じる_Click() Dim RT_CD As Integer Dim MF As Integer MF = Me![元フォーム] ' DoCmd.Close Forms!F業務名一覧.Requery ' ' エラー設定開始 On Error GoTo Err_RTN: ' ' フォーム1が開いているかチェック RT_CD = 0 DoCmd.SelectObject acForm, "フォーム1" If RT_CD = 0 Then Forms!フォーム1.サブフォーム名.コンボボックス名.Requery End If ' ' フォーム2が開いているかチェック RT_CD = 0 DoCmd.SelectObject acForm, "フォーム2" If RT_CD = 0 Then Forms!フォーム2.サブフォーム名.コンボボックス名.Requery End If ' ' エラー設定解除 On Error GoTo 0: ' ' 呼び出し元のフォームに戻ります。 Select Case MF Case 1 DoCmd.SelectObject acForm, "フォーム1" Case 2 DoCmd.SelectObject acForm, "フォーム2" End Select Exit Sub ' ' エラールーチン Err_RTN: ' フォームが開いていない時(2489) If Err.Number = 2489 Then RT_CD = 1 ' その他のエラー Else RT_CD = 9 End If Resume Next End Sub ------------------------------------------------------------------ 注意:RT_CDが「9」の時のハンドリングは考慮していません。 必要に応じてバンドリングしてください。 ではでは・・・
その他の回答 (2)
- paz777
- ベストアンサー率47% (77/163)
こんにちは。paz777です。 >たびたびの質問ですみませんがよろしくお願いします。 いえいえ、お分かりになるまで質問してください。 では本題に・・・ >2.業務名一覧フォームを呼び出す時(開く時)に「元フォーム」にユニークな値を設定する。 >例えば「フォーム1」から呼び出す時は「1」「フォーム2」から呼び出す時は「2」とかを設定する。 > >の箇所の設定がどうすればいいのか分かりません。 一応、"フォーム1"から"業務名一覧"を開く場合を例にします。 1."業務名一覧"フォームを開くのをマクロで行っている場合には、 "フォームを開く"アクションの下に以下のアクションを追加します。 -------------------------------------------------------------- "値の代入"アクション "アイテム" ← "Forms![業務名一覧]![元フォーム]" "式" ← "1" -------------------------------------------------------------- 2."業務名一覧"フォームを開くのを"イベントプロシージャ"で行っている場合には、 -------------------------------------------------------------- DoCmd.OpenForm "業務名一覧" Forms![業務名一覧]![元フォーム] = "1" -------------------------------------------------------------- と記述します。 "フォーム2"から"業務名一覧"を開く時は"1"のところを"2"にしてください。 また何かありましたら補足ください。 ではでは・・・
お礼
大変遅くなりましたが、無事出来ました。 フォームが開いているかチェックするのに、SelectObject acFormを使用するというのは全然知らなかったので勉強になりました。 エラー処理までも教えて下さって本当に感謝します。 これからもよろしくお願いします。
- Good-S15
- ベストアンサー率33% (149/439)
開発7年、技術コンサル3年勤務している者です。 >閉じるボタンをクリックした時のイベントで >更新をする作業をしたい そうですが、これは仕様ですか? 仕様であれば、SE側というか プログラム仕様書レベルのミスだと思います。 開いてないフォームを開き、開かれているフォームに 隠す感じでユーザの見た目をゴマカスようにする しかないのではないでしょうか? 私も業務アプリは開発してきましたが、 追加、削除、更新、終了はそれぞれ 別の処理(イベント)で行ってきました。
補足
私もとりあえず再クエリをする時に開いていないフォームも全て開いてこのエラーを切り抜けていたのですが、やはりこの方法しかないのでしょうか?
補足
返事が遅れてすみません。 paz777さんに教えてもらった通り(フォームが複数開いている状態の場合)でしてみているのですが、 2.業務名一覧フォームを呼び出す時(開く時)に「元フォーム」にユニークな値を設定する。 例えば「フォーム1」から呼び出す時は「1」「フォーム2」から呼び出す時は「2」とかを設定する。 の箇所の設定がどうすればいいのか分かりません。 たびたびの質問ですみませんがよろしくお願いします。