こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access オプションボタンで検索対象の切替

▼やりたい事
フォームにテキストボックスを利用した検索画面を配置しております。
ここにキーワードを入れて商品の検索をするのですがこの時、検索対象を「テーブルから」か「クエリから」か選べるようにオプションボタンを作りたいと考えております。

▼現状のデータ
【テーブルA】:商品情報の元データです。
【クエリA】:商品情報変更後のデータです。テーブルAを参照して変更後のデータに見せています。

テーブルとそれを参照しているクエリのフィールドは同じです。
テーブルAのフィールド1が「n」の時、クエリAのフィールド1は「フィールド1: "d"」のようにしています。

理由は元データと変更後のデータ、別で持つとテーブル数が30以上できる為、分かりづらいと思ったからです。
また、今後商品が増えた際に、元データを追加するだけで変更後のデータとしてクエリで見せかける事ができる為です。

例ではテーブルAとクエリAの存在しか明示しておりませんが、このような関係のデータが複数あり、内容もテーブルAとテーブルB…では違う為、1つのテーブルにまとめるような事も考えておりません。

▼質問
オプショングループを作成し、共通フィールド2のオプション値をテーブルは「0」、クエリは「1」としたのですが、オプショングループのコントロールソースに当てはまる式をどう書けばいいのかつまづいてしまいました。

元データと変更後データを同じテーブル内に保存しないとオプションボタンは機能しないのでしょうか?

また、他に検索対象を「テーブルから」か「クエリから」か選べるようにするにはどんな方法がありますか?
参考になるWEBページ、書籍、又は作成する上でのヒントをいただけましたら幸いです。

作業環境は、OS:Windws7、使用ソフト:Access2003です。

宜しくお願い致します。

投稿日時 - 2015-07-28 19:43:40

QNo.9020359

困ってます

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

補足: CutStr()の処理の流れ

Public Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim M AS Integer
  Dim strDatas() As String
  Dim strReturn AS String
  
  '
  ' strDatas(0)に""が代入されるようにTEXTを加工
  ' その後、Text を区切り子で分割して配列に代入
  '
  strDatas = Split("" & Separator & Text, Separator, , 0)
  '
  ' strDatas()の配列の数を変数Mに代入
  '
  M = UBound(strDatas)
  IF M <= N THEN
    '
    ' N が配列の数をオーバーしていない時は指定の値を戻り値にセット
    '
    strReturn = strDatas(N)
  ELSE
    '
    ' N が配列の数をオーバーしていれば""を戻り値にセット
    '
    strReturn = ""
  END IF
  CutStr = strReturn
End Function

IF-THEN処理は、論理式を使うことで完結に書けます。標準モジュールの自作関数は、短い・速いが命ですから、先のCutStr()ように論理式で書いています。しかし、通常のアプリケーションのプログラムコードは<初心者でも見ただけで判る>がモットウ。ですから、通常は補足のような書き方をお薦めします。

投稿日時 - 2015-07-29 19:41:24

お礼

この2日、ずっと読み解いていたのですが、すみません…全然読み解けませんでした。

かろうじて分かったのはこの補足として書いて頂いたコードを効率的に書いたものが、回答No.1でお答えいただいたコードだという事だけです。

「Dim M AS Integer」がMを代入させるものとし(変数?)、「M = UBound(strDatas)」が、Mに代入された値を示してる(引数?)、のような事をして処理してるのかなー?というのをなんとなく感じただけで、理解までは追いつきませんでした。

とりあえずコピペしてみて触ってみようにも、恐らく私か元々設定していたフォーム自体がうまく関連づけられてないのか現時点ではうまく動きませんでした。
お忙しいところ何度もお返事いただいて、尚且つ解りやすく説明も入れて下さったのに本当に申し訳ございません。

もう少し基本的な事を勉強してから再度チャレンジしてみようと思います!

ありがとうございました。

投稿日時 - 2015-08-01 19:27:32

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

X  IF M <= N THEN
O  IF N <= M THEN

勉強中ということなので晩酌しながら補足を書いたが、見事に間違っていました。

投稿日時 - 2015-07-29 19:45:26

補足

わざわざ説明までしていただいて ありがとうございます。

周りにAccessが使える人がいないのでとても嬉しいです!!

仕事の合間に、書いていただいたVBAを調べながら理解しようとしたのですが本日は忙しくてなかなか進みませんでした…

