- ベストアンサー
AccessVBAでレコードの索引方法は?
AccessVBAでテーブル上のレコードを索引する方法を教えて下さい。 テーブルの項目の中に会社コード(文字形式)と個人番号(長整数型)が登録してあります。(他にも項目が登録されています。) 選択クエリで個人番号、会社コードの順に指定してあります。 この2つの項目をキーにして検索したいのですが、その具体的な方法を 教えていただけますでしょうか?。(具体的な記述) よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> AccessVBAでテーブル上のレコードを索引する方法を教えて下さい。 いくつか不明点があるのと、回答の簡素化の観点から、以下の前提で 回答します。 【前提】 ・やりたいことは、「条件を都度指定しての、フォームによる結果表示」 ・対象テーブルの全レコードが表示されるフォームは既に作成済みで、 これに検索機能を追加したい ・上記フォームは帳票型で、サブフォームは持たない ・Accessのバージョンは2003以前 (メニューでの操作内容を、2007でのリボンのボタン操作に置き換えて 読むことができるなら、2007でも問題ありません) ・会社コード、個人番号が空白(Null、空文字)のレコードはなく、さらに 「会社コードがスペースのみ」、「個人番号が負の値」のレコードもない 【クエリの作成】 会社コードと個人番号の検索条件を指定できるようにした場合、条件の 指定状況は「双方あり/会社コードのみ/個人番号のみ/双方なし」の 4パターンがあり得ます。 ですので、それぞれに対応したクエリを予め作成します。 (但し、「双方なし」は、現在のテーブルを使用するので、作成は3つ) ※選択クエリを使用せず、全てVBA上で対応する方法もありますが、慣れて いないとメンテナンスが難しくなるため、上記の方法にしました) 「会社と個人」クエリ: クエリのデザインビューで、上半分の領域から、「*」と「会社コード」「個人 番号」をドラッグ&ドロップします。 (「会社コード」と「個人番号」の下の『表示』チェックは外しておきます: そのままではフィールド(列)が重複表示されることになるため) <『抽出条件』欄に指定する式> ・「会社コード」: Forms!フォーム1!検索コード *自動的に角括弧([ ])が追加されます(→「[Forms]![~」)* *「フォーム1」は、実際に使用するフォーム名に変更します* ・「個人番号」: Forms!フォーム1!検索番号 ※上記の条件を同じ行に指定すると、And検索(双方を満たすレコード のみ表示)になります。 Or検索(一方でも満たせば表示)にするには、それぞれ別の行にします。 (→『または:』欄を使用) 「会社のみ」クエリ: 同じくデザインビューで、今度は「*」と「会社コード」をドラッグ&ドロップ し、「会社コード」の『表示』チェックを外します。 <『抽出条件』欄に指定する式> ・「会社コード」: Forms!フォーム1!検索コード 「個人のみ」クエリ: 今度は「*」と「個人番号」をドラッグ&ドロップします。 <『抽出条件』欄に指定する式> ・「個人番号」: Forms!フォーム1!検索番号 【フォームの改修】 1)当該フォームをデザインビューで開く 2)フォームヘッダを表示していない場合は、メニューで「表示(V)→フォーム ヘッダ/フッタ(H)」を選択して表示させる 3)フォームヘッダに、『検索コード』(→会社コード検索用)と『検索番号』 (→個人番号検索用)の2つのテキストボックスを設置 4)同じくフォームヘッダに『検索』ボタンを設置 5)上記ボタンをダブルクリックするなどして、プロパティシートを表示 6)プロパティシートの『イベント』タブを選択し、『クリック時』を選択 7)右端に表示される『...』(ビルダ)ボタンをクリック 8)既定の設定では『ビルダの選択』ダイアログが表示されるはずなので、 「コード ビルダ」を選択して、『OK』ボタンをクリック 9)VBAの編集画面が出るので、以下のコードを記載: Private Sub 検索_Click() 'エラー発生時の処理を指定(→「エラー処理:」の行に飛ばす) On Error Goto エラー処理 '変数の宣言 Dim FndCode As String, FndNo As Long, RecSrc As String '検索条件の確認 '(各テキストボックスがNullの場合、別の値に読み替えます) FndCode = Nz(RTrim(検索コード), "") FndNo = Nz(検索番号, -1) '検索条件の入力状況により、適用するテーブル/クエリを判定 '(「-(FndCode = "")」:会社コードが指定ありなら0、なしなら1) '(「-(FndNo = 0) * 2」:個人番号が指定ありなら0、なしなら2) Select Case -(FndCode = "") - (FndNo = -1) * 2 Case 0 '→会社コード・個人番号とも指定あり RecSrc = "会社と個人" Case 1 '→個人番号のみ指定あり RecSrc = "個人のみ" Case 2 '→会社コードのみ指定あり RecSrc = "会社のみ" Case 3 '→どちらも指定なし(=全レコード表示) RecSrc = "テーブル1" '※実際のテーブル名を「""」内に指定してください。 End Select 'レコードソースを切替 Me.RecordSource = RecSrc 終了処理: '「検索_Click」のSubを終了する Exit Sub エラー処理: 'エラー発生時はエラーメッセージを表示した上で、処理を終了 MsgBox Err & ":" & Error$, , Me.Name & " 検索" Resume 終了処理 End Sub ・・・以上です。
その他の回答 (2)
- nag0720
- ベストアンサー率58% (1093/1860)
参照したい項目が1つだけの場合は、DLookup関数でも検索できます。 DLookup(参照式, テーブル名, 検索条件) Accessのヘルプで調べてみてください。
お礼
有難うございました。
- imogasi
- ベストアンサー率27% (4737/17069)
>教えていただけますでしょうか?。(具体的な記述) これはあからさまに、コードを回答者に書いてくれ、というパターンで、この質問コーナーの禁止事項のはず。 SQL文を作ってVBAで実行するというのが、一番やりやすいのかと思う。 このパターンはGoogleででも、たくさん実例が出ているよ。自分でそれらを勉強のこと。 例えば DAOを使う例では、参照設定をして(Microsoft DAO・・・) 2つの条件(氏名と地区フィールドの内容を指定)該当抜き出しは、 Sub SELECT_ALL_01() Dim DB As DAO.Database Dim RS As DAO.Recordset Dim SQL As String Dim name name = "山田 三郎" SQL = "SELECT 氏名,住所 FROM 社員3 WHERE 氏名='" & name & "' AND 地区='関東';" Set DB = CurrentDb Set RS = DB.OpenRecordset(SQL, dbOpenDynaset) Do Until RS.EOF MsgBox RS!氏名 & RS!住所 RS.MoveNext Loop Set RS = Nothing Set DB = Nothing End Sub
お礼
大変失礼しました。 ご回答いただきまして有難うございました。
お礼
ご回答有難うございます。 クエリでの指定が非常に困難でしたのでVBAで記述したのですが、 FindFirstでKEYを2つ指定して何とかうまく行きました。 ご指導ありがとうございました。