Access97 VBAにてレコードの検索

このQ&Aのポイント
  • Access97 VBAを使用してレコードを検索する方法について教えてください。
  • フォームでのレコード追加時に重複を避けるためにレコード検索を追加したいのですが、コーディング方法がわかりません。
  • 社員マスターのキーを「部門_cd」と「社員_cd」に設定する場合、社員_cdだけではなく部門_cdのチェックも同時に行う方法について教えてください。
回答を見る
  • ベストアンサー

Access97 VBAにてレコードの検索

お世話になります。 フォームでのレコード追加の際、 重複入力を避けるためにレコード検索を追加したいのですが、うまくいきません。 ただいまのソースは、 Set db = DBEngine.Workspaces(0).Databases(0) Set myrs = db.OpenRecordset("社員マスター", DB_OPEN_DYNASET) myrs.FindFirst "社員_cd =" & " '" & Me.社員_cd & "' " If myrs.NoMatch = False Then IMsg = "すでに登録されています!!!" IRet = MsgBox(IMsg, 16, "エラー") myrs.Close db.Close Exit Sub End If 以上はうまく機能するのですが、 社員マスターのキーを"部門_cd"と"社員_cd"にする場合、 単純に社員_cdのみのチェックではダメで、部門_cdのチェックも同時に必要になるかと思いますが、うまくコーディングできず。 myrs.FindFirstの一文を適切に書いてやらなければいけないと思いますが、わかりません……。 教えていただけますでしょうか? ※質問文のみでは情報が不足している場合、ご指摘いただければ補足にて追加させていただきます

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

  • ベストアンサー
  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.3

>findstring = "拠点CD ='5' And team_cd ='12'" これと >拠点CD = float型 Team_CD = float型 このことから >findstring = "拠点CD =" & "'" & [Forms]![F_top]![拠点_cd] & "' And team_cd =" & "'" & Me.team_cd & "'" これではダメです findstring = "拠点CD =" & [Forms]![F_top]![拠点_cd] & " And team_cd =" & Me.team_cd この様になります ※文字列型はシングルクォーテーション(')で括り、数値型の場合は括る必要がありません ※因みに日付型の場合はシャープ(#)にて括ります(Accessの場合)

nao_ton_v
質問者

お礼

ありがとうございまます。 今回のコーディングだけでなく、今後VBAを組んでいく上で非常に参考になります。

その他の回答 (2)

  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.2

これ? Dim findString As String findString = "部門_cd =" & " '" & Me.部門_cd & "' and 社員_cd =" & " '" & Me.社員_cd & "' " myrs.FindFirst findString 社員マスタのキーは社員コードで一意であるべきだと思いますが... 部署移動したときとかry)

nao_ton_v
質問者

お礼

ありがとうございます。 実は、IF分の組み合わせ(ネスト)で解決してしまいましたが明日会社で上記を試してみます。 確かに、悪い例でしたね。 部門コード・社員コードがキーのマスターなんてあまりないですよね。通常は社員コードが一意のキーでその属性として部門コードですもんね。 実は拠点コード・部門コードがキーとなるマスターでした(←最初から書けって感じですよね!)。

nao_ton_v
質問者

補足

すみません、昨日IF文の組み合わせで解決したかと思いきやそれはバグっていました。 で、ご回答いただいた通りにやってみたのですが、どうしても "抽出条件でデータ型が一致しません。" というメッセージでエラーになってしまいます。 デバッグモードでfindstringの値を確認したところ、 findstring = "拠点CD ='5' And team_cd ='12'" となっていますがこれでよろしいのでしょうか? 検索するテーブル(SQLサーバー): 拠点CD = float型 Team_CD = float型 パラメータ: [Forms]![F_top]![拠点_cd] ←拠点CD Me.team_cd ←team_cd 実際の記述は以下の通りです。 findstring = "拠点CD =" & "'" & [Forms]![F_top]![拠点_cd] & "' And team_cd =" & "'" & Me.team_cd & "'" 教えていただけないでしょうか?

  • ArukuMail
  • ベストアンサー率22% (115/510)
回答No.1

http://support.microsoft.com/default.aspx?scid=kb;ja;286242 こう言った問題もあるみたい コストはかかるけど Do Untile myrs.EOF myrs.movenext loop 内にレコードいどうさせてけんさくさせるてもあるです

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;ja;286242
nao_ton_v
質問者

補足

早速のご回答、ありがとうございます。 myrs.FindFirst "社員_cd =" & " '" & Me.社員_cd & "' " ↑これは動きます。  また、部門_cdによる検索でも動きます。  要するに単独では機能するということでした。 部門・社員というた例えが悪かったのかもしれませんね。 私の質問の仕方に不備があれば何なりとご指摘ください。

