strWhere = "([請求締日]='" & Me![締日] & "')" & _
" AND ([請求先カナ] BETWEEN '" & Me![開始請求先] & "' AND '" & Me![終了請求先] & "')" & _
" AND ([施工者コード] BETWEEN '" & Me![開始施工者] & "' AND '" & Me![終了施工者] & "')" & _
" AND ([工事コード] BETWEEN '" & Me![開始工事] & "' AND '" & Me![終了工事] & "')" & _
" AND ([試験工場コード] BETWEEN '" & Me![開始試験] & "' AND '" & Me![終了試験] & "')"
If in_kbn = "w" Then
If PrinterGRP.Value = 1 Then
DoCmd.OpenReport "R_請求書10", , , strWhere
'//R_請求書10を印刷したときならここ
ElseIf PrinterGRP.Value = 2 Then
'//R_請求書控を印刷したときならここ
DoCmd.OpenReport "R_請求書控", , , strWhere
End If
'//どちらでもいいので印刷したときならここ
Else
If PrinterGRP.Value = 1 Then
DoCmd.OpenReport "R_請求書10", acPreview, , strWhere 'プレビュー
ElseIf PrinterGRP.Value = 2 Then
DoCmd.OpenReport "R_請求書控", acPreview, , strWhere
End If
End If
また、コードの書き方を工夫すると理解しやすくなります
strwhere = "(省略)"
'//印刷・プレビューに使うレポートを決める
Dim reportName As String
Select Case PrinterGRP.Value
Case 1
reportName = "R_請求書10"
Case 2
reportName = "R_請求書控"
End Select
'//印刷またはプレビューを行う
If in_kbn = "w" Then
DoCmd.OpenReport reportName, , , strwhere
'//印刷したときだけCSV出力をするならここにコードを追加する
Else
DoCmd.OpenReport reportName, acPreview, , strwhere 'プレビュー
End If
strwhere = "(省略)"
'//出力設定
Dim reportName As String
Dim queryName As String
Select Case PrinterGRP.Value
Case 1
reportName = "R_請求書10"
queryName = "(R_請求書10に対応したクエリ)"
Case 2
reportName = "R_請求書控"
queryName = "(R_請求書控に対応したクエリ)"
End Select
'//CSV出力先設定
Dim filePath As String
filePath = "C:\foo.csv"
'//処理実行
If in_kbn = "w" Then
'//印刷
DoCmd.OpenReport reportName, , , strwhere
'//CSV出力
DoCmd.TransferText acExportDelim, , queryName, filePath
Else
'//プレビュー
DoCmd.OpenReport reportName, acPreview, , strwhere
End If
Private Sub Form_Open(Cancel As Integer)
Me.TimerInterval = 1000
End Sub
Private Sub Form_Timer()
If Me!納期 < Date Then
If Me!納期.ForeColor = RED Then
Me!納期.ForeColor = DARKYELLOW
Else
Me!納期.ForeColor = RED
End If
End If
End Sub
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
セオリーはわかりませんが、どうでしょう。
毎日、売上テーブルに売上データを登録。月末などになったら請求テーブルに請求データを登録。売上テーブルを絞り込んで請求テーブルに紐付けて更新。
請求テーブルに請求データを登録。売上テーブルに売上データ登録&請求テーブルに紐付けする。
わざわざとか、複数になるのでとか、気にしたほうがいいのでしょうか。悩むならデータモデルを悩みたいですよね。
迂回出来るか、作り直すしかないのか、という事ですけれど、テーブル構造やVBAで何をやろうとしていたかなど追加情報が出てきたほうが、誰か回答するかも。
説明が下手ですみません
普段は売上テーブルにフォームで入力して月末にまとめて抽出して請求書にしています
たまに、今発生した売上をすぐに請求書にする、ということがあり、
そのときは一度上記の売上テーブルに入力して、抽出条件を設定して請求書を発行しています
すぐに請求書を発行する場合に、わざわざ抽出をしなくていいように
いま入力したものだけを請求書にして、その売上データも売上テーブルにいれる仕組みにしたいです
一般的にはそのようなわざわざそのような仕組みにせず(複雑になるので)ワンクッションおいてやるものでしょうか?
ありがとうございます。
多分このブログに当てはまるようです。
ということは、作り直すしかないということになるのでしょうか?
他に解決策はないでしょうか?
下記が参考になりませんか。
これ以上データベースを開くことはできません。: yamaV1.02βのブログ
下記の動画などが参考になりませんか。
上手く汲み取れたかわからないけれど、手順の自動化、サブフォームの作り方、レポートの作り方を聞きたいのでしょうか?
皆様 返信ありがとうございます。
hirotonさまに提示していただいた
の方法がうまくいきそうです。
ありがとうございました。
みなさんいろいろアドバイスありがとうございます。がんばってみます。
ありがとうございます。
大変勉強になります。
ご指導いただいた内容に沿って頑張って見ます。
通常はそのような線は出ないので、何か特別なことをしているはずです。
アドインを入れてるとかないですか。
思い当たることがない、ということなら、Officeをアンインストールしてから、再度インストールしてみてください。
この掲示板でコードを表記する場合はコードブロックの記述を使うとわかりやすくなります
また、コードの書き方を工夫すると理解しやすくなります
CSV出力の方法はいくつかあります。メリット・デメリット(使える・使えない)があるので組み込みながら調整が必要ですが、一番簡単と思われるのは
TransferText
を使った方法でしょうDoCmd.TransferText メソッド (Access)
事前に出力用のクエリを作成しておく必要があります。(上記コードでは(R_請求書10に対応したクエリ)と(R_請求書控に対応したクエリ)。実際にはシステムに合わせたわかりやすい名前にします)
hatenaさま 返信ありがとうございます。
背景色は条件付き書式で設定しています。
帳票フォームの最背面にテキストボックス(非連結)を作り
ルールの内容を式にして
[工程]="A工程" のとき 背景色を青 のようにして7工程設定してあります。
改めて考えてみたら条件付き書式を弄るのは大変ですが、条件を弄るのは簡単でした
チェックボックスを配置する(名前:点滅用)
条件付き書式の条件を調整する
ex)
これでタイマーごとに条件付き書式が反映される/されないを繰り返すので点滅してるように見えると思います
コントロールがチェックボックス一つで済む(位置・表示不問)なのでこっちのほうが楽そうです。点滅させたいコントロールが多いなら断然ですね
hirotonが条件付き書式を好きでないのはスクロールバーを掴んでいると反映されないからという理由があったりします
メインフォームの検索条件を増やせば済むようにも見えますが。話題作りとしては、導出フィールドを作って何か出来ないか、なんてどうでしょう。
工程別に色を変え失敗したものを強調したら、次はどうしますか。例えば、期限間近のものに音を鳴らしたり、数量が大きいものを立体的にしたり、手間と時間を見た目に費やすのでしょうか?
そういえば、期限を過ぎたものって、データベースでどういう扱いになるのでしょうか。それから、工程フィールドは別に切り出さないの?
タイマーイベントは単純に時間ごとにイベントを実行するだけ。その挙動(すべてのレコードのコントロールが同時に変更される)は帳票フォームの仕様ですね
基本事項の確認ですが、コントロールの「見た目」はいくつかの要素からなっています
・背景色
・前景色
・枠線(スタイル/色)
hatenaさん指摘の通り、背景色・前景色であれば条件付き書式を切り替えれば実現できるでしょう。枠線もやりたいとなると案がないこともないですが、そこまでする?って感じです
さて、条件付き書式を変更すれば点滅できそうだ、となりましたが、hirotonは条件付き書式が好きではありませんし、VBAでいじるのは大変です。条件付き書式を使わずにレコードごとに書式を設定する方法を使うと楽ができそうです
カレント行の背景色の変更 その3(hatena chipsさん)
hatenaさんのブログですね。記事では背景色ですが、前景色も同じ考え方で実装できます
背景色に適用したい場合
メインのコントロール>背景色:透明、コントロールの配置:前面
書式設定用コントロール>背景色:本来の背景色、コントロールの配置:背面
前景色に適用したい場合
メインのコントロール>背景色:本来の背景色、コントロールの配置:背面
書式設定用コントロール>背景色:透明、コントロールの配置:前面
納期コントロールにぴったり重なる点滅用納期テキストボックスを配置します
コントロールソース:
=IIf([納期]<Date,[納期])
背景色:透明
前景色:本来の背景色(※1)
このコントロールを表示したり消したりすれば特定のレコードのコントロールだけ点滅しているように見えます
注意事項として、前面のコントロールなので普通に触れます。フォーカスがあるときにコントロールを消そうとするとエラーになります。触れないコントロールにするか、即座に
納期.Setfocus
するような仕掛けが必要でしょう※1
本来の背景色と同じ色のテキストを前面に配置する≒背景と同化して見えなくなる。です。「文字を消す」ことが目的なら背景色のテクニックで完全にかぶせてしまってもいいですね。前景色でやると、調整によって薄めの文字との点滅とかができたりします
価格などはみなさんのアイデアでやるのがいいのかもしれませんね
・商品名の変更
・取引先の社名などの変更
・婚姻などで従業員の名字の変更
などはどのようにやるものでしょうか?
考えていたらありとあらゆるものが変更の可能性があるな、と
同じIDは登録出来ないので、確かにこれは無理ですよね。
1❌最初にざっくり思い浮かべたのはこんな感じのでした。
商品名や社名も何とかならないか考えたんですけど、力不足でまとまらなかったです。見た目の履歴は残すとして、中身が変わらないのに見た目を参照する必要ってあるのかな、従来通り中身を参照出来ないかしら?
プロに任せれば、マスタ全部に開始年月を組み込んで、複雑なデータベースを作ることが出来るのかもしれません。
ググったり本を読んだりするとだいたいそんな感じなので自然にそうなっちゃいますよね。主キーはIDの泥沼から抜け出すなら早い方が良いですよ。頭を柔らかくしないと無理なので大変苦労します。
頻繁に変更があるものなら、トランザクションテーブルの方にデータを持たせるというのもありだと思います。
例えば、生鮮食品の価格とかは、売上履歴テーブルに価格も格納してしまえばいいと思います。
マスターには常に最新の価格を入力して、売上テーブルに入力するときに、VBAでマスターの価格を売上テーブルの価格に代入します。
あるいは、マスターとは別に価格変更履歴テーブルを作成するという方法もあります。
届いています。ちょっと忙しかったので今、SQLを確認しました。
かなり複雑なSQLなので、それだけで原因を特定するのは難しいです。
症状の発生するファイルを送ってもらえたら、原因を特定できるかもしれません。(できないかもしれませんが)
これはどのように実現していますか?
帳票フォームでレコード毎に背景色を変更するのは、条件付き書式しかないですが。
点滅させるなら、その条件式を変更することになります。
現状の条件付き書式の設定を提示してもらえますか。
こうですね
https://dbconcept.hatenablog.com/entry/2021/07/24/123217
hirotonさま 返信ありがとうございます。
サブフォームのモジュールに
と記述しましたが、サブフォームの1件目の納期を参照しているようで
全ての納期のコントロールが同じ動きをしてしまいます。
どのように記述すればよいのでしょうか?
サブフォームもフォームです。適切にプロパティを設定すればその通り動作します
親フォームのタイマーイベントでサブフォームのコントロールを弄るということもできますが、今回の例ではそうすることもないでしょう
どのようにやるということですか?
有効期限をつけて同じ内容で一部を変更したレコードを追加するということでしょうか?
リレーションするときの主キーはIDにすることが多いですが同じIDは登録できませんよね?
先日こちらのフォームからお送りしておりました。届いておりましたでしょうか。
ご回答はメールでいただけそうでしょうか。特に急ぎという訳ではありません、
届いたか不安だったため…ご連絡お待ちしておりますね!
セオリーは知らないけど、年月で有効期間を表現すればええんじゃない?
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 様
お世話になっております。
早々のご教授ありがとうございます。
上記コードにてトライしてみます。
また結果ご報告いたします。
リンク先のサンプルのコードを下記のように修正しててみてください。