【Microsoft ACCESS 2003 VBA】

次のようなテーブルがあります。

商品マスター
[商品コード]    [商品名]
ABC***    テレビ
BCD***    ビデオカメラ
EF*G****    パソコン

フォーム上で商品コードを入力する際、
このテーブルを検索し、商品名を表示させたいのですが
どのようにすればいいでしょうか?

アスタリスク(*)の箇所は0~9の半角数字・A~Zの
半角アルファベットが何でも入ります。
例えばABC111が入力された場合「テレビ」になり、EFZG0123
の場合は「パソコン」になります。
ABC1111、EF000000などはエラーを表示させたい。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/02/07 15:53:24
  • 終了:2008/02/14 15:55:02

回答(1件)

id:nkanai No.1

nkanai回答回数17ベストアンサー獲得回数12008/02/07 22:30:58

ポイント60pt

URLはダミーです

商品コードのLostfocusイベント(フォーカス喪失時)に

処理を行うとしてご説明します。

商品マスタから全レコードをとってきて、

入力された商品コードの、商品マスタの商品コードの*に相当する箇所を

同じく*に置き換えてから比較します。

あまりスマートなコードではありませんが、参考までにどうぞ。

※ 商品コード入力欄を「txtCode」、商品名表示欄を「lblName」としています。

Private Sub txtCode_LostFocus()

Dim strSQL As String

Dim rs As DAO.Recordset

Dim strTmp As String

Dim i As Long

Dim rtn As Long

'とりあえずレコード全件とってくる

strSQL = "SELECT * FROM 商品名;"

Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges, dbReadOnly)

If rs.EOF = True Then

MsgBox "商品マスタにレコードがありません", vbCritical, "エラー"

Exit Sub

End If

'アスタリスクの部分を置き換えて比較する。

Do While (rs.EOF = False)

strTmp = txtCode.Text

rtn = 1

i = 1

Do While (rtn = 0)

rtn = InStr(i, rs.Fields("商品コード"), "*", vbTextCompare)

If rtn Is Null Then Exit Sub

If rtn <> 0 Then

strTmp = Left(strTmp, rtn - 1) & "*" & Mid(strTmp, rtn + 1)

End If

i = rtn

Loop

If strTmp = rs.Fields("商品コード") Then

'一致した場合は商品名を表示する。

lblName.Caption = rs.Fields("商品名")

Else

'不一致の場合はエラーメッセージを出す

MsgBox "商品コードが一致しません", vbCritical, "エラー"

End If

rs.MoveNext

Loop

End Sub

id:db_Magician

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

Do While (rtn = 0)の箇所は、Untilの間違いでしょうか?

それとi = rtnの箇所は、i = rtn+1かと思います。

(私が間違っていたらすみません。。。)

上記のように修正し動かしてみたところ、一応検索はできました。

ただ、例えばtxtCodeに「ABC」とだけ入れた場合でも、「テレビ」と表示されてしまいます。

(アスタリスク置き換えのところで、この場合もABC***に変換されてしまうため。)

ここも正しく判定させるには工夫がいりそうですね。

2008/02/08 13:13:26
  • id:db_Magician
    できれば下記の方法以外でお願いします。

    ・split関数を使う
    ・商品マスターから、「*」の部分に入る全パターンを網羅した新しい商品マスターを作りだす
  • id:rikuzai
    商品マスタを元にコンボボックスを作成するのでは検索性が落ちるということなのかな。
    http://www.accessclub.jp/samplefile/samplefile_173.htm
    http://ag5.net/~nino/access-19.html
    ↑こういったことはよくやったりするのですが。
  • id:db_Magician
    >rikuzai様
    商品マスターの中身は、実際には膨大な量のデータが入っており
    コンボボックスで選択させるのは難しいですね…
  • id:rikuzai
    なるほど、データ量が多いのですね。
    私も仕事上品番検索をよくするので色々試したのですが、
    http://www.mahoutsukaino.com/ac/ac97/basic/ken1.htm
    今は↑を参考にサブフォームで絞り込む方法をとっています。
    入力したあいまいな値に対して一つしか候補が出てこないと、
    結局何度も入力しなおさないといけなくて不便だったので。
    これも一つの方法ということで。
  • id:jarijari
    AccessもVBAも詳しくない非エンジニアの素っ頓狂なコメントだったらごめんなさい。

    Len([商品コード]) -- などという関数がメモにあったので、それで文字数チェックができるかなと思ったのと、私のPostgresメモに:

    一文字とマッチさせたい時は、「%」ではなく、「_」を使う。[a-z]や[^a-z]も。

    なんてあったので、もしかしてSQLモードで表示させて、そこで編集したら何とかなるのかな?なんて思ったんですが。
  • id:db_Magician
    nkanai様にいただいたコードを改造して。
    テキストボックスに入力された文字数をあらかじめLenで取得しておき、
    If strTmp = rs.Fields("商品コード") Then の後でマスターとの文字数の一致も
    確認すればよさげですね。

    SQLはあまり詳しくないのですが、一文字一文字マッチングできるのですか?
    ちょっと調べてみようと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません