• 締切済み

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

みんなの回答

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

No1です。 変数の宣言の順序について述べておきます。 質問では、 Dim DB As DAO.Database Set DB = CurrentDb() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = DB.OpenRecordset("日記テーブル", dbOpenForwardOnly) これを、No1の回答も加えて、 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("日記テーブル", dbOpenForwardOnly) Set rs2 = DB.OpenRecordset("結果テーブル", dbOpenDynaset) のように行儀良く並べると見通しがよくなります。

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

(1) rs2に設定するテーブル名を「結果テーブル」として Set rs2 = DB.OpenRecordset("結果テーブル", dbOpenDynaset) のように設定しておきます。 (2) A = Split(rs1!行動, "●") のようにすると、先頭の「●」を区切り文字として 判定し、先頭の前にないものを文字列とするように なるのでエラーを起こします。そのために文字列の先頭の 「●」を除いた文字列を対象とするために、 A = Split(Right(rs1!行動, Len(rs1!行動) - 1), "●") とします。つまり、たとえば、 「●読書。●新聞を読む。●散歩。」 の、 「読書。●新聞を読む。●散歩。」 を対象とする、ということです。 (3) rs2!行動 = rs1!A(i) この記述は間違いです。単に rs2!行動 = A(i) です。 (4) 変数iが設定されていません。 Dim i As Long を変数宣言しておく。 以上です。なお、 DoCmd.OpenForm "結果フォーム" Set Forms!結果フォーム.Recordset = rs2 については、最初から「結果フォーム」のレコードソースを 「結果テーブル」にしておき、「既定のビュー」を 「データシート」にしておけば、 DoCmd.OpenForm "結果フォーム" だけですが。

関連するQ&A

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

    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でレコード数を取得したい(ACESSVBA)

    レコードの行数は複数あるのに --------------------------------------------------------- Sub あ() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T_test", dbOpenDynaset) MsgBox rs.RecordCount Set rs = Nothing Set db = Nothing End Sub --------------------------------------------------------- これでレコード数を取得しようとすると1がかえるのですが なぜレコードの行数を取得できないのでしょうか?

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • レコード件数が返らない理由がわからない

    テーブル1にはレコードが5件入ってるのですが Private Sub レコード件数() Dim strSQL As String Dim rs As DAO.Recordset strSQL = "SELECT * FROM テーブル1;" Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) Debug.Print rs.RecordCount End Sub これをすると1が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?

  • 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からsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • テーブルのレコードが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 としたのですが、 これでは データが投入され、処理が成功=完了した場合にも エラーメッセージが出てしまいました。 ご教示いただけますと幸いです。 お手数をおかけしますが、よろしくお願い致します。

  • Access VBAでクエリーのレコード件数を取得したいのですが

    Access2003のVBAで次のような構文を用いてクエリーの該当レコード数を取得したいのですがうまく出来ません。 構文又は手法が間違っているのでしょうか。 Dim db As Database Dim rs As Recordset Dim cnt As Long Set db = CurrentDb Set rs = db.OpenRecordset("該当顧客リストクエリ", dbOpenTable) cnt = rs.RecordCount ※OpenRecordsetの行で「実行時エラー'3219'無効な処理です」と出てしまいます。 又、”該当顧客リストクエリ”では特定の抽出条件を設定して、”顧客リストテーブル”の一部を抽出するようにしています。

  • AccessのフォームでAND検索

    Accessで今、土地物件を検索するものを作っています。 物件はテーブルに200件くらいあります。 そのテーブルのフィールドに「土地面積(坪)」と「価格」いう名前のフィールドがあるのですが、この2つは【○○~○○】という具合にフォームでボタンを押せば範囲検索が出来るようになっています。 だけど、OR条件になってしまいます。 出来れば、それをAND条件で検索できる様にしたいのです。 ソースは今このようになっています↓↓ テキスト:「tubo1」「tubo2」「kakaku1」「kakaku2」 Private Sub コマンド55_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("物件情報", dbOpenDynaset) If tubo1 <> "" Then If tubo2 <> "" Then    rs.Filter = "[土地面積(坪)] >=" & tubo1 & " And [土地面積(坪)] <=" & tubo2 Else rs.Filter = "[土地面積(坪)] =" & tubo1 End If If kin1 <> "" Then If kin2 <> "" Then rs.Filter = "[価格] >=" & kakaku1 & " And [価格] <=" & kakaku2 Else rs.Filter = "[価格] =" & kakaku1 End If End If End If Set rs = rs.OpenRecordset Set Me.Recordset = rs Me.Requery Set rs = Nothing Set db = Nothing End Sub です。宜しくお願い致します。 ちなみにAccess2007です。

  • レコード更新について

    レコード更新について 環境: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勉強中で未熟なため、検討違いなコードになっているかもしれませんが コードの修正・改善、または全く違う方法等ご教授願えればと思います。        

専門家に質問してみよう