テーブルのレコードが0件時にmsg表示(アクセス)

このQ&Aのポイント
  • テーブルにレコードが追加されなかった=0件 の場合の回避策を教えてください。
  • プライベートサブ「ボタン_Click()」のエラーメッセージがデータが投入され、処理が成功しても表示されてしまいます。
  • テーブルのレコードが0件の場合、何らかの処理を行う方法を教えてください。
回答を見る
  • ベストアンサー

テーブルのレコードが0件時にmsg表示(アクセス)

とてつもない初歩的な質問で すみません! フォーム1をメニュー画面として、 フォーム1にある「ボタン」を押すと テーブルにレコードが追加され、処理が走る・・・という仕様を作っています。 ですが、 このテーブルにレコードが追加されなかった=0件 の場合の回避策を どうしたら良いのかが わかりません。 ちなみに、 Private Sub ボタン_Click() On Error GoTo errmsg DoCmd.SetWarnings False Dim DB As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Long Set DB = CurrentDb Set rs1 = DB.OpenRecordset("テーブル1") Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF If rs1!フィールドA1 = rs1!フィールドA2 Then rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = rs1!フィールドA1 rs2!B = rs1!フィールドB rs2!C = rs1!フィールドC rs2.Update End If If rs1!フィールドA1 < rs1!フィールドA2 Then For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1 rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = i rs2!フィールドB = rs1!フィールドB rs2!フィールドC = rs1!フィールドC rs2.Update Next i End If rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing DB.Close: Set DB = Nothing Call 次処理 errmsg: MsgBox "元データが未投入です。" End Sub としたのですが、 これでは データが投入され、処理が成功=完了した場合にも エラーメッセージが出てしまいました。 ご教示いただけますと幸いです。 お手数をおかけしますが、よろしくお願い致します。

noname#228034
noname#228034

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

>テーブルにレコードが追加されなかった=0件 の場合 というのは二通り考えられるのですが、 AA・・・「テーブル1」にデータが無い場合。 BB・・・処理を行なったが該当するするデータが「テーブル1」になかった場合 です。 AAの場合は、   If rs1.RecordCount > 0 Then   rs1.MoveFirst   Do Until rs1.EOF     If rs1!フィールドA1 = rs1!フィールドA2 Then       rs2.AddNew         rs2!ID = rs1!ID         rs2!フィールドA = rs1!フィールドA1         rs2!B = rs1!フィールドB         rs2!C = rs1!フィールドC       rs2.Update     End If     If rs1!フィールドA1 < rs1!フィールドA2 Then       For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1         rs2.AddNew           rs2!ID = rs1!ID           rs2!フィールドA = i           rs2!フィールドB = rs1!フィールドB           rs2!フィールドC = rs1!フィールドC         rs2.Update       Next i     End If   rs1.MoveNext   Loop   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   DB.Close: Set DB = Nothing   MsgBox ("処理が完了しました")   Else     MsgBox ("元テーブルにレコードがありません。")   End If   End Sub のようにします。 BBの場合は、以下のように変数jを追加して、 Dim i As Long Dim j As Long   Set DB = CurrentDb   Set rs1 = DB.OpenRecordset("テーブル1")   Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset)   j = 0   rs1.MoveFirst   Do Until rs1.EOF     If rs1!フィールドA1 = rs1!フィールドA2 Then       rs2.AddNew         rs2!ID = rs1!ID         rs2!フィールドA = rs1!フィールドA1         rs2!B = rs1!フィールドB         rs2!C = rs1!フィールドC       rs2.Update       j = j + 1     End If     If rs1!フィールドA1 < rs1!フィールドA2 Then       For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1         rs2.AddNew           rs2!ID = rs1!ID           rs2!フィールドA = i           rs2!フィールドB = rs1!フィールドB           rs2!フィールドC = rs1!フィールドC        rs2.Update        j = j + 1        Next i     End If   rs1.MoveNext   Loop   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   DB.Close: Set DB = Nothin   MsgBox ("処理が完了しました")   If j = 0 Then     MsgBox ("該当するデータがありませんでした。")   End If End Sub のようにします。

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

