Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If FormatCount = 1 Then
data = data & Left(Me!薬品名 & String(12, "・"), 12) & Format(Me.Page, "@@@") & vbCrLf
End If
End Sub
Private Sub レポートフッター_Format(Cancel As Integer, FormatCount As Integer)
Static isExecuted As Boolean
Dim arr
Dim s
Const colCount = 3 '1ページの段数
Const rowCount = 30 '1ページの行数
Dim CNT As Long
Dim colName As String
If Not isExecuted Then
'並び替えのために配列にする
arr = Split(Data, vbCrLf)
'配列を並び替え
Call ArrayListSort(arr)
'段組みに振り分ける
CNT = 0
For Each s In arr
colName = "txt目次" & CNT \ rowCount Mod colCount
Me(colName) = Me(colName) & s & vbCrLf
CNT = CNT + 1
Next
isExecuted = True
End If
End Sub
Private Sub ボタン_Click()
With Me.RecordsetClone
.MoveFirst
Do until .EOF
.Edit
!Chk1 = False
!Chk2 = False
!Chk3 = False
!Chk4 = False
.Update
.MoveNext
Loop
End With
End Sub
Option Compare Database
Option Explicit
Dim data As String
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
data = data & Left(Me!薬品名 & String(12, "・"), 12) & Format(Me.Page, "@@@") & vbCrLf
End Sub
Private Sub レポートフッター_Format(Cancel As Integer, FormatCount As Integer)
Dim arr
Dim s
Const RowCount = 30
Dim CNT As Long
'段組みに振り分ける
CNT = 0
For Each s In arr
Me("txt目次" & CNT \ RowCount) = Me("txt目次" & CNT \ RowCount) & s & vbCrLf
CNT = CNT + 1
If CNT >= 120 Then Exit For 'RowCount * 4
Next
End Sub
Sub ArrayListSort(ary As Variant)
Dim aryList As Object
Dim s
'// .NET FrameworkのArrayListクラスを利用する
Set aryList = CreateObject("System.Collections.ArrayList")
For Each s In ary
Call aryList.Add(s)
Next
Call aryList.Sort
ary = aryList.ToArray
End Sub
hiroton さん、有難うございます。感激です! レポートフッターにテキストボックスを作成し、このままコードをコピペしたところコンパイルエラー(型が一致しません)と出た為、Private Sub ページフッターセクション → Private Sub レポートヘッダーセクション とし、プレビューしたところエラーは出ませんが、何もはきだしていない状態です。どこをどうすれば良いのか分からず、とりあえずご報告いたしました。
Option Compare Database
Option Explicit
Dim data As String
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
data = data & Left(Me!薬品名 & String(12, "・"), 12) & Format(Me.Page, "@@@") & vbCrLf
End Sub
Private Sub ページフッターセクション_Format(Cancel As Integer, FormatCount As Integer)
Dim arr
Dim s
Const RowCount = 30
Dim CNT As Long
'並び替えのために配列にする
arr = Split(data, vbCrLf)
'配列を並び替え
Call ArrayListSort(arr)
'段組みに振り分ける
CNT = 0
For Each s In arr
Me("txt目次" & CNT \ RowCount) = Me("txt目次" & CNT \ RowCount) & s & vbCrLf
CNT = CNT + 1
If CNT >= 120 Then Exit For 'RowCount * 4
Next
End Sub
Sub ArrayListSort(ary() As Variant)
Dim aryList As Object
Dim s
'// .NET FrameworkのArrayListクラスを利用する
Set aryList = CreateObject("System.Collections.ArrayList")
For Each s In ary
Call aryList.Add(s)
Next
Call aryList.Sort
ary = aryList.ToArray
End Sub
Private Sub cmdAddNew_Click()
Dim 開始年月 As Date
開始年月 = DateSerial(Me.開始年,Me.開始月,1)
Dim 月数 As Long
月数 = Datediff("m", 開始年月, DateSerial(Me.終了年,Me.終了月,1))
Dim i As Long
With Me.サブフォームコントロール名.Form.Recordset
For i = 0 to 月数
.AddNew
!契約番号 = Me.契約番号
!請求先 = Me.請求先
!契約名 = Me.契約名
!月額 = Me.月額
!請求月 = DateAdd("m",i,開始年月)
'・・・・
.UpDate
Next
End With
End Sub
hirotonさん、早くも質問です。小出し小出しで申し訳ない内容です。
索引を印刷したところ、本文の薬品ページと索引で示すページが異なっている一部薬品があります。ページが変わるタイミングの薬品で、レポートで薬品を剤型→薬効分類とグループ化しているのですが、薬効分類がページが切り替わる時、例えば、1ページ目に薬効分類が入っていると薬品が2ページ目なのに索引には1ページと表記される といった状態です。2点目は、以前
ご指摘の通り、薬品にはカタカナ、漢字、数字が混在しています。印刷をしてみると、やはり五十音順にならんでいた方が見やすいかなと思い、ご指導を頂けないでしょうか?
今更ですが、レポートと薬品集テーブルのスクリーンショットを添付しました。宜しくお願い致します。
hatena様、新たな情報ありがとうございます。
実現方法も様々あるようで、場面によって適した方法が使えるように励みたいと思います。
改めましてありがとうございました。
>hatena様
前回は色々とご教授いただきありがとうございました。
hatena様のお力添えのおかげで、途中まで順調に進むことができました。
しかし、どうしても一点つまづいてしまった部分があり、
ご助言をいただきたく、またご相談させていただきました。
hatena様のご助言通り、メインフォームの「基本情報」はT_契約マスターと連結させました。
教えていただいたVBAのコードは、「ごとに請求」ボタンに埋め込んでおります。
また、月額、税率、税の処理などのコントロールは、非連結で作成しております。
今回困っている箇所ですが、ボタンを押すと問題なくレコードがサブフォームに追加されるのですが、
サブフォームを触ろうとするとサブフォームがクリアされてしまいます。
(サブフォーム以外の場所をクリックしてもクリアされてしまいます)
サブフォームはT_月額マスタに連結しているのですが、T_月額マスタにはきちんと保存されておりました。
また、「ごとに請求」ボタンを2回連続で押すと、今度はサブフォームはクリアされず、
サブフォームに追加されている1回目のレコードの下に2回目のレコードが追加されます。
2回目以上だと、不思議なことにサブフォームを触ってもクリアされず編集可能です。
稀にですが、月額が異なっていたり、ひと月だけ税率の違う月が存在するため、
ユーザーがサブフォームのレコードを自由に編集できるようにしておきたいです。
ボタンを押した後、データをそのままサブフォームに保持しておける手段がありましたら
どうか教えていただけませんでしょうか?
直接テーブルとつながってるサブフォームなので、もしかしたらただレコードを表示するための
ユーザーは触れないサブフォームにした方が理想的なのかもしれません…
もし、データベース構造的にふさわしくない等のご意見がありましたら、
お手数をお掛けしますが、併せて教えていただけますと大変ありがたいです。
よろしくお願いいたします🙇♂️
解決済みですが、下記のような方法もあります。ご参考までに。
式1: "," & Nz([ID検索],[社員ID]) & ","
Like "*," & [社員ID] & ",*"
>hiroton様
ある程度で式を分解して確認する、肝に銘じておきます。
>ゲッキョク駐車場様
Nz関数を使って、以下のようにすることで無事解決することができました。
Eval(BuildCriteria("'" & [テーブル1]![社員ID] & "'",10,"*" & Replace(Nz([ID検索]),",","* Or *") & "*"))
どういった関数があるのか、あったとしてそれをどう見つけ当てるかが大事ですね。
色々と経験値を溜めて行ければと思います。
hiroton様、ゲッキョク駐車場様、貴重な情報ありがとうございました!
hirotonさんのが圧倒的に強いので、出しゃばりたくはないのですが、
Null出ちゃう時にとりあえず使うイメージのある「Nz」を使ってみては。
Nzの使い方とかは調べるとたくさん出てきます。
ゲッキョク駐車場様、ありがとうございます!
テキストボックスに何も入力されなかった(NULLの)場合は対象をそのまま表示させればいいということですね。
思いつきもせず目からウロコです!
ただ、、、ご教授いただいた方法でも同じエラーダイアログが表示されてしまいました。
どこか根本的な見落としでもあるのでしょうか・・・。
Replace 関数
Replace([ID検索],",","* Or *")
の部分で[ID検索]
が未入力(Null)ならエラーが発生します。複雑な計算式でエラーが出た場合は、式を分解して内容を確かめる等、原因の究明をしましょう
例えば、抽出用のフィールドを作らず、単に
Replace([ID検索],",","* Or *")
だけのフィールドを作成しますこれだけのクエリでも質問のようなテストを実行すれば同じエラーが表示されるはずです
IIf(IsNull([ID検索]),[テーブル1]![社員名],Eval(BuildCriteria("'" & [テーブル1]![社員ID] & "'",10,"" & Replace([ID検索],","," Or ") & "")))
でどうでしょうか。
条件式ちゃんと見てないのであってるか微妙ですが。
hirotonさん、感動です! やりたかったことが出来てます!! 改めて、いくら自分で本を読んだりネットで調べてもダメだったと痛感しました。教えて頂いたコードを読み解いて勉強してみます。解決できない時はまたご指導ください。取り急ぎご報告まで。
りんごさんへ
アドバイスありがとうございます。
私はド素人ですのでどんなアドバイスでも助かります。
一応、こんな感じで作ってみました。
りんごさんのイメージと違ったらすいません。
現在時刻: Time()
残り時間: (([未完了]/([生産性]10))60)/1440
終了時間: [現在時刻]+[残り時間]
問題点1
残り時間を出すときの人数を今回は10人固定にしてます。
時間で変動できるような式にしたいです。
1時間後の出荷なら1時間後の人数で計算、
2時間後の出荷なら2時間後の人数で計算できるようにしたいです。
具体的な例として、9時~10時が5人で10時~11時が10人とします。
9時スタートで店舗Aの出荷が9時30分に終わるとします。
店舗Bの出荷は9時30分~10時は人数5人で計算して、10時から11時までは10人で計算したいです。
生産性は店舗ごとに変わります。
この計算を例えば9時の時点で最後の店舗までできるようにしたいです。
問題点2
1つまえのレコードの終了時間に残り時間をプラスして終了時間をだしたいです。
今週は実際にアクセスで試せるのが金曜日以降になります。
質問等ありましたら答えることはできます。
ええと、私も素人なので、大きなことは言えないのですが、次のような方針はどうですか?
現在時刻の項目を追加して、日時/日付関数を設定。(更新するたびに、自動入力)
残り時間の項目を追加して、計算式(未完了の値÷生産性の値)を設定する。
終了時間の項目は、計算式(現在時刻の項目+残り時間)を設定、導き出す。
的外れでしたら、ごめんなさい。
りんごさんへ
日本語が分かりにくくてすいません。
現在の時刻から終了時刻を表現できればと思っております。
8時00分スタートで1時間で終わる予定ならば終了時刻は9時00分になります。
進捗状況はリアルタイムで更新していきます。
基本的に予定と同じになることはありません。
あくまでも予想の終了時刻の計算をしたいと思っております。
店舗によって生産性が変わったり、時間によって人数が変わります。
やり方などはおまかせします。
ここでするような質問でなかったら流してください。
終了時刻を導き出すために、現在時刻を関数で表現するには、どうすればいいかという質問ですか?
回答ありがとうございます!返信遅くなり申し訳ありません。
ユニオンクエリにそのようなデメリットがあるとは知りませんでした。
レポートで日計と累計を作成できるのですね。調べてやってみます。
躓いたらまた質問すると思いますが、またよろしくお願いします。
3ヶ月越しで申し訳ありません。うまくいきました!
(念のためお伝えするとご記載いただいた内容につきまして、strFilterとstFilterが混ざっているようです)
大変たすかりました。教えていただき、ありがとうございました。
hatena様
コードのご提示ありがとうございます。
無事解決いたしました。
それと、詳細セクションも複数ページにまたがることがあったりしますか?
ページ跨ぎが発生すると
詳細_Format
もその都度発生するので、data
に薬品名が重複して登録されます。こちらもページ跨ぎの場合はdata
にデータを追加しない様、制御処理を追加しておいたほうがいいかもしれません「txt目次0~3」なら「0,1,2,3」の4段じゃないですか?
印刷時拡張を使って複数ページになるなら目次データの生成処理を初回の1回だけ処理するようにすればいいですね
それと、印刷時拡張かつ段組みとすると、30行ずつ3段目まで振り分けたらまた1段目に戻す必要がありますね
レポートフッター_Format
を次のように変更します別案としてフォームのレコードセットを直接更新する方法も提示しておきます。
Yes/No型フィールドの名前は、chk1, chk2, chk3, chk4 と仮定したコードですので実際のものに変更して使用してください。
hiroton さん、何度も有難うございます。
また、複数ページにまたがる事をお伝えしていませんでした。
薬剤数450-500、3段組みの設定を考えており数ページに及びます。
変更点をご指導頂けますでしょうか?
更新クエリを作成しておいて、フォーム上のコマンドボタンクリックでその更新クエリを実行するようにすればいいでしょう。
更新クエリを実行した後は、フォームの再クエリをすることで更新が反映されます。
hiroton様
使いやすいようフォームでの操作がしたいです。
テーブルのデータを一括で変更するのだから更新クエリを実行すればいいのでは?
ページフッターやtxt目次など、配置した後デフォルトから変更しているプロパティがありますよね?それを提示してください
提示したコードは複数ページにまたがることを想定していないので次のページが出力されるとすると
レポートフッター_Format
が全く同じように動いて全く同じ内容が出力されますコード自体にページを増やす処理はないのでレポート上の設定に問題があると思われます。
txt目次
に印刷時拡張「はい」とか設定されていませんか?上記のとおり、レポートフッターが出力されるたび全く同じページが出力されるので、そのページが次のページを出力するような内容の場合無限ループしてしまいます
hatena様
ご返信、誠にありがとうございます、
カレンダーコントロールを使用する際、上記で頂いた情報を直しても
別のところでエラーが起きると、このモジュールが影響しているのかなと思い、
わからずにおりました、他のエラーは別の次元のことで、カレンダーコントロールと関係ないことがわかりました。
改めてお教え頂いたことで、そうなんだと思え、気持ちが落ち着きました。
お忙しい所、本当に申し訳ありません、大変感謝しております。
貴重なお時間を誠にありがとうございます。
hatena様の益々の御活躍、芯に心からお祈り申し上げます。
hiroton さん、有難うございます。
感激です!! 以下のように修正しました。
薬品名が並び変わっています!!
ただ、ある範囲までの薬剤が繰り返しはきだされていて、300ページ程になっています。
自分で何とかしようと思ったのですが、どこに問題があるのかもわかりません。
レポートフッターにテキストをtxt目次0~3まで作成しています。他に必要な情報はありますでしょうか?
宜しくお願い致します。
Option Compare Database
Option Explicit
Dim data As String
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
data = data & Left(Me!薬品名 & String(12, "・"), 12) & Format(Me.Page, "@@@") & vbCrLf
End Sub
Private Sub レポートフッター_Format(Cancel As Integer, FormatCount As Integer)
Dim arr
Dim s
Const RowCount = 30
Dim CNT As Long
'並び替えのために配列にする
arr = Split(data, vbCrLf)
'配列を並び替え
Call ArrayListSort(arr)
'段組みに振り分ける
CNT = 0
For Each s In arr
Me("txt目次" & CNT \ RowCount) = Me("txt目次" & CNT \ RowCount) & s & vbCrLf
CNT = CNT + 1
If CNT >= 120 Then Exit For 'RowCount * 4
Next
End Sub
Sub ArrayListSort(ary As Variant)
Dim aryList As Object
Dim s
'// .NET FrameworkのArrayListクラスを利用する
Set aryList = CreateObject("System.Collections.ArrayList")
For Each s In ary
Call aryList.Add(s)
Next
Call aryList.Sort
ary = aryList.ToArray
End Sub
コンパイルくらい試すべきでした。すみません
まずは並び替え用の関数の修正
それと、「レポートフッター」でしたね
レポートフッターですよね?
レポート フッターのフォーマット時に[イベント プロシージャ]を設定してください
hiroton さん、有難うございます。感激です! レポートフッターにテキストボックスを作成し、このままコードをコピペしたところコンパイルエラー(型が一致しません)と出た為、Private Sub ページフッターセクション → Private Sub レポートヘッダーセクション とし、プレビューしたところエラーは出ませんが、何もはきだしていない状態です。どこをどうすれば良いのか分からず、とりあえずご報告いたしました。
Me.Page = 0
関係はヘッダーに出力したいとき用のテクニックなので消してしまいましょうフッターに出力するタイミングで並び替えの処理が必要ですね。また、段組みにするのは並び替えの後の必要があるので、
詳細_Format
のタイミングではデータを拾うだけでよさそうです並び替えの方法はいろいろあります。楽そうな方法を公開しているサイトがあったのでそちらから借りてきました。VBAの配列を.NETのArrayListのSortで並べ替え(Excel作業をVBAで効率化さん)
動作確認していないので問題があったら教えてください。
それと、「薬品名」はすべて五十音ですか?「葛根湯」とかあると、漢字はすべてカナの後とかなったりします
>hatena様
御礼の返答が遅くなって申し訳ありません…
Excel VBAではFor文を使用したことがあったのですが、Accessでは未だ使用したことがありませんでしたので、
hatena様のコード、とても参考になりました!何から何までお気遣いいただき本当にありがとうございます!
作成の過程で、行き詰まった際はまたご助言いただけますと非常に有難いです。
この度は貴重なお時間をいただき、本当にありがとうございました!😊
Calendarモジュール内のWinAPI宣言を下記の記事を参考に、64bit対応になるように書き換えてください。
WindowsAPI をOffice64bit版または32bit版のVBAで使うには | hatena chips
https://hatenachips.blog.fc2.com/blog-entry-191.html
すみません送り忘れたので追加送信します、
こちらのリンクなどを参考にさせていただいておりまして、こちらを64bitで今後も使用したいです
画像は私のイメージしていた通りのものです。
メインフォームのコマンドボタンでサブフォームにレコード追加するときのサンプルコードを例示しておきます。
コントロール名等は適当ですので参考程度にして作成してみてください。
ここまで書いてちょっと思ったのは、メインフォームは非連結にせずに、T_契約マスターと連結させた方がいいかも知れませんね。
とりあえず作成してみて、行き詰ったらまた質問してください。
申し訳ありません。画像が反映されませんでしたので連投失礼いたします。
>hatena様
お礼をお伝えするのがすっかり遅くなってしまって申し訳ありません…
再びご回答いただきありがとうございます!
また、画像のアップロードに関しても教えていただき感謝いたします!
(投稿が見づらくて申し訳ありませんでした…)
1対多の情報でしかサブフォームを利用できないと思い込んでいたので、
連結クエリのサブフォームを用いるという方法が思いつけませんでした…
Accessに関しては、数冊テキストを読み、記載してあった演習を2周した程度なのですが、
実践に活かすとなると難しいです…(サブフォームに関して何度も触れたはずなのに)
ただ、hatna様のおかげで今後の方向性が固まりました!
道のりは遠そうですが、頑張ってみます!
教えていただいた方法でパワポを作り直してみたのですが、もしhatena様の意図と
相違がありましたら、お手数をお掛けしますがご指摘いしていただけますと幸いです。
Excel VBAなどで困ったことがある場合はネットでよく調べ物をするのですが、
実は、度々hatena様をお見掛けしたことがありましたので、今回お話できて光栄でした。
困っています さん
このスレッドの質問者さんとは別人ですよね。
内容も別質問になってますので、新規に質問しなおしてください。
下記のリンクから新規質問できます。
新規質問
また、そのとき、参考にしたサンプルのURLも提示してください。
access2016を使用しています。
Hatenaさんのサンプルを利用させてもらっています。
10行固定行で、詳細があり、ヘッダーにサンプル通り、フォーマットや固定文書を画像で設定しました。
クエリーで検索してグループ化を得意先で行っています。
テストのため、1つのグループを20データ作成して
合計2つのグループを作成しています。
印刷プレビューで、確認していますが、ページの文末まで詳細データが表示されるため詳細に改ページ制御を10行で行っています。
得意先が変わる3ページ目の印刷の上部10cm位が黒くなり得意先名が表示できません。
得意先コードヘッダーが臭いと思っているのですが、原因が掴めません。
教えて下さい
お世話になっております。無事組み込めました。
調整作業に入りたいと思います。
丁寧で分かりやすい対応、本当にありがとうございました。
T_顧客マスタ の方はサブフォームではなくてリストボックスにしてもいいでしょう。
ユーザーはリストボックスで顧客を選択することができます。