• ベストアンサー

accees レコードを指定して開いた後

フォームにコマンドボタンを作成して レコードを指定して特定のフォーム開くというボタンまでは作れました。 無事、別フォームが開くのですが、そのフォームにはフィルタがかかっており、他のレコードに移動できません。 項目を入力して一旦閉じ、再度指定せずに開くと入力した内容は反映されています。 他のレコードと見比べる時に一回一回閉じないと確認できないので困っております。 何か方法があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#3です #2の補足にある > これから出来ないこともないというのを試してみます。。 これは、やってみられましたか > 先頭に戻るんですね。。。。 > てっきり編集したレコードが表示されたままになるかと思っていました > これはどうしようもないのでしょうか? > 重ね重ねすみません これに対してのヒントは、#2内にあります。 > 検索して、あったらそこを表示するように・・・ 動きを確認できた以下の記述を変更していきます。 Private Sub btn1_Click()   Me.FilterOn = Not Me.FilterOn End Sub ここに、フィルタを解除した際に、検索する処理を盛り込みます。 Private Sub btn1_Click()   If (Me.FilterOn) Then     Me.Painting = False ' ★     Me.FilterOn = False     With Me.RecordsetClone       .FindFirst Me.Filter       If (Not .NoMatch) Then Me.Bookmark = .Bookmark     End With     Me.Painting = True ' ★   Else     Me.FilterOn = True   End If End Sub ★部分は、画面がチラつくのを防止する為に入れたものになります。 Me.FilterOn = True (フィルタがかかっていたら)だったら、 フィルタを解除して(この時、表示は一旦先頭に戻る) Me.Filter に設定されていた条件で、表示しようとしている内容を検索します。 見つかったら、そこを表示するように・・・ この画面表示の切り替えでチラつくのを抑止する為に、★を記述しておきます。 #2で記述していたのは、フィルタは使わずに、 表示する条件を OpenArgs 経由で受け渡ししましょう・・・というものになります。 いろいろなフィルタパターンで試してみてください。 大半は大丈夫かと思いますが・・・・ ダメな場合があったら、その時に考えるってことでも良いかも・・・・ ※ Access メニュー内のフィルタ条件を使い始めたら、おかしくなるかも・・・

9tree
質問者

お礼

出来ました!! ながらくお付き合いくださってありがとうございました