考えてみるとAAもBBの場合も一緒にすればいいので、 Dim i As Long Dim j As Long   Set DB = CurrentDb   Set rs1 = DB.OpenRecordset("テーブル1")   Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset)   'テーブル1にデータがある場合   If rs1.RecordCount > 0 Then     j = 0     rs1.MoveFirst     Do Until rs1.EOF       If rs1!フィールドA1 = rs1!フィールドA2 Then         rs2.AddNew           rs2!ID = rs1!ID           rs2!フィールドA = rs1!フィールドA1           rs2!B = rs1!フィールドB           rs2!C = rs1!フィールドC         rs2.Update         j = j + 1       End If       If rs1!フィールドA1 < rs1!フィールドA2 Then          For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1            rs2.AddNew              rs2!ID = rs1!ID              rs2!フィールドA = i              rs2!フィールドB = rs1!フィールドB              rs2!フィールドC = rs1!フィールドC            rs2.Update          j = j + 1          Next i       End If     rs1.MoveNext     Loop     rs1.Close: Set rs1 = Nothing     rs2.Close: Set rs2 = Nothing     DB.Close: Set DB = Nothing     '該当するデータがあった場合     If j > 0 Then       MsgBox ("処理が完了しました")     '該当するデータがなかった場合     Else       MsgBox ("該当するデータがありませんでした。")     End If   'テーブル1にデータがない場合   Else     MsgBox("元テーブルにデータがありません")   End If End Sub でdぷでしょうか。何かあれば補足してください。 何度もすみません。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

失礼しました。BBの場合のところで、   MsgBox ("処理が完了しました")   If j = 0 Then     MsgBox ("該当するデータがありませんでした。")   End If は、   If j > 0 Then     MsgBox ("処理が完了しました")   Else     MsgBox ("該当するデータがありませんでした。")   End If です。

