VBAでサブフォームに自動的にデータを入力

このQ&Aのポイント
  • VBAを使用して、メインフォームとサブフォームを連携させ、サブフォームに自動的にデータを入力する方法を解説します。
  • メインフォームには「工期自」「工期至」フィールドがあり、サブフォームには「請求予定日」フィールドが存在します。
  • 工期期間中は毎月月末が請求予定日となります。ただし、「工期自」が入力されていない場合は、「工期至」の月の月末のみが請求となります。
回答を見る
  • ベストアンサー

VBAでサブフォームに自動的にデータを入力したい。

VBAでサブフォームに自動的にデータを入力したい。 メインフォームに[工期自][工期至]フィールドがあります。 サブフォームに[請求予定日]フィールドがあります。 メインとサブは[管理No.]フィールドで繋がっています。 メインフォームの"請求"テキストをクリックすると、サブフォームが開きます。 そこで[工期至]フォーカス喪失時に、自動で[請求予定日]が入るようにしようと思います。 工期の期間中、毎月月末が請求予定日になります。 [工期自]の入力が無い場合は[工期至]の月の月末のみ請求になります。 下記のようなプロシージャを書いてみましたが、結果、データが全く入りません。 ADO(←まだ全く分かりません)というのを使わないとできないでしょうか? すいませんごちゃごちゃしてますが宜しくお願いします! Private Sub 工期至_Exit(Cancel As Integer) Dim SEIKYU As Date Dim TUKI As Integer Dim SYURYO As Integer DoCmd.OpenForm "サブ", acFormDS, , "管理No.='" & Me!管理No. & "'", acFormEdit If IsNull(Forms!サブ!請求書発行) Then If IsNull(Me.工期自.Value) Then SEIKYU = Me.工期至 TUKI = Month([工期至]) Else SEIKYU = Me.工期自 TUKI = Month([工期自]) End If SYURYO = Month([工期至]) + 1 Do Until TUKI = SYURYO Forms!サブ!管理No. = "[forms]![メイン]![管理No.]" Forms!サブ!請求書発行 = DateSerial(Year(SEIKYU), Month(SEIKYU) + 1, 0) SEIKYU = DateAdd("m", 1, SEIKYU) TUKI = Month(SEIKYU) Loop DoCmd.CLOSE acForm, "サブ" End If End Sub

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