その他の回答 (3)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#2です > コマンドボタン「btn1」を配置したとした場合、クリック時に以下を記述 > > Private Sub btn1_Click() >   Me.FilterOn = Not Me.FilterOn > End Sub ここに至るまでの手順は以下 ・起動されるフォーム「入力用」をデザインで開きます ・プロパティは表示しておきます ・コマンドボタンをヘッダ部分に配置します ・プロパティで名前を「btn1」に変更します ・プロパティ「クリック時」部分をダブルクリックします  すると [イベント プロシージャ] の表示に変わります  (表示が変わらなかったら [イベント プロシージャ] の表示にします) ・その表示右側に  [...]  のボタンが現れていると思うのでクリックします  すると、以下の表示の画面に切り替わります Private Sub btn1_Click() End Sub ・ここで表示された真中の空白行部分に  Me.FilterOn = Not Me.FilterOn を貼り付けるなりします Private Sub btn1_Click()   Me.FilterOn = Not Me.FilterOn End Sub ・保存して終わりになります。 #1ではコマンドボタンの名前を強制するつもりもなかったので 必要な部分の記述に止めておきました。 #2では具体化した記述にしたつもりです。 ただ、「btn1」名が既にあったら迷われる??? ※  [...]  のボタンをクリックした時にできる記述部分は Private Sub ★★_☆☆() End Sub ★★ は、名前 ☆☆ は、イベントを示す文字列 「btn1」の「クリック時」で [...]  のボタンをクリックしたので Private Sub btn1_Click() End Sub になっただけです。名前が違っていたら、その時の名前で作られます。 既に記述があったら、そこを表示するだけです。 > >レコード移動の右側に表示されている「フィルタ適用」をクリックすることで解除できます。 > これがどこの事を指すのかがわからないのですが、フォームのプロパティを開くとフィルタという項目があったので 私の書き方/伝え方が悪かったでしょうか > Access のバージョンが 2007 以上で、「移動ボタン」を「はい」として表示しているのなら > レコード移動の右側に表示されている「フィルタ適用」をクリックすることで解除できます。 バージョンが 2003 であれば、該当しないと思います。 > また、おっしゃるとおりフィルタをかけたまま開くと > [番号]=300 > とフィルタの項目に出ています > 当然コレを消すと他のレコードには行けるようにはなるのですが。。 消すという行為は、Me.Filter = "" とすることと同じです。 Me.Filter = "" とすると Me.FilterOn = False に自動設定されます。 Me.Filter = "" でフィルタは解除されますが、 ・他を確認後もう一度フィルタをかけた状態にしたい・・・ これを考えた時、Me.Filter の内容が残っている必要があります。 なので、Me.FilterOn の状態を変更するだけのものを記述していました。 単にフィルタをかける/解除するだけなので、 特に解除時、表示は先頭に戻ってしまいます。 この動きで良い、嫌だ・・・は次の段階かと思います。 もし、フィルタを解除したらそのままで良い・・・・であれば Private Sub btn1_Click()   Me.Filter = "" End Sub の記述だけでフィルタは解除されると思います。 (私なら、Me.FilterOn = False にする・・・これ、明示する以下を記述します) Private Sub btn1_Click()   Me.FilterOn = False   Me.Filter = "" End Sub Filter / FilterOn の動きについて興味あれば以下を覗いてみてください Me.FilterOn = True は先でも後で http://okwave.jp/qa/q7087180.html

9tree
質問者

補足

これは私の書き方が悪かったです Private Sub btn1_Click()   Me.FilterOn = Not Me.FilterOn End Sub と記述してもエラーも出ませんがまったく動きません それで元々のVBの文に付け足してMe.FilterOn = Not Me.FilterOn といれてみたのですが、フィルターがかかったままということが言いたかったのです。 さてそれはさておきようやく理解&動作できました。 開いた後のフォーム内にボタンを作ればよかったのですね。 見事にボタンのON/OFFでフィルタが切り替わります。 しかしながらおっしゃられているように >単にフィルタをかける/解除するだけなので、 >特に解除時、表示は先頭に戻ってしまいます。 >この動きで良い、嫌だ・・・は次の段階かと思います。 先頭に戻るんですね。。。。 てっきり編集したレコードが表示されたままになるかと思っていました これはどうしようもないのでしょうか? 重ね重ねすみません ちなみにフィルターのアイコンはツールバーにありました(2003までがそういう仕様なのでしょうね・・) リンク先も見させていただきましたがどうも高度すぎて理解できませんw

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

#1です #1に記述した > Me.FilterOn = Not Me.FilterOn は、やってみていない・・・・という事でしょうか。 > stDocName = "入力用" > > stLinkCriteria = "[番号]=" & Me![番号指定] > DoCmd.OpenForm stDocName, , , stLinkCriteria これは、推測したものに一致します。 Me![番号指定] が 123 であれば、起動されたフォーム「入力用」には Me.Filter = "[番号]=123" Me.FilterOn = True が設定されていると思います。 Access のバージョンが 2007 以上で、「移動ボタン」を「はい」として表示しているのなら レコード移動の右側に表示されている「フィルタ適用」をクリックすることで解除できます。 (2010 は持っていないので、違っていたらすみません) 「移動ボタン」を「いいえ」として表示していないとか、 バージョンが 2007 以前のものだとかした場合、 #1で記述した方法が楽なのかと思います。 コマンドボタン「btn1」を配置したとした場合、クリック時に以下を記述 Private Sub btn1_Click()   Me.FilterOn = Not Me.FilterOn End Sub このフォームが、他のフォームとどうからんで・・・等々、私には見えてません。 操作上使える方法なのか、実際にやってみてください。 なお、 > 検索の様な形 であれば、やり方は変わってきますが、できないことはありません。 せっかくなので、その方法も記述しておきます。 起動するフォームでの記述) > stLinkCriteria = "[番号]=" & Me![番号指定] > DoCmd.OpenForm stDocName, , , stLinkCriteria この stLinkCriteria は、 WhereCondition 部分に指定するのではなく OpenArgs 部分に指定します DoCmd.OpenForm stDocName, , , , , , stLinkCriteria 起動されたフォーム Form_Open での記述) Private Sub Form_Open(Cancel As Integer)   If (Not IsNull(Me.OpenArgs)) Then     With Me.RecordsetClone       .FindFirst Me.OpenArgs       If (Not .NoMatch) Then Me.Bookmark = .Bookmark     End With   End If End Sub OpenArgs が設定されていたら、検索して、あったらそこを表示するように・・・ 実際にやってみる/みないは、自由だと思いますが、回答した側から見ると、残念です。