関連するQ&A

  • Access 2000 の VB での テーブル作成について質問です。

    下記のようにAccess 2000のVBからDAOを使ってテーブルを作っておりますが、 作るフィールドに規定値の設定もVBからできないのでしょうか?DAOだと無理なのでしょぅか? 教えてください Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim flID As DAO.Field Set db = CurrentDb Set tbdef = db.CreateTableDef("テーブル") Set flID = tbdef.CreateField("ID", dbInteger)   tbdef.Fields.Append flID   db.TableDefs.Append tbdef db.Close: Set db = Nothing

  • 空欄を含む項目のレコードセット

    Access 2003 DAO.Recordsetにてデータを取得しようと思うのですが テーブル項目に空欄がある場合はどのように書けばよろしいのでしょうか? Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = daoDB.OpenRecordset("Aテーブル", dbOpenDynaset) RS.AddNew daoRS!ああ ああ = xx RS!Update ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。

  • DAOでテーブルを作成

    DAOでテーブルを作成したいのですが 主キーにしてオートナンバー型にするにはどうすればいいですか? Sub MyTableCreate() Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim Field1 As DAO.Field Dim Field2 As DAO.Field Set db = CurrentDb Set tbdef = db.CreateTableDef("T_test") Set Field1 = tbdef.CreateField("ID", dbInteger) Set Field2 = tbdef.CreateField("氏名", dbText, 20) tbdef.Fields.Append Field1 tbdef.Fields.Append Field2 db.TableDefs.Append tbdef db.Close: Set db = Nothing End Sub これで、IDフィールドを主キーにしつつ、 dbIntegerではなくオートナンバー型にしつつ、 主キーを付与する方法を教えてください。 DAOのType プロパティのヘルプを見たのですがありませんでした。 今回は http://www.accessclub.jp/dao/20.html を参考にしました。

  • 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が返るのでしょうか?

  • ループで呼び出しながら、追加クエリでテーブルに追加

    IDをループで呼び出しながら、追加クエリでテーブルに追加したいのですが、 値が入りません。 エラーなく動くのですが、テーブルに値が入っていないのです。 何がたりないのでしょうか? ――――――――――――― Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim recCount As Long recCount = DCount("*", "作業用請求先ID") Dim ID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Dim i As Integer Dim strSQL As String Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF RS.Edit For i = 1 To recCount CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL _ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" Next i RS.Update RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

  • グループ毎にある列の最大値のレコードを取得する方法

    Accessで下記のようなテーブルでkeyフィールド毎のdayフィールドの最大値のレコードを取得したいと思ったのですが、keyフィールドとdayフィールドのみを表示する分には下記の記述で大丈夫かと思ったのですが、これにidフィールドとfieldフィールドもあわせて表示したい場合、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、出来れば同じkey,同じdayが複数あった場合、一番大きいid(主キー)のレコードを取得したいと思っています。 【テーブル(T_TBL)】 id|key|day|field ------------------ 1|1|     |100 2|2|2011/03/04|400 3|2|2011/03/03|500 4|3|2011/03/10|300 5|3|2011/03/10|200 【下記ソース実行時のメッセージボックスの表示結果】 1 : 2 : 2011/03/04 3 : 2011/03/10 【希望する表示結果】 1 : 1 : : 100 2 : 2 : 2011/03/04 : 400 5 : 3 : 2011/03/10 : 200 【ソース】 Option Compare Database Option Explicit Private Sub Form_Load() Dim db As DAO.Database Dim rs As DAO.Recordset Dim SQL As String Dim strMsg As String Set db = CurrentDb() SQL = "" SQL = SQL & "SELECT key, Max(day) AS max_day" SQL = SQL & " FROM T_TBL" SQL = SQL & " GROUP BY key" Set rs = db.OpenRecordset(SQL) Do Until rs.EOF strMsg = strMsg & vbNewLine & rs!Key & " : " & rs!max_day rs.MoveNext Loop MsgBox vbNewLine & strMsg rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 以上、よろしくお願いします。

  • Access レコードを分割してフォームで表示

    Access 2007です。 下記のような日記テーブルがあり、 その「行動」フィールドの中身を「●」の記号で レコードに分割して、 フォームに表示したいと思っています。 日記テーブル ID 年月日   天気  行動 1 2014/1/10  晴  ●読書。●新聞を読む。●散歩。 2 2014/1/11  曇  ●電車に乗る。●新年会。●庭の手入れ。●カラオケ。 3 2014/1/12  曇  ●昼寝。 4 2014/1/13  雨  ●買い物。●読書。 ・・・・ 結果フォーム(データシートビュー)で表示 年月日    行動 2014/1/10  読書。 2014/1/10  新聞を読む。 2014/1/10  散歩。 2014/1/11  電車に乗る。 2014/1/11  新年会。 2014/1/11  庭の手入れ。 2014/1/11  カラオケ。 2014/1/12  昼寝。 2014/1/13  買い物。 2014/1/13  読書。 もとの日記テーブルのデータは変更しません。 下記のように、VBAのコードの中で、 レコードセットを使えば、上記のようなレコードの分割ができると思うのですが、 うまくいきません。 rs2というレコードセットをどうやって作成すればいいのかわかりません。 (Set rs2 = DB.OpenRecordset ・・・ のような行が必要ではないか、と思うのですが、 そのやり方がわかりません。) やり方を教えていただけたら幸いです。 Dim DB As DAO.Database Set DB = CurrentDb() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = DB.OpenRecordset("日記テーブル", dbOpenForwardOnly) Dim A As Variant Do Until rs1.EOF A = Split(rs1!行動, "●") For i = 1 to UBound(A) rs2.AddNew rs2!年月日 = rs1!年月日 rs2!行動 = rs1!A(i) rs2.Update Next i rs1.MoveNext Loop DoCmd.OpenForm "結果フォーム" Set Forms!結果フォーム.Recordset = rs2

  • 結合テーブルクエリPrimaryKey取得について

    自己解決できず、どなたかお助けくださいませ。 環境:OS/Win7 ACCESS2010 やりたいことは、結合テーブルのクエリからPrimaryKeyを取得したいのです。 次の2つのテーブルと2つのフィールドを作成したとします。 Tbl_a.Fld_ID / Tbl_a.Fld_Name Tbl_b.Fld.ID / Tbl_b.Fld_Sex ※どちらも Fld_ID フィールド を PrimaryKey 名でINDEX設定します。 ACCESSに次のクエリを作成したとします。 SELECT Tbl_a.Fld_ID, Tbl_a.Fld_Name, Tbl_b.Sex FROM Tbl_a INNER JOIN Tbl_b ON Tbl_a.ID = Tbl_b.ID クエリ名:Q_AandB 次のVBAを作成したとします。 ※引数 VR には10万件の2次元配列 0:ID 1:氏名 2:性別 が入っている Public Sub UpdateExe(Byval VR As Variant) Dim DB As DAO.Database: Set DB = CurrentDB Dim RS As DAO.Recordset: Set RS = DB.OpenRecordset("Q_AandB") Dim Z As Long With RS For Z = 0 To UBound(VR) .Index = "PrimaryKey" ← ここでエラーが出ます。 .Seek "=", VR(Z,1) IF .NoMatch Then .AddNew !Fld_ID = VR(Z,0) 'ID !Fld_Name = VR(Z,1) '氏名 !Fld_Sex = VR(Z,2) '性別 .Update Else .Edit !Fld_ID = VR(Z,0) 'ID !Fld_Name = VR(Z,1) '氏名 !Fld_Sex = VR(Z,2) '性別 .Update End If Next Z .RS.Close End With Set RS = Nothing DB.Close: Set DB = Nothing End Sub これを実行すると、「実行エラー'3251': この操作は、このタイプのオブジェクトには 実行できません。」 とのエラーで弾かれてしまいました。 結合テーブルでのプライマリキーの取得がわからず困っております。 以上、何卒よろしくお願い申し上げます。

  • レコード更新について

    レコード更新について 環境: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から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 ・・・・・・・・・・・・・・・・・・・・・・・・・ よろしくご教授お願いします。

専門家に質問してみよう