試してみたらお礼の方で報告しますね。

投稿日時 - 2015-07-30 19:06:33

ANo.3

ACCESSでは、テーブルとクエリは、等価的で、クエリのテーブル化もできる。
利用するとき、どちらでを指定しても、変える部分が無いようにしてある。それがよい点の一つでしょう。
ファイル形式のような、内容の差ではないと思うので、データの中身(来歴、時点、沿革など)をしっかりつかんで、テーブルやクエリの名前をしっかり(命名、利用)を自己管理しないとならない、(アクセスは)ソフトでしょう。
VBAでもできれば、From句などの部分を、時宜に合わせて変更できるクエリなどは組めばよいかも。
アクセス程度のソフトレベルでは(大規模のデータベース処理と違って)、アクセスは個人課題処理ユースから始まっていて、ファイル群の全体を管理する(消去も含めて)ソフトなどは考えられていないのでは。質問は個人でなく、会社のデータでしょうが、専門家に相談すべき課題と思う.顧客がらみ、金銭がらみなどのファイルが多くて、似たような名前のファイル名だと、どのファイルを使うべきか、管理ツールででも助力しないと、間違えて、えらいことになる恐れがある。
私の思い付きだが、「ファイル管理ソフト」で照会して、何を問題にしているか勉強しては。
無料のこういうコーナーに相談して、(近い)将来とも解決できる程度の問題か。
ーー
質問の課題の捉え方について、私が間違ってる場合は後免。無視してください。

投稿日時 - 2015-07-29 15:01:36

お礼

回答ありがとうございます。

仰るとおり業務使用を目的として作成しておりました。
本来なら外注に出すべき案件だと私も思いますが、そう簡単に経費がでるわけでもなく…
(とは言え、知識のない私がAccessを触っている間の時給と外注に出す金額を考えると、外注に出す事によって安く済む場合もあるし後々も運用できるのに…とは思います)

tamu1129様の回答を受け、構造を最初から考え直してみたのですが、私の解る範囲で少し前へ進めそうな予感がしてきました。

ファイル管理ソフトは私も愛用しているものがありますが、とにかく色んな事ができますよね。
参考になるような処理があるのか、またその仕組みを参考に出来る自頭があるのか…
とにかくヘルプでも見て、参考になりそうなものがないか探して見ます!

ありがとうございました。

投稿日時 - 2015-07-29 17:18:34

ANo.2

オプションボタンでの切り替え方法は f_a_007 さんが提示してくれているので、その部分はコメントしませんが、そもそもテーブルとクエリを切り替える意味がわかりません

クエリの実態はテーブルそのものです

レコーダーやプレイヤーで自分が再生したい曲順などを指定する時に、プレイリストを作成します

あれと同じで、クエリは複数のテーブルから必要なデータを集めたり、1つのテーブルでもっているフィールドの1部を抽出する時などに使用する物です

クエリで変更後のデータなんて言ってますが、そのクエリでデータ書き換えてしまえば、変更されるのはテーブルのデータその物が書き換わってしまうのですよ

>理由は元データと変更後のデータ、別で持つとテーブル数が30以上できる為

なぜ?
この部分が変です

テーブルとクエリの関係が理解出来ていないのでは?

投稿日時 - 2015-07-29 02:11:41

お礼

回答ありがとうございます。

仰っている通り、正しい使い方ではない事は理解しております。
力技で「選択クエリで変更後データに見せかける事」ができてしまった為、どんどんイレギュラーな使い方を良しとしてしまっていたようです…

今一度、構造を考え直してみます!
ありがとうございました。

投稿日時 - 2015-07-29 15:25:41

ANo.1

添付図では、CutStr()の3つめの引数=1の時はテーブル[A]からデータを抽出し、引数=2の時はクエリ[A クエリ]からデータを抽出しています。

Public Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String
  
  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs(N <= UBound(strDatas)))
End Function

投稿日時 - 2015-07-28 20:00:01

お礼

折角つくったので~と少し意固地になっておりましたが、tamu1129様の回答を受け、構造を最初から考え直す事にしました。

とは言え、f_a_007様に書いていただいたコードも試してみたいと思っております。

理解できるような次元ではまだない為、少しずつ調べている最中です。
BVAが書けるようになると出来ることが広がりそうですね!

ありがとうございました。

投稿日時 - 2015-07-29 16:32:13

あなたにオススメの質問