Public Sub 登録ボタン()
DoCmd.GoToRecord acDataForm,”フォームの名前”,acNewRecord
Me.教科 = Me.テキストボックス教科
Me.点数 = Me.テキストボックス点数
DoCmd.GoToRecord acDataForm,”フォームの名前”,acNext
End Sub
Public Sub 登録ボタン()
DoCmd.GoToRecord acDataForm,”フォームの名前”,acNewRecord
Me.国語 Me.テキストボックス国語の点数
Me.数学 Me.テキストボックス数学の点数
Me.英語 Me.テキストボックス英語の点数
DoCmd.GoToRecord acDataForm,”フォームの名前”,acNext
End Sub
もしくは
Public Sub 登録ボタン()
DoCmd.OpenQuery “追加クエリの名前”
End Sub
Private Sub Report_Page()
BottomPos = BottomPos - PageTop '//変更
Me.DrawWidth = 4 '罫線の太さを設定
Me.Line (0, BottomPos)-(Me.Width, BottomPos)
End Sub
Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
PageTop = Me.Top '//これだけでいい
End Sub
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
BottomPos = Me.Top + Me.拡張設定のあるテキストボックス.Height '//追加
End Sub
Option Compare Database
Option Explicit
Const A4Height As Long = 29.7 * 567 'A4・スp・ス・ス・スフ搾ソス・ス・ス=29.7cm 1cm=567twips
Dim PageHeight As Long
Dim BottomPos As Long '追加
Dim PageTop As Long '追加
'ページフォーマット時イベント 追加
Private Sub Report_Page()
BottomPos = BottomPos + PageTop
Me.DrawWidth = 4 '罫線の太さを設定
Me.Line (0, BottomPos)-(Me.Width, BottomPos)
End Sub
Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
'印刷可能領域下辺のページ上端からの高さを取得
On Error Resume Next
PageHeight = A4Height - Me.Printer.BottomMargin
PageHeight = PageHeight - Me.Section(acPageFooter).Height
PageTop = Me.Top '追加
End Sub
Private Sub グループフッター1_Format(Cancel As Integer, FormatCount As Integer)
If Me.Top + Me.グループフッター1.Height <= PageHeight Then
Me.NextRecord = False
If FormatCount > 20 Then Me.NextRecord = True
'↑想定外の動作で無限ループになった場合でも、20回で止まる
BottomPos = Me.Top '追加
Else
Cancel = True
End If
End Sub
'詳細のフォーマット時イベント 追加
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
BottomPos = Me.Top - Me.詳細.Height
End Sub
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
Me.DrawWidth = 1
Dim ctl As Control
For Each ctl In Me.詳細.Controls
If ctl.ControlType = acLine And ctl.Visible = False Then
If ctl.Width = 0 Then Me.Line (ctl.Left, 0)-(ctl.Left, 14400)
End If
Next
End Sub
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
rs.AddNew
With Me.Recordset
Dim i As Long
For i = 1 To rs.Fields.Count - 1
rs.Fields(i) = .Fields(i)
Next
End With
rs.Update
DoCmd.GoToRecord , , acLast
セオリーは知らないけど、年月で有効期間を表現すればええんじゃない?
VBAを使わずともアクセスの基本機能でできることです。
まずは基本機能を習得したうえで、それではできないことをVBAでするという設計にした方がいいでしょう。
その前にテーブルの設計におかしな部分がありますので、
下記のような設計としてください。
T_生徒テーブル
フィールド
生徒番号 主キー
名前
年齢
性別
学校名
T_成績管理テーブル
生徒番号
日付
国語
数学
英語
現状のフォームをもとに修正するなら下記の手順になります。
フォームのレコードソースを[T_成績管理テーブル]にします。
生徒番号のテキストボックスは右クリックして[コントロールの種類の変更]→[コンボボックス]でコンボボックスに変換します。
プロパティを下記のように設定します。
名前 cb生徒番号
コントロールソース 生徒番号
値集合タイプ テーブル/クエリ
値集合ソース T_生徒テーブル
連結列 1
列数 5
列幅 1cm;3cm;0cm;0cm;0cm
リスト幅 4cm
性別、年齢、学校名などのラベルは削除して、
テキストボックスを4つ配置して、コントロールソースをそれぞれ下記のように設定します。
=[cb生徒番号].Column(1)
=[cb生徒番号].Column(2)
=[cb生徒番号].Column(3)
=[cb生徒番号].Column(4)
これで、各テキストボックスから生徒番号を選択すると対応する名前、年齢、性別、学校名が表示されます。
国語、数学、英語のテキストボックスのコントロールソースも設定しておきます。
以上で、
最後のテキストボックス(英語)まで入力してEnterキーを押せば、
VBAなしに[T_成績管理テーブル]に登録されます。
りんごさんからも指摘がありますが、
本来は科目は縦に並ぶようにテーブル設計にすべきです。
そのような設計を「テーブルの正規化」といいます。
正規化されていないとデータベースの機能を活かせないので、正規化すべきですが、それを説明しだすと長くなるので、WEB検索して調べてみてください。
正規化の実例 - もう一度学ぶMS-Access
あと、Accessの基本機能、特に連結フォームについてもAccessの入門サイトなどで学習してください。
一部修正。
抽出するコード、登録するコード、例えば、こんな感じになるのかも。最近触ってないのでちょっと怪しいですが。
ただし、フォームのレコードソースを設定したり、クエリの抽出条件にテキストボックスを設定したり、諸々足りていないと動かないので色々ググって下さい。
もしくは
それはさておき、データベースがちゃんとデータベースである為に、Excelの何倍も手間暇をかけて登録する事になるって知っていますか?
取り敢えず、主キーの設定が必要です。例えば、生徒とテスト名と教科が決まると、点数が決まるから、生徒とテスト名と教科を主キーとするなど。
Excelのような通し番号は存在しません。ケースバイケースで並び順は変わります。
そういえば、縦横自由に登録出来るデータベースは無理です。国語、数学、英語の点数を横方向に14,15,16とするのはNGなので、縦方向に登録しましょう。
国語の点数を入力したら、登録ボタンを押して登録。数学の点数を入力したら、登録ボタンを押して登録。英語の点数を入力したら、登録ボタンを押す。エラーが発生、英語が教科として事前登録されていません。英語の点数入力を破棄して、教科として事前登録する為に…
ファイル送信フォームは私だけにメールで届きます。
ここにアップされることはありません。
本件について、他業務に圧迫されなかなか本腰を入れることができず、ご教示いただいていたのに
回答が遅くなってしまい申し訳ありません。上記の記載が核心をついている気がします。
SQLの情報が長く、関係ない情報も入っていてここに記載するのが少しためらってしまうのですが
右下の「ファイル送信フォーム」からお送りした場合、hatena様にだけ届くのでしょうか。
(ここにはアップされない)
お手数をおかけして申し訳ありません。
mae さん
ありがとうございました。
助かりました。
例えば、売上日2020/4/2、お客様CD1180に紐づいた売上をたくさん登録したい時に使用するのかも。お客様CD:非表示、お客様名:表示、連結列:お客様CDの列として。
C:\Windows\System32フォルダに入っているなら、
でいけると思います。
その手順は連結列プロパティを設定します。コンボボックスの値としてどの列を使うのか?の指定です
説明文の要点は「・・・データベースに保存または使用する値は・・・どの列・・・?」です
hatena様
hiroton様
お世話になっております。
hiroton様のコードを混ぜながらトライしたところ、見事に私がイメージしている形で印刷することが出来ました。
色々なレポートで活用していきたいと思います。
大変助かりました。ありがとうございました。
縦線についてはきれいな表形式のレポートならレイアウト機能(レポートデザインツール→テーブル→表形式)を使って縦線の代わりにテキストボックスを使うと印刷時拡張で一緒にサイズが変わるのでちょっと楽かもしれません
最下部の横線考えてたらhatenaさんがいい感じの回答してますが、
単に印刷領域上からの位置でいいんじゃないかなぁというのと、Formatイベントは処理が複雑なので実際に描画したPrintイベントで位置を取得すると楽じゃないかなと
見る方向が逆になっているので+-が逆になるのと、印刷時拡張後の高さが欲しいので高さを取得するコントロールをきちんと指定する必要があります
グループヘッダー・フッターについても、ページの最後に印刷される可能性があるならPrintイベントで同様に最下部の位置を取得しておけばいいです
いずれにせよReport_Pageイベント直前のPrintイベントでBottomPosがその「セクションの印刷開始位置(Me.Top)+セクションの高さ」で上書きされていればちょうど最下部に線を描画できます
※大本のコード(その他の目的)部分は考慮していません
hatena 様
お世話になっております。
早々のご教授ありがとうございます。
上記コードにてトライしてみます。
また結果ご報告いたします。
リンク先のサンプルのコードを下記のように修正しててみてください。
1.「レコードをすべて差し込む方法」で最後のレコード(新規レコード)だけを対象にする
2.作業テーブルを用意し「レコードをすべて差し込む方法」で、常に1レコードだけを対象にする
3.Word文章(テンプレートファイルのコピー)のテキストを直接置き換える
ゼロからWordの差し込み印刷を設定する方法も検索すれば見つかりそうですが必要ないですよね?
(2)は少し特殊ですが、それぞれ簡単な単語で検索して見つかったページをつまみ食いした程度で出来そうな内容です。それぞれメリット・デメリットはあります。どのような問題があり、どういった手法を望んでいるんですか?
もしかして、月にいくらを便宜上、1日or月末で登録するという事でしょうか?それとも、1日に登録するか、月末に登録するかという事でしょうか?
ググっただけですが、会計基準や会社のルールに従い、月にいくら、請求日、入金日を登録する感じになるのかも。
一般的には1日にすると思います。
日付/時刻型に年月だけ入力すると自動で1日になりますので。
末日が必要な時は、
DateAdd("m",1,[日付])-1
とか
DateSerial(Year([日付]),Month([日付]),0)
という式で求められます。
あるいは、日付/時刻型でなく、年、月の数値型の2フィールドにしたり、数値型の1フィールドで202101というように6桁にする方法もあります。
もう少し具体的に現状を説明すると誰か回答するかも?テーブル構造、SQL、VBAコードなど。
ずれについては、グループヘッダーを使っていてそれが拡張した次ページに印刷されない分上にずれてる(ように見える)と予想
これならグループヘッダーのセクション繰り返しプロパティを「はい」にすると対応できます
「背景がグレー」に関しては、詳細セクションの『代替の背景色』プロパティを「色なし」に設定してみてください。
「表示位置」に関しては現状のレイアウトとか設定が分からないと原因の特定は難しいです。
デザインビューとプレビューの画像をアップしてもらえたら何かわかるかもしれません。
ありがとうございます。
印刷プレビューで2ページ目も表示されるようになりましたが、2ページ目は背景がグレーになり、表示位置も上にずれています。原因がわかりません。よろしくお願いします。
ありがとうございます!やりたいことが完璧にできました!
皆様
ご回答いただきありがとうございます。
りんご様からご紹介いただきましたHatenaさんの方法で対応いたしました。
大変助かりましたありがとうございました。
詳細セクションとテキストボックスの「印刷時拡張」プロパティを「はい」に設定してください。
フォームのレコードソースがテーブルならば、
先頭フィールドがオートナンバー型のフィールドという前提です。
hiroton様
ありがとうございました。助かりました
回答ありがとうございます。勉強になります。
テーブルのレコード自体をまるまるコピーして、新規レコードに貼り付ける方法はないでしょうか?
フォーム上に連結コントロールとして配置していないフィールドはコピーされません。
フォーム上に連結テキストボックスとして配置しておく必要があります。
表示させたくないなら、サイズを小さめにして、他のコントロールの背面に隠しておくといいでしょう。
「タブストップ」を「いいえ」にしておけば、タブキーで移動してもフォーカスしないのでユーザーは見ることができません。
ComboBox.NotInList イベント (Access)
リスト外入力時イベントで制御できます
自動では、できませんでしたが、何とか完成しました。
ありがとうございました。
いつも、回答ありがとうございます。
今年もよろしくお願いします。
りんご様
回答ありがとうございます。
そうですよね。Excelでやるべきですよね。
そう、提案したんですけど、ACCESSの要望が強くて困っています。
Excelでやるのはどうですか?
AccessもSQLも、横並びを使わない、ときに利用するものだと思います。
農家テーブルは、
果物名 農家名
もも 野田農園
もも 百田農園
ということですか。
果物テーブルには農家名はないのに、その数量を野田農園にのみセットするという判断基準は何でしょうか。
集計クエリを作ったら、テーブル作成クエリに変更・実行。作成されたテーブルと更新したいテーブルで内部結合を組んで更新クエリを作成。取り敢えず思い浮かんだだけなので、動作確認が不十分です。
余談ですが、僕だったら、明細テーブル:{農家,果物名,品種},数量とするかなぁ。
ググっていたら、Hatenaさんのブログがヒットしました。流石ですね。
HatenaChips:更新クエリで定義域集計関数を使わずに集計する
コマンドボタンに設定。明細レコードの先頭レコードに移動、更新クエリの実行、次のレコードに移動、更新クエリ実行、・・・みたいな使い方になるのかしら。
追伸
謹んで新春のお喜び申し上げます。今年もどうぞよろしくお願いします。
お世話になります。
ご回答いただきありがとうございます。
>画像を見ると、「3まとめ」テーブルは「1果物合計」クエリと同じもののようですが、なぜ取得できるものをテーブルにする必要があるのでしょうか。
その理由を聞かせてほしいです。
「3まとめ」には同じ果物で農家がことなるレコードがあります。
例:もも 野田農園 百田農園があり、野田農園に数量40をセットしたいです。
お教えいただいた方法ですと、農家名の指定ができないのでうまくいきませんでした。
もし他に方法がございましたらよろしくお願いいたします。
どうもありがとうございました。
画像を見ると、「3まとめ」テーブルは「1果物合計」クエリと同じもののようですが、なぜ取得できるものをテーブルにする必要があるのでしょうか。
その理由を聞かせてほしいです。
とりあえず、上記の疑問点はおいておいて、回答すると、
集計クエリを含むクエリは更新不可のクエリになります。それを更新クエリにすれば当然そのようなエラーになります。
集計クエリは使わずに、「3まとめ」テーブルから更新クエリを作成して、DSum関数で合計を取得して更新すれば可能ではあります。
更新クエリの設定
お世話になります。
hatena様ご回答いただきありがとうございます。
こちらの方法で対応できました。
ユーザもカレントレコードが確認しやすいとよろこんでおりました。
ありがとうございます。
いつも助けていただきありがとうございます。
また質問させていただくことがあるかと思いますがその際はどうぞよろしくお願い
いたします。
ご希望のことは、下記のようなことでしょうか。
カレント行の背景色の変更 その3 - hatena chips