Public Sub SetSchedule()
Dim i As Integer, rs As DAO.Recordset
For i = 1 To 42
Me("T" & i).Caption = ""
Next
Set rs = CurrentDb.OpenRecordset( _
"SELECT 開始時間, 作業日, 略名 FROM Q作業日一覧カレンダー表示用 WHERE " &
"作業日>#" & FirstDay & "# AND 作業日<=#" & FirstDay + 42 & "#",
dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
With Me("T" & rs!作業日 - FirstDay)
.Caption = .Caption & rs!開始時間 & " " & rs!略名 & vbCrLf
End With
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
End Sub
例えばあとから間違いに気が付きレコードをいじったときに
相手からの要望などで過去の請求書(間違ったままの状態のもの)を発行できなくなりませんか?
EXCELの現状では請求書の分は間違ったままになるので
再発行しても当時と同じものがだせます
hirotonさん、ご指摘ありがとうございます。
そのようですね。回答修正しておきます。
詳細はレポートだとセクション名で予約されてるから[詳細]コントロールは作れないんですよね
[テキスト2]とか自動で付けられる名前になってるんじゃないかと思います
レポートで出力時のレイアウトの話でしょうか。
以下、レポートでの話として回答します。
商品名用のテキストボックスを2つ配置して、一つは横幅を詳細にも重なるように広げたものにします。
もう一つは、詳細には重ならないような幅にします。
それぞれのテキストボックス名を「商品1」「商品2」とします。
プロパティを下記のように設定します。
また、「詳細」フィールドと連結しているテキストボックス名を「詳細1」とします。
商品1
コントロールソース =IIf([詳細1] <> "", "", [商品])
印刷時拡張 いいえ
商品2
コントロールソース =IIf([詳細1] <> "", [商品], "")
印刷時拡張 はい
以上でご希望のレイアウトになります。
おおよそ思われている通りです。リレーションで調べてみてください。
ACCESS(データベース)では、データそのものはテーブルに保存、データに対する操作(追加、修正、閲覧)はフォーム(専用の画面)を作成して行います。
フォームでは必要な情報のみを表示し、その情報の修正可否も個別に設定できるので、Excelのようにデータが誰でも自由に触れる状態よりもはるかに安全な仕組みを作れますし、必要ならログを取ることもできるでしょう。
正直Excelの何をそんなに信用しているのか疑問ですが、ACCESSを導入するとなれば管理者(技術者)も必要ですし、使う側への教育も必要でしょうから費用対効果を考えてみては?
定義域集計関数で調べてみてください
ex.
このデータが入っているフィールド名は何でしょうか。
また、どこを赤文字で表示するのでしょうか。
空欄なら、文字自体がないのですが。
下記のページも参考になると思いますのでよろしかったらご参照ください。
グループ化して両面印刷するときに、グループ毎に分けて出力したい - hatena chips
こちらは、グループ毎のページ数を表示させることが可能です。
下記ページにより自己解決しました。
お騒がせしました。
https://www.accessdbstudy.net/entry/20080723/p1
いつもお世話になります。
スケジュール内容が未確定の場合は、赤文字で表示したいと思っています。
短いテキストで 未確定の場合⇒空欄,確定の場合⇒確定 と作成しています。
カレンダーに「確定」の文字を表示する必要はないのですが、文字色を分けて 確定・未確定の判断をしたいと思っています。
どのように記述すれば、表示することができるのでしょうか…
よろしくお願いします。
Public Sub SetSchedule()
Dim i As Integer, rs As DAO.Recordset
For i = 1 To 42
Me("T" & i).Caption = ""
Next
Set rs = CurrentDb.OpenRecordset( _
"SELECT 開始時間, 作業日, 略名 FROM Q作業日一覧カレンダー表示用 WHERE " &
"作業日>#" & FirstDay & "# AND 作業日<=#" & FirstDay + 42 & "#",
dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
With Me("T" & rs!作業日 - FirstDay)
.Caption = .Caption & rs!開始時間 & " " & rs!略名 & vbCrLf
End With
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
End Sub
ご助言頂きましてありがとうございます。
定期的なバックアップ、承知しました。
ありがとうございました!
はい、別ファイルですので、影響はないです。
アクセスファイルは運用中に破損する場合がありますので、定期的にバックアップ(コピー)を取っておいた方がいいです。
お返事ありがとうございます。
つまり、コピーしたアクセスから、直接入力してある過去実績データテーブルを消去しても、オリジナルのアクセスへの影響はないという理解で合ってますでしょうか。
宜しくお願い致します。
アクセスファイル内のテーブルのデータを削除するということなら、他のファイルへの影響はありません。
お返事ありがとうございます。私の説明不足で申し訳けありません。
蓄積している営業データはアクセスのテーブルに直接入っているのですが、そのデータと結びつける他のデータ(エクセル)が私のデスクトップにリンクしています。エクセルファイルはクエリの為に使っています。
エクセルファイルとリンクしているなら、データはAccessファイルではなく、エクセルファイルの方ににあるので、Accessファイルをコピーして過去データを消去するというのは矛盾してます。
エクセルファイルをコピーして、過去データを削除して、テーブルのリンク先をコピーしたエクセルファイルに切り替えるという操作になるはずです。
ご助言ありがとうございます!
リンクテーブルとは、アクセスとアクセス同士のことでしょうか?
オリジナルのアクセスの中で、自分のデスクトップにあるエクセルファイルとリンクしておりますが、この場合は大丈夫でしょうか?
下記のように、別のエクセルファイルにリンクを繋ぎ直せば大丈夫でしょうか?
オリジナルアクセス−ファイルA
アクセス(コピー)−ファイルB(Aをコピー)
宜しくお願い致します。
リンクテーブルを使っていないなら大丈夫です。
長々と回答を考えていたら解決のレスが・・・
VBAコードの一例を載せておきます。
フォーム自身を更新せずに所属や役職のコントールをそれぞれ更新すればスクロールは発生しません。
フォーマットについてはVBAでも変わりませんね。
資料の有無でいえば圧倒的なのはそうですねぇ。
マクロだからeasyというよりは簡易機能ならマクロでもできるって感じですね。
(2)を使って解決しました。
SetTempVar
Name CurrentRecordNo
= [Forms]![Frm_Name].[CurrentRecord]
Requery
GoToRecord
Record GoTo
Offset =[TempVars]![CurrentRecordNo]
(2)を使って解決しました。
SetTempVar
Nme
アドバイスありがとうございます。
初心者なので、間違った語句の使い方等はご容赦を。
ご指摘のとおり
テーブル: メインテーブル、所属テーブル、役職テーブル
フォーム:メインフォーム、所属追加フォーム、役職追加フォーム
の構成です。
メインフォーム中の、所属と役職を選択するコンボボックスがそれぞれ5個あり、それぞれ所属テーブルと役職テーブルを参照する形(Lookup)にしてあります。
メインフォームから、所属追加フォームと役職追加フォームを呼び出して、所属や役職を追加し、その追加修正をメインフォームの合計10個の所属・役職コンボボックスに即時かつ自動的に反映させたいのです。
所属追加フォームや役職追加フォームには、「レコードセーブボタン」、「フォームを閉じるボタン」を配してあります。アドバイス頂いたように、この2つのボタンのon-clickイベントマクロにRequery(コントロールなし)で追加するのですが、全くメインフォームには反映されない、あるいは1つのコンボボックスだけ反映されるなど、不思議な挙動をします。
この他にAfter UpdateイベントマクロにRequery(このトロールなし)を加えても同じ。追加フォーム上に「Requeryボタン」を作ってon-clickイベントでRequeryをさせても、全く同じ挙動。VBAコードとしてon-clikイベントでMe.Requeryなども試しましたが反映されず。
唯一、所属追加フォームや役職追加フォームの変更を反映させることができる動作は
(1)メインフォームにおいて、Shift-F9
(2)メインフォームにおいてRequeryを行う。
この他、Relationshipで連鎖更新もONにしてあるのですが、Joinタイプを変えるとか、私の思いつく範囲でいろいろ試してみたのですが、私の知識・経験では(1)(2)でしか実現できません。
しかし、この(1)(2)を行うと、現在入力しているレコードから、一番先頭のレコードに飛びます。User Unfriendlyも甚だしいので、なんとか、Macroを使ってCurrentRecord番号をゲットして、Requery後にGoToRecordで元のレコードに飛ばそうと思っているのですが、マクロでCurrentRecordのゲットの書式が分かりません。。。。
マクロだからeasyかと思いましたが、VBAとは違って、[TempVars]![MyVal]のフォーマットだし、かといってMacroの書式について初心者向けの資料もないし。。。。
どうしてこんな簡単なことが、ここまで難しいのか。。。。
やっぱりAccessは使うべきではないなと-と感じています。FileMakerにしておけば良かった。でも関係者にFileMakerを買わせる負担を掛ける訳にもいかず。。。。
Accessのフォーラムにこんなこと書くのは失礼かもしれませんが、Accessって基本思想自体が間違っていると感じます。
アドバイスありがとうございます。
初心者なので、間違った語句の使い方はご容赦を。
ご指摘のとおり
テーブル: メインテーブル、所属テーブル、役職テーブル
フォーム:メインフォーム、所属追加フォーム、役職追加フォーム
の
作業手順がよくわかりません。
「Requeryマクロ」とはリボンの[作成]タブにある[マクロ]メニューから作成したマクロですか?
イベントとは、ユーザーの操作に対応して発生・実行されるものです。
と、Requeryボタンのクリック時イベントが発生します。
今回やりたいことは「サブテーブルを更新後に何かしたい」なので、「サブテーブルを更新したと判断できる作業」のイベントにマクロを設定する必要があります。
操作中のフォーム「サブフォームのイベントにマクロを設定する」と良いでしょう。
具体的にはサブフォームの更新後処理が「”自動的に”かつ”すぐに”」に合うかと思います。
”すぐに”を本当に「すぐに」にしたいのであればサブフォーム上の個別のコントロール(所属や役職)それぞれの更新後処理イベントを使うという方法もあります。
逆に、サブフォームで作業したあと、メインフォームで作業する前にサブフォームは閉じるという手順があるのであれば、サブフォームの閉じる時イベントでもいいのではないかと思います。
「サブフォーム」という言葉はACCESSではあるフォームの中に組み込まれたコントロールとしてのフォームを指す言葉として使われます。
誤解を招きやすいので「入力用フォーム」としたり、あるいは「AフォームとBフォームを作ってAフォームからBフォームを呼び出しています」等の前置きから質問すると良いです。
ACCESSはクエリの作成においてSQLの直接入力にも対応しています。
リボンや右クリックのポップアップメニューからSQLビューとデザインビューを相互に切り替えられるので、q_売上情報クエリのSQLをコピーして質問されるとより良い回答が得られると思います。(場合によっては売上情報テーブルの構造も)
特定のフィールドの値を条件に部分的な集計をしたい場合、集計用のフィールドを用意して、そのフィールドで集計したいフィールドだけを抽出する条件を指定するとできます。
たとえば、①テキスト用なら
のようなフィールドを作り、クエリの集計機能を有効にし、集計の項目で合計を設定すると良いでしょう。
いつもありがとうございます。
反映させることができました。
入力フォームでの更新がF_Calendarに反映されないので、反映させたいということですね。
下記のように1行追加してみてください。
【カレンダー形式のスケジュール管理 その3】
詳細データ表示用をサブフォームではなく、サブレポートを利用しています。
サブレポート内のテキストボックスをクリックし、入力フォーム(F_入力フォーム)を開き、スケジュールの詳細を入力しています。
入力フォームに作成している「保存ボタン」をクリックするときにサブレポートもリクエリしています。(サブレポートに表示に反映させている)
'保存ボタンクリック時
Private Sub cmd保存_Click()
BeforeUpdate = ""
DoCmd.RunCommand acCmdSaveRecord
BeforeUpdate = "[イベント プロシージャ]"
Forms![F_Calendar]![R_作業日一覧_カレンダー表示用].Report.Requery
End Sub
===============
F_Calendar への反映で困っています。
カレンダー形式のスケジュール管理 その3
サブフォームで更新や追加、削除したときにカレンダーにその結果を反映させるためにサブフォームのフォームモジュールに下記のイベントプロシージャを作成します。SetScheduleをPublic宣言したのはサブフォームから呼び出す必要があったためでした。
'フォーム 更新後処理
Private Sub Form_AfterUpdate()
Me.Parent.SetSchedule
End Sub
'フォーム 削除後確認
Private Sub Form_AfterDelConfirm(Status As Integer)
If Status = acDeleteOK Then Me.Parent.SetSchedule
End Sub
=====
サブフォームではなく、サブレポートの為、上記のままではダメだと思い、色々と手を尽くしていますが、
うまくいきません。
入力フォームの「保存」ボタンをクリックしたときに、F_Calendar にも反映させたいのです。
入力フォームからサブレポートを反映させ、サブレポートからF_Calendarを反映させるでも良いのですが…
度々で申し訳ございません。ご教授いただけませんでしょうか。
時間表示、サブレポートの件、解決しました。
以前、説明されている記事を拝見せずに、質問してすみませんでした。
ありがとうございました。
エクセルは、画面での表示と印刷の表示は一致しないというのが常識らしいです。
【Excel】画面表示の通りに印刷できないのは「速度優先」だからです - わえなび ワード&エクセル問題集
私の古いブログですかいろいろな方法を紹介していますので、ご参考に。
レコードがない場合も用紙の最後まで罫線を出力する - hatena chips
レコードがない場合も用紙の最後まで罫線を出力する関数 - hatena chips
レコードがない場合も用紙の最後まで罫線を出力する NextRecord版 - hatena chips
ページの最後の罫線を太線にする - hatena chips
案件によりますね。
実際に印刷して定規で測ってきっちり調整することもあります。
回答ありがとうございます
目分量や数値をみながらやるしかないんですね
フィールドの文字はきっちり真ん中に表示されるわけではないみたいなので微妙にズレてしまいますね
プロパティの余白で調整するようですね
私が見た目にこだわりすぎなのがいけないんでしょうけど
みなさんもっとアバウトに配置されているんですか?
はい
「請求書」みたいなレイアウトのものを印刷したいです
請求書により、レコード数が多かったり少なかったりするので
固定の位置に最後の太い線を配置したいです
レコードごとに仕切り線を配置しておくと、最後は、仕切り線と太い線、二本になるのが少し気になります
ACCESSでは調整がむずかしそうですが理想はエクセルで例えば20行固定にしたときのようにぴっちり収まるといいです
レコードのフィールドのフォントサイズと高さによってはヘッダーとの間に他の行より隙間があいてしまったりつまったりしそうです
呈示の画面はAccessではないようですが、具体的にはどのような質問でしょうか。
呈示のような書類をAccessのレポートで作成したいという質問でしょうか。
上下位置の自動調整の機能はないので、プレビュー画面で拡大表示して位置を確認しながら、上位置か上余白で調整するしかないのでは。
ヘッダーの下線は、ヘッダーセクションの高さを少し高めにしておいて、ラベルにかからないように直線コントロールを配置してから、セクションの高さをマウスでドラッグして小さくすればどうでしょうか。
codeフィールドはテキスト型ですので、SQLは下記のようにしてください。
これでエラーに出なくなると思います。
ただし、これだけでは連番になりません。一意に決まるフィールドが必要になります。
下記を参照してください。
DCountでする方法、
サブクエリを使う方法、
VBAで入力する方法、
汎用関数を使う方法
を紹介しています。
グループ毎連番を自動入力する関数 - hatena chips
汎用関数を使う方法がコピーするだけで簡単に使用できますのでお勧めです。処理も高速です。
埋め込みマクロで設定しているということでしょうか。
where条件式 は下記のようにしてください。
[ID]=[Forms]![フォーム名]![サブレポートコントロール名].[Report]![ID]
詳細は下記をご参考に。
サブフォームとサブフォームコントロールの違いとは? - hatena chips
サブフォームコントロールで説明してますか、サブレポートコントロールでも同じです。
を下記に変更してください。
フォームを分けてもいいのですが、一つのフォームで開く時にVBAでプロパティを変更するという方法だと、変更があったとき一つのフォームの修正で済みますので楽です。
例えば、フォームのプロパティは、更新用に設定しておいて、
更新用として呼び出すときは、
追加用として呼び出すときは、
という感じでOKです。
1.取引先毎に担当を決めておき、データ更新、追加はその担当が行うという運用です。
担当以外のデータは閲覧のみにします。
・これについては仕事の関係上、担当者以外が各レコードの編集を行うことはしていません。そもそもの設定から担当者はイジれないような設定にしたほうがいいのでしょうか?
2.フォームは共通でもいいのですが、フォームのプロパティの設計を下記のように変更します。
更新用フォーム
データ入力用 いいえ
更新の許可 はい
追加の許可 いいえ
削除の許可 いいえ
レコードロック 編集済みレコード
追加用フォーム
データ入力用 はい
更新の許可 はい
追加の許可 はい
削除の許可 はい
レコードロック 編集済みレコード
一覧表示の閲覧は、リストボックスに表示させるか、
帳票フォームで「レコードセット」を「スナップショット」にしておきます。
・レコードを新たに作成する用と既存のレコードを編集する用にわけるという理解をしましたが、合ってますでしょうか?