9tree
質問者

補足

#1に記述した > Me.FilterOn = Not Me.FilterOn これは、やっておりません 当方VBはまるで素人の為、どこに入れていいのかもわかりませんです。。。 Private Sub btn1_Click()   Me.FilterOn = Not Me.FilterOn End Sub と書いてくださったので「Me.FilterOn = Not Me.FilterOn」を試しにPrivate Sub btn1_Click()の直下に入力してみましたが、やはりフィルタがかかってしまいます その他色々場所を変えていれましたが結果は変わらず。。。 accessのヴァージョンは2003です 移動は「はい」になっています >レコード移動の右側に表示されている「フィルタ適用」をクリックすることで解除できます。 これがどこの事を指すのかがわからないのですが、フォームのプロパティを開くとフィルタという項目があったので TUREとfalseを入れてみましたがこれも変わらず。。。 また、おっしゃるとおりフィルタをかけたまま開くと [番号]=300 とフィルタの項目に出ています 当然コレを消すと他のレコードには行けるようにはなるのですが。。 う~ん何が違うのでしょうか?? これから出来ないこともないというのを試してみます。。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

> レコードを指定して特定のフォーム開くというボタン > 別フォームが開くのですが、そのフォームにはフィルタがかかっており この状況を推測してみると、 別フォームを起動する際の DoCmd.OpenForm で、第4引数(WhereCondition)を指定していませんか。 これを指定すると、起動されたフォームでは、 Me.Filter 部分に WhereCondition が、Me.FilterOn = True となったように思います。 なので フィルタがかかる・・・・ フィルタを解除するには、Me.FilterOn = False を設定してあげればよいです。 起動されたフォームのヘッダとかにボタンを配置し、そのクリック時に以下を記述すれば フィルタがかかる/解除 がギッコンバッタンに Me.FilterOn = Not Me.FilterOn 推測が外れていましたら、どのように起動しているのか、補足をお願いします。 ※ フィルタがかかる 特定のレコードを表示する方法で、 起動されたフォームのレコードソース内の抽出条件に起動元のコントロールを参照する 方法もありますが、これ、「フィルタがかかる」とは言わないですよね??

9tree
質問者

補足

回答ありがとうございます 状況を説明させて頂きますと、もくじ的なフォーム画面があり、ここから普通に全レコードを開く釦と質問で述べたレコード指定して開く釦を作り別の入力用フォームが開くようにしました。 両方共ウィザードで作りました。 やりたい事はレコード指定して開いたものが、通常開いたものと同じ様に使用したいのです。指定して開くというよりは検索の様な形でしょうか。。。 以下コマンド文をコピペします Private Sub コマンド4_Click() On Error GoTo Err_コマンド4_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "入力用" stLinkCriteria = "[番号]=" & Me![番号指定] DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_コマンド4_Click: Exit Sub Err_コマンド4_Click: MsgBox Err.Description Resume Exit_コマンド4_Click End Sub *フィルタがかかるというのは画面上にそう出ているので書かせてもらいました。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう