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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

Q&A

解決済

1回答

1364閲覧

Access2010でMe.Filterを使って検索すると、勝手に元のテーブルのデータが更新される

ot2os

総合スコア23

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

0グッド

0クリップ

投稿2017/10/18 08:54

●経緯:
Access2010を使って、データベースを検索して参照、変更して保存、新規作成等ができるフォームを作ろうとしています。
最終的な目的は [検索]、[保存]、[新規]等のボタンを作成し、それぞれのボタンを押したときに該当の動作をするフォームにしたいと思います。

下記のようなテーブルを一つ作成しています。

ID品名価格
1パソコン¥100,000
2マウス¥500
3キーボード¥1,000

フォームはごく単純に[フォームウィザード]の「単票形式」で作成。
フォーム内のボタンは[プロパティ]→[イベント]→クリック時の[コードビルダー]からVBAにて記載しました。

●わからないこと:
現在、AccessのVBAで下記のコマンドを組んで動作を確認していますが、検索ボタン(コマンド7_Click)をクリックした時点で勝手に元のテーブルがフォーム内に打ち込んだ文字列に変更されてしまいます。
例えば、ID1の「パソコン」が表示された状態でフォームの「品名」に「キーボード」と打ち込むと、検索ボタンを押した時点でテーブルのID1の品名が「キーボード」になってしまいます。

理想としては、元のテーブルのデータを変更せずに、検索した結果をフォーム内に表示したいのですが、どのようにすればよいのでしょうか?

lang

1Private Sub コマンド7_Click() 2 Me.Filter = "品名 like'*" & 品名 & "*'" 3 Me.FilterOn = True 4End Sub 5 6Private Sub コマンド8_Click() 7 8End Sub

●試したこと:
下記の操作では、元のテーブルは勝手に変更されませんでした。

・「品名」内を変更して何もしない
・「品名」内を変更して「価格」等の他のボックスに入力カーソルを移す
・「品名」内を変更して[Enter]キーを押す
・サブプロシージャ内が空欄(何もしない)ボタン(コマンド8_Click)を作成し、そのボタンをクリック

下記の操作では元テーブルのデータも変わらず、正常に検索結果がフォームに反映されました。
・新たに「テキストボックス」を一つ作成し、Filterをかける際のテキストをそのテキストボックスから参照

元テーブルのデータが変更されてしまう基準がよくわかりません。
検索文字列の入力と検索結果の表示を同じテキストボックスで併用する使い方は一般的ではないのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

検索文字列の入力と検索結果の表示を同じテキストボックスで併用する使い方は一般的ではないのでしょうか?

そんな使い方はしません。
検索では別なテキストボックスを使用します。(この時コントロールソースは使用しない。)

検索ボタン(コマンド7_Click)をクリックした時点で勝手に元のテーブルがフォーム内に打ち込んだ文字列に変更されてしまいます。

勝手にではありません。テーブルとリンクした項目に値を入れ、
filterでレコードが移動すると、当然テーブルに値が更新されます。

理想としては、元のテーブルのデータを変更せずに、検索した結果をフォーム内に表示したいのですが、どのようにすればよいのでしょうか?

別なテキストボックスで検索すれば、問題は無いかと思います。

投稿2017/10/18 15:29

sazi

総合スコア25184

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

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

ot2os

2017/10/19 04:49 編集

ありがとうございます。 ご提案通り、素直に別のテキストボックスで検索する方式にします。 ちなみに、あまり必要ないかもしれませんが、検索と結果表示を同じテキストボックスで併用する場合のコードを書きました。 こちらはテーブルが更新されずに検索結果を出すことができました。 Private Sub コマンド7_Click() Dim str As String str = 品名 Screen.ActiveForm.Undo Me.Filter = "品名 like'*" & str & "*'" Me.FilterOn = True End Sub また、下記のコードを仕込むことで、テーブルの意図しない更新を防止することができました。 うっかりミスを防ぐため、こちらの方式を使おうと思います。 Private Sub Form_BeforeUpdate(Cancel As Integer) If MsgBox("データ更新しますか?", vbYesNo, "確認") = vbNo Then Screen.ActiveForm.Undo End If End Sub
sazi

2017/10/19 12:07

老婆心でコメントすると、根本の手当てをせずイベントなどでのif文による分岐で対応するやり方をしていると、機能の追加で影響が出て分岐をさらに追加するようになりスパゲッテーソースが出来上がることになります。(イベントが複合してくると本当に収拾がつかなくなります) 経験不足の場合、無理からぬことではありますが、経験者談ということで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問