関連するQ&A

  • Access レコードの検索と追加

    日報というフォームに日付とリンクしたサブフォームを作成しました。 複数の人がデータを入力するのですが、日報フォームの日付は重複したくありません。 それで日付入力というテキストボックスを作成して、その日付と同じ日付を検索して、なければ新規のレコードを作成するというようにしたいと思っています。 Private Sub txt日付入力_AfterUpdate() Dim rs As DAO.Recordset Set rs = Me.Recordset.Clone rs.FindFirst "日付 = #" & Me!txt日付入力.Value & "#"  If rs.NoMatch Then   rs.AddNew  Else   Me.Bookmark = rs.Bookmark  End If rs.Close: Set rs = Nothing End Sub というようにしたのですが、新規のレコードを作成する部分がどうしても分かりません。 どなたか分かる方、よろしくお願いします。

  • VBAでアクセスDBからデータの取得について

    DBからデータを取得する際、キー選択ボックス(コンボボックス)で選択した文字列をテーブル名に指定したいのですが、実行時エラー3709「この操作を実行するために接続を使用できません。このコンテキストで閉じているかあるいは無効です。」となってしまいます。 '***************************** 'DBからデータ取得 '***************************** If OptionButton1 = True Then myRS.Open Source:="SELECT" & キー選択Box.Text, ActiveConnection:=myConn2 Else myRS.Open Source:="テーブル1", ActiveConnection:=myConn Range("A2").CopyFromRecordset Data:=myRS myRS.Close: Set myRS = Nothing myConn.Close: Set myConn = Nothing myConn2.Close: Set myConn2 = Nothing End If End Sub 以上、よろしくお願いします。

  • レコードの検索について

    vbの初心者です。質問です。 ある特定の条件を2つ満たしたレコードを検索して、 そのレコードをカレントレコードとしたいのですが... 条件が一つであれば、FindFirstを使って、 *-------------- 変数宣言は省略 *-------------- Set db = DBEngine.Workspaces(0).OpenDatabase("データベース名") Set rsDAO = db.OpenRecordset("テーブル名", dbOpenDynaset) kensaku = "irai_no = '100'" rsDAO.FindFirst kensaku などとすれば、テーブルのirai_noフィールドが "100"の最初のレコードがカレントレコード となるというのはわかっているのですが... それでは、もう一つ条件として"gyosya_nm='ABCD'"も満たす、つまり 2つの条件を満たすレコードを検索するにはどうすれば良いですか? できれば、一つの命令でお願いしたいです。 宜しくお願い致します。

  • ExcelからAccessデータを検索するマクロ

    Excel、Accessとも初心者です。 下記を参考にさせて頂いております。 http://okwave.jp/qa/q441987.html これを、(1)~(3)に対応させたいのですが どのように書き換えればよろしいのでしょうか? (1)A1→ A列の最後まで (2)対応するレコードフィールド2   → 規定した複数のレコードフィールド     (例えば、フィールド3とフィールド5とフィールド8) (3)Excel, Accessともに2007です。 (4)検索の経過は表示させない  (少しでも早く処理したい。ひとつひとつ検索結果を表示すると遅くなると聞ききました) ・・・・・・・・・・・・・・・・・・・・・・・・・ Sub Macro1() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = OpenDatabase("c:\abc.mdb") Set rs = db.OpenRecordset("tbl_a", dbOpenDynaset) rs.FindFirst "[フィールド1]='" & Range("A1").Value & "'" If rs.NoMatch Then   Range("B1").Value = "" Else   Range("B1").Value = rs![フィールド2] End If rs.Close Set rs = Nothing Set db = Nothing End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・ よろしくご教授お願いします。

  • DAO エクセルvbaからアクセスのレコードの件数

    DAOで、エクセルvbaからアクセスのレコードの件数を取得したいのですが Dim ac As Object Dim db As DAO.Database Dim rs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("D:\あああ.accdb", False, True) Set rs = db.OpenRecordset("SELECT * FROM Tマスタ WHERE masterkey like '*四*';") i = rs.RecordCount Debug.Print rs("masterkey") rs.Close: Set rs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing をすると、抽出するレコードが1000件でも、必ず1が返ります。 masterkeyフィールドは文字列型です。 なぜ実際はたくさんのレコードがあるのに、1が返るのでしょうか?

  • Accessで”データの競合"となる

    Access2010を使用しています。 テーブル更新後にフォームをクローズしようとすると”データの競合"とメーセージが表示されます。 レコードを追加する時はならないのですが、レコードを変更しようとするとメーセージが表示されます。 具体的には下記のようにコーディングしています。 何か指定もれがあるのでしょうか? With Application.CurrentDb Set oRS = .OpenRecordset("顧客マスター", dbOpenDynaset) oRS.FindFirst "顧客コード = " & Me.顧客コード If oRS.NoMatch = False Then oRS.Edit Else oRS.AddNew End If oRS("顧客コード").Value = Me.顧客コード.Value     (その他の項目を代入)    oRS.Update oRS.Close Set oRS = Nothing End With DoCmd.Close acForm, Me.Name

  • DAOでテーブルの内容を検索したいのですが…

    DAOでテーブルの内容を検索したいのですが… アクセス初心者です。 フォームで取得した値をテーブルで検索して命令するために,次のようなことをしてみましたが,FindFirstのところでエラーがでます。 どうしたらよいのかご指導ください。 コマンドボタンのイベントプロシージャで Private Sub テストテーブル作成_Click() Dim gakki As Integer Dim test As Integer Me.学期 = gakki Me.テスト = test Call testテーブル作成 End Sub として,標準モジュールに Sub testテーブル作成() Dim myDB As DAO.Database Dim myRS As DAO.Recordset Set myDB = CurrentDb Set myRS = myDB.OpenRecordset("T_生徒テスト") myRS.FindFirst "学期ID=" & "" & "gakki" & "" & "AND テストID =" & "" & "test" & "" If myRS.NoMatch = False Then DoCmd.OpenQuery "Q_TSテストA" DoCmd.OpenForm "F_テスト" DoCmd.Close Else DoCmd.OpenQuery "Q_TSテスト" DoCmd.OpenQuery "Q_テスト" DoCmd.Close DoCmd.OpenForm "F_テスト" End If myRS.Close: Set myRS = Nothing myDB.Close: Set myDB = Nothing End Sub としました。よろしくお願いします。

  • レコード更新について

    レコード更新について 環境:ACCESS2000 状況:メインフォーム(マスター登録ボタン付)    サブフォーム(マスターテーブルをドラッグして貼り付けたもの)    マスターテーブル(品番 / レンタル日 / 返却日 / 貸出状況) やりたい事:サブフォームに表示してあるデータに       返却日をサブフォーム上で入力し(件数は不定)、そして       返却日が入力されたものの貸出状況を"返却済"と変更登録したい。 現状:コマンドボタンのイベントに Private Sub マスター登録ボタン_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("マスターテーブル", dbOpenDynaset) If rs!返却日 <> "" Then rs.Edit rs!貸出状況 = "返却済" rs.Update End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub しかし、上記コードでは返却日はマスターテーブルに反映しているのですが 貸出状況が変わってなく、どのようにしたら良いかわからないため ご質問させて頂きました。 まだまだACCESS勉強中で未熟なため、検討違いなコードになっているかもしれませんが コードの修正・改善、または全く違う方法等ご教授願えればと思います。        

  • レコードセットデータのExcelシートへの出力方法

    VBEで外部データベースにアクセスしてデータを取得することは出来るんですがそのデータを綺麗にエクセルデータに出力できません。 下記のコードはデータ出力のモジュールなんですがこれだと、レコードセットの中身をただ書き出してるだけになり見た目もよくありません。 どなたかレコードセットデータを綺麗に整形するいい方法を知っている方がいれば助けて頂きたいです。 ### モジュールの一部 ##### ' オブジェクトのインスタンス化 Set cmdCommand = New ADODB.Command Set cmdCommand.ActiveConnection = myConn Set myRS = New ADODB.Recordset Set myRS.ActiveConnection = myConn ' コマンドテキストの設定 With cmdCommand .CommandText = strSQL .CommandType = adCmdText .Execute End With ' レコードセットのオープン myRS.Open cmdCommand, , adOpenForwardOnly, adLockReadOnly ' データの削除 Worksheets("sheet2").Cells.Clear ' フィールド名の表示 For colnum = 0 To 29 Worksheets("sheet2").Cells(2, colnum + 2) = myRS(colnum).name Next ' データの表示 rownum = 0 Do Until myRS.EOF For colnum = 0 To 29 Worksheets("sheet2").Cells(rownum + 3, colnum + 2) = myRS(colnum).Value Next myRS.MoveNext rownum = rownum + 1 Loop '###### 完了メッセージの表示 ################################ If Worksheets("Sheet2").Range("B3") = "" Then MsgBox "抽出条件に該当するデータが存在しません" Else MsgBox "データを出力しました" End If 'レコードセットの開放 myRS.Close: Set myRS = Nothing myConn.Close: Set myConn = Nothing End Sub

  • アクセス VBAでレコードが追加できない

    お世話になります。 フォームのボタン(コマンド1)をクリックして テーブルにレコードを追加したいのですが、うまくいきません。 SQLの引数value('intNumber')を実数(例えば'3')とかにすると うまく1レコード追加されるのですが、新規レコードとして 連番で追加させたいので困っています。 宜しくお願いします。 Private Sub コマンド1_Click() Dim dbDao As DAO.Database Dim stSql As String Dim intNumber As Integer intNumber = DMax("[管理ID]", "[テーブル名]") + 1 Set dbDao = CurrentDb stSql = "insert into テーブル名 (管理ID,管理2,管理3) values ('intNumber','99999','99999');" dbDao.Execute stSql dbDao.Close: Set dbDao = Nothing End Sub