1・デバッグの件 >いろいろ試してみたのですが、デバッグ実行できませんでした の『いろいろ』の内容と、『デバッグ実行できませんでした』の詳細を知りたいところですが・・。 DoCmd.OpenForm "サブ", acFormDS, , "管理No='" & Me!管理No & "'", acFormEdit の行の次に、Stopと書き加えても止まります。 >フォーム自体にプログラムを書いているからでしょうか ではありません。 こちらの件は自力で頑張ってください。 2・サブフォームにデータを追加したい件。 追加したいレコードが一件なら大丈夫ですが複数の場合、 Accessから見ればサブフォームの各テキストボックスは単一のコントロールでしかないので Do ~ Loop処理しても自動的に次のレコードに追加してくれるわけでは有りません。 多分、提示されたコードが問題なく(Error が発生しなく)動いたとしても サブフォームには一件のレコードしか追加されません。 そこでレコードセットを開いて追加するか、追加クエリを行うかの選択肢になります。 テーブルやクエリの構造が不明なので今回はレコードセットを開きます。 ※~No. は全て ~No に変更しています。 最後にドット(.)が来るとAccessが誤解してオブジェクトのメンバーを探しに行ってしまう為。 テーブル・クエリ・フォーム・レポート・モジュールの全てを変更してください。 その他はコード内に変更点などをコメントで入れてます。行頭のシングルクォーテーション(') また下記コードは必要最小限の修正にありますので、望む結果が有られない場合もあります。 さらに未検証です。(文法的なエラーは無いはずです) 追伸、一般的にAccess で『サブフォーム』といえば、フォームの中に組み込まれた子フォームの ことを意味します。 Private Sub 工期至_Exit(Cancel As Integer)   Dim SEIKYU As Date   Dim TUKI As Integer   Dim SYURYO As Integer   Dim rsTo As Object   '複写先レコードセット      DoCmd.OpenForm "サブ", acFormDS, , "管理No='" & Me!管理No & "'", acFormEdit   'DoCmd.OpenForm "サブ", acFormDS, , "管理No=" & Me!管理No , acFormEdit   '↑管理No が数値型ならこちらを   Set rsTo = Forms!サブ.Form.Recordset  '『サブ』フォームのレコードセット取得         If IsNull(Forms!サブ!請求書発行) Then          If IsNull(Me!工期自) Then       SEIKYU = Me!工期至       TUKI = Month([工期至])       Else       SEIKYU = Me!工期自       TUKI = Month([工期自])     End If          SYURYO = Month([工期至]) + 1     '↑ 12月に動かした場合にどこかで問題が発生しませんか?確認を          Do Until TUKI = SYURYO              rsTo.AddNew   '新規レコード追加開始       rsTo!管理No = Me!管理No       'Forms!サブ!管理No. = "[forms]![メイン]![管理No.]"       rsTo!請求書発行 = DateSerial(Year(SEIKYU), Month(SEIKYU) + 1, 0)       'Forms!サブ!請求書発行 = DateSerial(Year(SEIKYU), Month(SEIKYU) + 1, 0)       rsTo.Update   '新規レコード確定              SEIKYU = DateAdd("m", 1, SEIKYU)       TUKI = Month(SEIKYU)     Loop        End If   'DoCmd.Close acForm, "サブ"    '確認のため閉じない   rsTo.Close: Set rsTo = Nothing End Sub

yu-akun
質問者

お礼

いろいろと試行錯誤していて返事が遅くなりました。すいません! 1・デバッグの件 デバッグしようとするとマクロのウィンドウが出てきて、そこにはプログラムの名前は一つも出てきていません。”キャンセル”しかクリックできないようになっていてそれ以降進めません。 ExcelでVBAを書いたときは標準モジュールに全てのプログラムが入り、そっちではデバッグできていたのですが…。 私はAccessでVBAを書くとき、プロパティのコードビルダからVBAを開いていたので、自動的にクラスオブジェクトのフォーム自体にコードが保存されました。それが正しいのだと思いいつもそこに記述していたのが悪いのか… 未だ不明です。 2・データ追加の件 ~No.のところは、"なんばー"と入力し変換して出るやつなので、ドットとして認識せず正しく動いています。ややこしいことしてごめんなさい。 AddNewを使って追加しなければならないことは理解しました。 教えていただいたコードを元に試行錯誤しましたが、私の力不足でうまくいかず、結局根本的に考え方を変えてデータベース自体作り変えることにしました。 (自動で請求日を追加しなくて良いように。もちろん一個ずつ手入力するわけでもありませんが。) "サブフォーム"という表現も誤って理解していて申し訳ありません。 結果的に私の力不足で解決できなかったのですが、いろいろな事を学ばせていただきました。 nicotinismさん、いろいろと考えていただいて本当にありがとうございます。 感謝しています!

その他の回答 (1)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

まずは、 >メインとサブは[管理No.]フィールドで繋がっています 『サブ』フォームはメインフォームの中に配置されているフォームなのですかね? 提示されたコードからは独立したフォームのように思えるのですが? 取りあえず、 ステップ実行して変数やコントロールの値を追って行ってみては? VBEの画面で適当な行でF9を押せば行が赤く変わります。 でモジュールを実行させるとその行で一旦止まりますので F8で1ステップずつ進めて行ってみてください。 カーソルをそれぞれの変数などに合わせると値が表示されます。 (メニューバーの『デバッグ』と『実行』のところのメニューもみてね) また、イミディエイトウィンドウで例えば ?Me.工期至 ででも確認できます。 此処まで確認してみては。 で問題が無かったならば。 次に、サブフォームは開いた当初、複数のレコードが表示されていて Do ~ Loop処理の中でそのレコードの更新を行いたいのですか? それともレコードを追加させたいのですか? ※Accessのバージョンは必ず記入しましょう! 当方Access2002なので期待に添えない場合も有ります。

yu-akun
質問者

補足

返信遅くなり申し訳ありません。 ご丁寧な回答をありがとうございます!! ●『サブ』フォームはメインフォームの中に配置されているフォームか?独立フォームか?  独立したデータシート型フォームが開くようになっています。 ●デバッグについて勉強不足でいろいろ試してみたのですが、デバッグ実行できませんでした。  クラスオブジェクトのフォーム自体にプログラムを書いているからでしょうか?  その辺も最初から勉強してみます。 ●Do ~ Loop処理の中でそのレコードの更新したいのか?追加させたいのか?  >>If IsNull(Forms!サブ!請求書発行) Then …  ↑ここで、請求書発行が空白の場合のみ処理する(データを追加)ようにしています。  質問を投稿すると文章の行頭がそろってしまい(行頭スペースが消えた)見にくくてすいません! ●Accessのバージョン  Access2003です。すいません記入漏れでした。 ●いろいろ試している中で、1回目の"工期至"フォーカス喪失時にはサブに"請求書発行"値は何も入らず、2回目実行時には思い通りに(工期4/1~9/30だと、4/30、5/31、6/30、7/31、8/31、9/30の6レコード)入った時がありました。 その後いろいろいじっていると今は2回目でも9/30しか入らなくなりました。 (変数に影響するプログラムの箇所は全く変えていないのに) このことから変数の値の取得は間違っていないのかなと思います。 サブフォームを開く時、レコードを追加する為に何らかのステップが必要なのかと悩んでいます。 何か分かりますでしょうか。どうぞ宜しくお願いします!

関連するQ&A

  • ACCESSで条件によってサブフォームを非表示に

    Accessの初心者です。よろしくお願いします。 Accessで住所録を作っています。 メインフォームは主に本人のデータを表示し、サブフォームで家族の データを表示するようにしました。 その時、家族がいない人についてはサブフォーム自体を表示しないようにしたいと思います。 そこで下記のようにしましたがうまくいきませんでした。 (1)サブフォーム内で家族の人数をカウントする。 (2)このカウント結果をメインフォームに表示する。(メインフォーム にテキストボックスを配置し、コントロールソースをサブフォームの 人数カウントにする。)     ここまではうまくいきました。 (3)ここでメインフォームのイベントの「開くとき」に以下のように記 述しました。(メインフォームのテキストボックスにカウントという  名前をつけました。) Private Sub Form_Open(Cancel As Integer) If Me!カウント = 0 Then サブフォーム.Visible = False Else サブフォーム.Visible = True End If End Sub この記述の仕方がまずいと思うのですが、どのようにすればよいか 分りません。よろしくお願いします。

  • サブフォームのデータをそのままひっぱってきたい。

    Access2002です。 T_マスタ・T_サブ・T_備考という3つのテーブルをもとに F_マスタ・F_サブ・F_備考という3つのフォームを作成しています。 F_マスタの中にF_サブをサブフォームとして設定してあります。(氏名IDでリンク) F_サブの中に、Fサブ上の情報(氏名ID・データ年)で検索をして開く F_備考を開くためのコマンドボタンを設置してあります。 そこでF_備考を開いた後に、何も検索結果が出されなかったら、 入力をするために、「入力」というボタンを設置しました。 このボタンを押すと、F_サブ上の「氏名ID」「データ年」を 自動でF_備考の同じ名前のところへ入力したいのです。 ですが、実行すると「F_サブフォームは見つからない」という旨の エラーが出てしまいます。 それならF_サブを開いてしまえと、コマンドボタン上に、 F_サブを開く設定をしたのですが、今度は 「サブフォームに設定してあるフォームは開けない」という エラーメッセージが表示されてしまいました。 サブフォームのデータをそのまま参照することはできないのでしょうか? 実際のコードは以下のような簡単なものです。 F_備考の「入力」ボタン Me!氏名ID = Forms![F_サブ]![氏名ID] Me!データ年 = Forms![F_サブ]![データ年] どうやったらデータをひっぱってこれるのでしょうか? 宜しくお願いします。

  • アクセスのサブフォームの値のチェック

    Accessのサブファームにある、コンボボックスの値をチェックしたいので、下記のようにしてみました。 Dim ctl As Control For Each ctl In Me.Controls If ctl.ControlType = acSubform Then msgbox Forms!メインフォーム名!サブフォームコントロール名.Form!コントロール名 End If Next すると、サブフォームの現在選択しているコンボボックスの値しか表示されません。 現在表示されているサブフォームのコンボボックスの値すべてを表示させるにはどうすればいいのでしょうか。よろしくお願います。

  • ACCESS97 サブフォームのレコードソースプロパティーを変更したい。

    フォームの中にサブフォーム(データシート)が1つあります。 元のフォームのチェックボックスのオン・オフでサブフォームのレコードソースプロパティーを変更すると、 実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていません。がでます。 サブフォームのビューは変更したくありません。 だれか助けてください。 If Me.未送信のみ = -1 Then Forms!F_処理選択!F_理選択サブ.RecordSource = "F_処理選択サブ_1" Else Forms!F_処理選択!F_処理選択サブ.RecordSource = "F_処理選択サブ_2" End If

  • 変数にフォームからの入力値が入らない。

    変数にフォームからの入力値が入らない。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、JOGEしか入っていませんでした。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge, tuki, stdocname)

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • サブフォームで自動採番

    お世話になります。ACCESS2000で制作しています 主テーブル(マスタ)に顧客コード(主キー)、 サブテーブル(トラン)に顧客コードと枝番 というフィールドがあります。 顧客コードでリレーションシップを結んでいます。 それぞれのテーブルからクエリを経てフォームをつくり (Q_マスタ→F_マスタ、Q_トラン→F_トラン) また、検索フォームも別に作っています。 F_トランはF_マスタに埋め込んでいます。 検索フォームで検索して該当するデータが無い場合 DoCmd.OpenForm "F_マスタ", , , , acFormAdd で新規フォームを呼び出します。 このときサブフォームの枝番に自動的に「1」を入れたいのですが (開く時でも読み込み時でもいつでもいいのですが) どうしたら良いのでしょうか? ちなみに今は サブフォームのプロシージャで Private Sub Form_Open(Cancel As Integer)  If Me.NewRecord Then   Me![枝番] = 1  Else   Me![枝番] = DMax("枝番", "Q_トラン") + 1  End If End Sub としています。 こうするとQ_マスタの一番上のデータが 例えばQ_トランレコードを2つ持っていると 「3」と出てしまいます。 どのようにすればいいのでしょうか。 よろしくお願いします。

  • Accessでサブフォームの合計をメインフォームに

    Access2007で開発しています。 メインフォームにサブフォームを貼り付けており、 サブフォームに入力した「数量」「単価」から「金額」を計算して表示し、 その合計金額をメインフォームのテキストボックス(非連結)に表示しようと しています。 サブフォームは行単位で追加、削除が可能です。 サブフォームの更新結果が正しくメインフォームに表示されずに困っています。 おわかりの方、おられましたらお教え頂きたく、よろしくお願い致します。 【サブフォーム】   ・レコードソース:T_明細   ・[詳細]項目:数量・・・レコードソース=T_明細・数量        単価・・・    〃    =T_明細・単価        金額・・・数量および単価のAfterUpdateで計算して表示。    [フォームフッター]項目:金額計・・・コントロールソース=Sum([金額])   ・Vbaコード:   Private Sub Form_AfterUpdate()   Forms![メインフォーム].合計計算   End Sub   Private Sub Form_Delete(Cancel As Integer)   Forms![メインフォーム].合計計算   End Sub 【メインフォーム】  ・テキストボックス:「合計金額」(非連結) Public Sub 合計計算()    Me.サブフォーム.Requery   方法1: Me!合計金額 =DSum("金額", "T_明細", (キー項目指定 記述省略))   方法2: Me!合計金額 = Me![サブフォーム].[Form].[金額計] End Sub ここで、 方法1の場合:数量、単価の変更入力及び行追加は正しく動作するが、          行削除の後、メインフォームの「合計金額」が再計算されず、変更前のまま。 方法2の場合:数量、単価の変更入力及び行追加すると、「合計金額」が”0”になる。          行削除しても「合計金額」は変わらず、変更前のまま。 どちらも、サブフォオームの「金額計」は正しく表示されています。 以上、よろしくお願い致します。

  • access サブフォーム間の連動について

    Access2013について メイン親単票フォーム上に連動する二つのサブフォームを配置させました。 内一つは帳票、もう一つは単票にし、帳票からレコードを選択するとデータ詳細が単票側が連動するまで至りましたが、ここでサブフォーム帳票を並べ替えや抽出を実行すると、サブフォーム間の連動が出来なくなり、解決に困っております。 解決方法をご存知の方、お力添え願います。 親フォームに VBA Private Sub Form_Open(Cancel As Integer) Set Me.SubForm2.Form.Recordset = Me.SubForm1.Form.Recordset End Sub 抽出方法としては帳票サブフォーム上からとメインフォーム上からの実行までを試しておりますが、いずれも抽出後にサブフォーム間の連動が出来なくなってしまう状況です。 お力添え、宜しくお願いいたします。

  • ボタン押下でサブフォームのレコードソースを変更

    ボタン押下でサブフォームのレコードソースを変更 する方法を探しています。 元とするテーブルは同じですが、拾うべきフィールドが全く異なるため2つのクエリを作成しました。 元テーブル「メンバー一覧」 クエリ「q_1組のみ」「q_女性のみ」 フォームヘッダーにコンボボックスでどちらかのクエリを選択し、ボタンを押したら サブフォームが表示されるようにしたいのですが、 現在のところ、「閉じているかまたは存在しないオブジェクトを参照」というエラーが出てしまっています。 Me.でもForms("検索ウィンドウ").でも結果は同じでした。 ソースはクエリを指定しています。 Access2007 --------------------------------- Private Sub 検索ボタン_Click() If [Forms]![検索ウィンドウ]![申込形態] = "1組のみ" Then Me.検索結果サブフォーム.Form.RecordSource = "q_しぼりこみ1" Else Forms("検索ウィンドウ").検索結果サブフォーム.Form.RecordSource = "q_しぼりこみ2" End If

専門家に質問してみよう