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

解決済みの質問

アクセスの"検索"について

いつもお世話になっています。

Accessのフォームにて、任意の郵便番号をテキストボックス(1)に入力し"検索ボタン"を押すと、
該当する住所がフォーム上のリストボックス(2)に一覧が表示され、
その中から任意の番号を1件選んで新たなテキストボックス(3)へ代入出来る、というようなシステムを作りたく考えております。

郵便番号は"郵便番号一覧"というテーブルにまとめており、
加えてクエリ( "Q_郵便番号")で郵便番号、住所等の項目を連結しています。(フォームも作成済みです)

ただ、現在"検索ボタン"を押すと、全郵便番号が検索され、
もちろん郵便番号を選択するような事も出来ない状態で、構文作りに難航しています。

アイディアをお持ちの方、構文の作成についてご指南頂けますと幸いです。

現在、作成途上のVBAは下記の通りです。

Private Sub Form_Open(Cancel As Integer)
'リストボックスのプロパティの設定
With Me.(2)
.RowSourceType = "Table/Query"
.ColumnCount = 5
.ColumnWidths = "2.5cm;2cm;4.5cm;15cm"
.BoundColumn = 1
.RowSource = ""
End With
Me.郵便番号検索.SetFocus
End Sub

Private Sub 検索ボタン_Click()
'住所の検索
Me.(2).RowSource = "Q_郵便番号"
Me.(2).Requery
End Sub

投稿日時 - 2006-08-28 14:25:41

QNo.2367721

暇なときに回答ください

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

[リスト_郵便番号]の値集合タイプを[リスト]にすれば、次のコードで呼び込めます。
SQL文で列数を明示的に書く必要があれば、そのように修正して下さい。
この場合、クエリは必要ありません。
検索ボタンのクリックイベントは利用していませんが、書くべきコードは同じです。

Private Sub 検索する郵便番号_AfterUpdate()
  Dim strQuerySQL As String

  strQuerySQL = "SELECT * FROM 郵便番号簿 WHERE 郵便番号='" & [検索する郵便番号] & "'"
  Me.リスト_郵便番号.RowSource = DBLookup(strQuerySQL)
  Me.リスト_郵便番号.Requery
End Sub

標準モジュールには、DBLookup()を登録する必要があります。

Public Function DBLookup(ByVal strQuerySQL As String) As String
On Error GoTo Err_DBlookup
  Dim I   As Integer
  Dim N   As Integer
  Dim Datas As String
  Dim dbs  As DAO.Database
  Dim rst  As DAO.Recordset
  
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset(strQuerySQL)
  With rst
    If Not .EOF Then
      N = .Fields.Count - 1
      For I = 0 To N
        Datas = Datas & .Fields(I) & ";"
      Next I
    End If
  End With
Exit_DBlookup:
On Error Resume Next
  rst.Close
  dbs.Close
  DBLookup = Datas
  Exit Function
Err_DBlookup:
  MsgBox Err.Description
  Resume Exit_DBlookup
End Function

なお、質問の直の答えは・・・

Private Sub コマンド_検索_Click()
  Me.リスト_郵便番号.Requery
End Sub

で良い筈です。

投稿日時 - 2006-08-28 15:17:47

お礼

毎度ご指南頂き、ありがとうございます。
無事解決致しました。

投稿日時 - 2006-08-31 16:35:17

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

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

回答(6)

ANo.6

マイクロソフトのIMEを使用している場合は、「住所入力支援」が使えます。
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B889721
ご参考まで。

投稿日時 - 2006-08-29 12:30:08

お礼

ご指導ありがとうございます。
別バージョンの作業にて使わせて頂きます!

投稿日時 - 2006-08-31 16:37:14

ANo.5

新規でクエリを作成し、sqlビューにして
strQuerySQL の内容を貼り付けフォームを開いた後、クエリを実行させ、sql文が期待通りの動きをしているかを確認します。 

そのクエリをリストボックスのレコードソースとすれば簡単です。 

投稿日時 - 2006-08-29 11:12:20

お礼

ご指導ありがとうございます。
無事解決いたしました。

投稿日時 - 2006-08-31 16:36:10

ANo.4

最初の質問のコードで RowSource 代入のところを

"SELECT * FROM Q_郵便番号 WHERE " & 郵便番号='" & Me.(1) & "'"

とするだけで、良いと思いますが。

投稿日時 - 2006-08-29 01:06:59

お礼

ご指導ありがとうございます。
無事解決いたしました。

投稿日時 - 2006-08-31 16:35:50

ANo.3

s_husky です。

N の代入を Loop 外に!

  With rst
    N = .Fields.Count - 1
    Do Until .EOF
      For I = 0 To N
        Datas = Datas & .Fields(I) & ";"
      Next I
      .MoveNext
    Loop
  End With

※面目ないです!

投稿日時 - 2006-08-28 15:29:51

お礼

毎回お世話になっており、ありがとうございます。
面目ないのはこちらです。アドバイスに深く感謝しております。

ご助言通りに構文を作ってみたのですが、
ボタン押後リストボックスに変化がありません…。

こちらの構文のどこかに問題があると思うのですが…。

Private Sub Form_Open(Cancel As Integer)
DoCmd.Maximize
Me.ScrollBars = 0
'リストボックスのプロパティの設定
With Me.住所表示
.RowSourceType = "Value List"
.ColumnCount = 5
.ColumnWidths = "2.5cm;2cm;4.5cm;15cm"
.BoundColumn = 1
.RowSource = ""
End With
Me.テキストボックスA.SetFocus
End Sub

Private Sub 検索ボタン_Click()
Me.リストボックス.Requery
End Sub

Private Sub テキストボックスA_AfterUpdate()
Dim strQuerySQL As String
strQuerySQL = "SELECT * 郵便番号一覧 WHERE 郵便番号 ='" & [テキストボックスB] & "'"
Me.Q_郵便番号.RowSource = DBLookup(strQuerySQL)
Me.Q_郵便番号.Requery
End Sub

郵便番号一覧…テーブル
Q_郵便番号…クエリ

リストボックスの値集合タイプ…値リスト

投稿日時 - 2006-08-28 18:02:08

ANo.2

s_husky です。

With ブロックを複数行を呼び込むように訂正して下さい。

  With rst
    Do Until .EOF
      N = .Fields.Count - 1
      For I = 0 To N
        Datas = Datas & .Fields(I) & ";"
      Next I
      .MoveNext
    Loop
  End With

投稿日時 - 2006-08-28 15:27:55

あなたにオススメの質問