• ベストアンサー

AccessVBAでレコードの索引方法は?

AccessVBAでテーブル上のレコードを索引する方法を教えて下さい。 テーブルの項目の中に会社コード(文字形式)と個人番号(長整数型)が登録してあります。(他にも項目が登録されています。) 選択クエリで個人番号、会社コードの順に指定してあります。   この2つの項目をキーにして検索したいのですが、その具体的な方法を 教えていただけますでしょうか?。(具体的な記述) よろしくお願いします。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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 ・・・以上です。

pczuki
質問者

お礼

ご回答有難うございます。 クエリでの指定が非常に困難でしたのでVBAで記述したのですが、 FindFirstでKEYを2つ指定して何とかうまく行きました。 ご指導ありがとうございました。

その他の回答 (2)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

参照したい項目が1つだけの場合は、DLookup関数でも検索できます。 DLookup(参照式, テーブル名, 検索条件) Accessのヘルプで調べてみてください。

pczuki
質問者

お礼

有難うございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

>教えていただけますでしょうか?。(具体的な記述) これはあからさまに、コードを回答者に書いてくれ、というパターンで、この質問コーナーの禁止事項のはず。 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

pczuki
質問者

お礼

大変失礼しました。 ご回答いただきまして有難うございました。