質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

2回答

5211閲覧

閉じるボタンを押下したらエラーになる

s_george

総合スコア35

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/03/26 05:51

前提・実現したいこと

Access2010で開発したForm上のボタンでエラーが出ます。
ソースコードについては下記を参照ください。

なお、Access2010+Windows7では現象が再現されていません。
現象が出るのはAccess2016+Windows10です。

** 実現したいこととしては、Windows7+Access2010であっても
Windows10+Access2016であってもエラーなく動作させたいです。**

発生している問題・エラーメッセージ

ブックマークが正しくありません

該当のソースコード

VBA

1Private Sub cmdClose_Click() 2On Error GoTo Err_cmdClose_Click 3 4 Dim vntBM As Variant 5 Dim vntSF As String 6 7 If Me.Dirty Then Me.Dirty = False 8 DoCmd.Close 9 10 'add at 2015/10/06 11 'クエリ再実行後に元の画面で画面遷移前の状態にする 12 Form_納入機種一覧.Painting = False 13 14 vntBM = Form_納入機種一覧.Bookmark 15 vntSF = Form_納入機種一覧.ActiveControl.Name 16 17 Form_納入機種一覧.Requery 18 Form_納入機種一覧.Bookmark = vntBM 19 Form_納入機種一覧.Controls(vntSF).SetFocus 20 21 Form_納入機種一覧.Painting = True 22 23Exit_cmdClose_Click: 24 Exit Sub 25 26Err_cmdClose_Click: 27 MsgBox Err.Description 28 Resume Exit_cmdClose_Click 29 30End Sub

試したこと

Windows10+Access2016
Windows7+Access2010
で動作を行いました。

補足情報(FW/ツールのバージョンなど)

Form_納入機種一覧 はエラーが出た画面の呼び出し元の画面名です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Form プロパティ (Access) | Microsoft Docs より引用

フォームの再クエリを行うと、そのフォームのレコードに設定されたすべてのブックマークが無効になります。

再クエリ後、ブックマークを使って元の位置に戻るコードは検索すると結構出てきますが、Microsoftが公式に言っていることなので、その方法は避けたほうがいいでしょう。

呼び出したフォーム上で元フォームと同じレコードを更新して、それを反映させるためにRequeryしているのだと思いますが、更新するのがカレントレコードだけならRefresh(レコードの更新)すれば反映されます。これなら、レコード移動しませんのでブックマークも不要です。

あと、Form_納入機種一覧 とクラス名でフォームを参照していますが、これはサブフォームなどで複数同じフォームを開いているとどのフォームを参照するか不定ですし、開いてないときに参照すると、非表示でインスタンスが生成されるなど、いろいろバグの原因になりやすいので、Forms!納入機種一覧という式で参照するようにすべきです。

vba

1Private Sub cmdClose_Click() 2On Error GoTo Err_cmdClose_Click 3 4 If Me.Dirty Then Me.Dirty = False 5 DoCmd.Close 6 7 Forms!納入機種一覧.Refresh 8 9Exit_cmdClose_Click: 10 Exit Sub 11 12Err_cmdClose_Click: 13 MsgBox Err.Description 14 Resume Exit_cmdClose_Click 15End Sub

もし、呼び出し先のフォームで複数のレコードを更新するなら、bookmarkは使わずに、
CurrentRecordプロパティ(レコード番号)を使って、再クエリ後に元の位置に戻るようにすればいいでしょう。あるいは、主キーフィールドで検索して元のレコードに戻る方法でもいいでしょう。

投稿2019/03/26 13:24

編集2019/03/26 14:34
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_george

2019/03/27 00:14

修正を行ってみますので、実施結果についてはしばらくお待ちください。
guest

0

先ずは、最適化/修復を行ってみて下さい。

投稿2019/03/26 06:42

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_george

2019/03/26 07:29

早速の回答ありがとうございます。 これは手動で開いて最適化/修復を行うということでしょうか? それと一時的にはそれでも良いでしょうが、恒久的にはどのようにしたらよろしいでしょうか?
sazi

2019/03/26 07:38

最適化/修復しても状況は変わらないという事ですか?
s_george

2019/03/27 00:11

まだ実施していませんが、実施の前に確認をしたく質問しました。
sazi

2019/03/27 00:16 編集

回答したのは、 動作する環境で最適化/修復を適用したものを、エラーの出る環境で実行してみたら改善しないか? というものです。 毎回の実施は安全のために「閉じる時に最適化」にチェックを入れておいた方が良いと思いますけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問