Sub setRightMargin(ctl As Control)
Const checkCharacter = "一" 'テキスト幅調査用の例字
Dim txtW As Long 'テキスト幅
Dim txtboxW As Long 'テキストボックス幅
With ctl
Me.FontName = .FontName
Me.FontSize = .FontSize
txtboxW = .Width
txtW = Me.TextWidth(checkCharacter)
.RightMargin = (txtboxW - txtW) / 2
End With
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
'中略
Dim i As Long
For i = 1 to 10
Call setRightMargin(Me.Controls("住所" & i))
Call setRightMargin(Me.Controls("会社" & i))
Next
'後略
End Sub
hatenaさんありがとうございました。普通の条件付き書式のことだったのですね。それにNull条件式を入れた場合、書式には何を記述したらいいのでしょか? 条件付き書式には色変える等しかしたことがないので・・・制御的な事ができるのでしょうか?
ACCESS2003ですか。今から20年前のバージョンですね。
そんな昔のことは記憶にないですが、下記によると条件付き書式は2000から実装されているようですね。
条件付き書式を設定したい:Access(アクセス)の使い方
インタフェースは当時からかなり変わっているので見た目は提示したスクショとはかなり異なると思いますが、使えるのではないでしょうか。
hirotonさんコードの記載ありがとうございます。
顧客毎に締め日、支払条件が異なる。例えばA社は末締めの約月末払い、B社は20日締めの翌々10日払い、C社は15日締めの翌月25日支払等・・・このパターンが今のところ締め日7ヶ、支払条件が20ヶ程あるのです。日々の入力は売上日付、顧客名(ID)、金額等で、そこから自動的に締め・支払期日(条件の基づき)を算出してます。それでSwitch条件分岐にしてます。生のデータにするにはどうなるのでしょうか?(IIfでも大分長くなりそうで・・・)
色々返信ありがとうございます。情報不足でしたね(すみません)。
イベントは Private Sub 摘要_GotFocus()に記述してます。サブフォームにはいくつかのコントロールがあり、その中で適用等(それはNullでもいいのですが)を入力する前に他の必要な項目を入力して欲しいのでこう記述してます。必須項目(いくつかあり)がNullで、この適用等が入力され保存されるのを防ぐ為です(その注意喚起はMsgBoxで)。
どうもメインフォームに入力後、サブフォームに映るときに時々ですが最初に投稿した現象がでます。それが不思議で・・・
古い簡易な社内だけの自作システムを使っている為、未だACCESS2003なので それにはhatenaさんの提案分(新しい書式ルール)の機能はないのですよね?
そのコードをどのイベントに記述しているかを提示してください。
Private Sub
からEnd Sub
までをすべてコピーして貼り付けてもらった方が間違いないですね。「入力してほしくないならそもそも入力できないようにしたほうが楽ですよ」というアドバイスは私も同意です。
条件付き書式を使うとVBAも使う必要はありません。
式を選択して、条件式を入力
プレビューの右の一番右のボタン(有効化)をクリックする
画像の設定だと、[A]と[B]が未入力なら使用不可になります。
引数で渡せばいいでしょう。
使い方として、例えば、
住所1、住所2・・・住所10
社名1、社名2・・・社名10
というテキストボックスがあったとして、
下記のような感じです。
カレンダーは決まったルールでしか動かないので、わざわざパターンの登録から処理を分岐させず、生のデータを使うようにすれば冗長な条件分岐を避けることができます
例えば
実際に動いてほしくないコードが動くのはどこのコード?
入力してほしくないならそもそも入力できないようにしたほうが楽ですよ
使用可能(
Enabled
)プロパティで制御できます「最後に求める処理」の規模によります
「件数」を求めること自体はSQL(または定義域集合関数(
DCount
))で出来るので、その値さえわかれば単純なクエリに落とし込める、ということであれば単一のクエリにすることもできるでしょう使えるならVBAを入れたほうがいろいろと捗ると思います
1件だったらこの処理。2件以上だったらこの処理、みたいな分け方をしたいのです。それはsqlではなくて、vbaの中でsolを書いてif分を付ける みたいな流れであっていますか?
すみません確かにクエリーだけ開示しても意味不明となりますね。その後、同じ内容で新たなフォームを作成して試してみました。そしてFilter実行すると”クエリーが複雑すぎる”のエラーとなりました。それでそのクエリを基にテーブル作成して、それをフォームの基にすると動作は正常となりました。やはりクエリーへの記述等が多すぎて(IIF・Switchを多用)ごちゃごちゃになったのが原因の様です。売上日付から締め日・支払期日をだすのはSwitch条件でDateSeria関数でするしか思いつかないので厄介なところです・・・
こちらお答え頂きたいです、自身のコードではどう変えても構文エラーがでてしまいます!
問題なく動いているクエリだけ表示されてもみんなお手上げじゃないですかね
データの作り方は悩ましいところですが、「締日」や「支払日」なんかの日付のデータはそのままずばり日付で扱ったほうがすっきりしますよ(末日の処理に工夫が必要ですが)
更新クエリを使うと良いでしょう
更新クエリを作成して実行する
Google検索
SQL(構文)を見たいのであれば、クエリデザインで作成ののち、SQLビューに切り替えるのが簡単です
確かにクエリーはごちゃごちゃ過ぎますね。顧客毎の締め日は7パターン程で支払条件は20パターン程あり、それを売上日付からSwitch条件でDateSeriaで締め日と回収期日をわりだしているためごちゃごちゃとなってます。それしか思いつかなかったもので。
*全然わからないことはフォームで期日の年や年月でフィルターしたときに実行時エラー2766がでて、他のフォームで非連結にしているコントロールが存在しないとなることです。それとは全く関係してないのに・・・それが全く理解できずにおります。
実行時エラーを解決して、なんだかんだで希望通りに動く完成品まで漕ぎ着けたとしても、蓋を開けてみればスパゲティクエリじゃ駄目です。設計が杜撰だからデスマーチが始まって、頑張れば頑張るほどぐちゃぐちゃになっている場合、設計からやり直すしかないです。
締日と請求日はもう少しテーブルに落とし込まないと。
完全に解決しました。
私のレベルでは途方に暮れて、またパソコンを買うところでした。
ありがとうございました。
ありがとうございます。
しかし、Hatenaさんは本当にすごいですね。
以前も問題解決していただきましたが、恐れ入ります。
これから試してみます。結果は後日報告します。
レジストリを変更するのはPCを変えたりしたときとか、その都度設定するしなければないらないので、
共有ロック数の制限を超える前にコミットするよう処理を追加すればいいでしょう。
ファイルの共有ロック数が制限を超えています (Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。(#-2147217887) - Excel と Access を連携する方法
とか、
Access 実行時エラー 3052 ”ファイルの共有ロック数が制限を超えています” ”解決方法 | ちびrobo
をご参考に。
私の下記でも同様の処理を追加しています。
グループ毎連番を自動入力する関数 - hatena chips
エラーは「.Edit」ででます。
スタンドアロンで使用していますので不要な制限はできるだけ除きたいです。
横罫線は、最初のリンク先の方法で。
余白に応じて行数指定無く用紙の最後まで罫線を出力する - hatena chips
縦罫線と外枠は、ページフォーマット時にVBAでLineメソッドで引けばいいのでは。
質問のコードから横罫線部分を削除すればいいと思います。
ちょっとうまく理解できないのですが、「すでにある売上から請求書を作るとき」という部分だけで判断します。
つまり「すでにある売上を引用して請求書を作るときはどうするか?」ということかなと。
「請求作成用のフォーム」の画面に、「売上内容引用ボタン」などを設置し、クリックしたら別のダイアログで売上テーブルの一覧を表示すればよいのではないでしょうか。
そこで選択したテーブルの内容を「請求作成用のフォーム」の入力部分にそれぞれ反映すれば良いかなと思います。
単に
50/12
と同じ結果では?(int(intMonth/12)+(intMonth mod 12)/12
この分割に意味はないのでは?)datediffは、
m
(月指定)は1日(ついたち)を跨ぐとカウントするという仕様がありますたとえば、9月1日入社の9月27日(27日間)は0年ですが、9月20日入社の10月1日(12日間)は0.0833年になります
このような算出方法に問題がなければそれでいいと思います
よく「VBAを使わないで」と話題になるのでリンクを出してますが、VBAで罫線を引くのは質問時点でVBAでやっていますよね?
わざわざ詳細セクションでセクションごとに引く必要はなく、質問のコードの「外枠」部分でやっていることで十分じゃないですか?
hirotonさま>
ありがとうございます。
実は詳細セクションの太くしたい縦線を指定してみたのですがうまくいかなくて…
hatenaさんのこんなやり方もあるんですね。
教えて下さりありがとうございます。
今のやり方とあまりにも違うのですが状況によってはこちらも検討してみます。
hatenaさま>
ありがとうございます。
画像(説明付き)を添付しました。
イメージ伝わりますでしょうか?(説明が上手くなくすみません)
よろしくお願い申し上げます。
「違うセクションで固定で表」のセクションとはページフッターセクションのことですか。
あと言葉だけではイメージしづらいので、ご希望のレイアウトイメージを画像でアップしてもらえませんか。
縦線だけ別に引いちゃえばいいんじゃないですかね
VBAの
Me.Line
でもレコードがない場合も用紙の最後まで罫線を出力する(hatena chipsさん)
でも
リンク先の方法とhttps://zawazawa.jp/ms-access/topic/728で新しく作成をし直しています。
https://zawazawa.jp/ms-access/topic/728
の方の様に周りを2ポイントの実線で囲みたいと思っているのですが、
上の線はグループヘッダーの横線(サンプルだと直線12)を2ポイント実線に
下の線は上記でhatena様が提示された方法で太線にすることが出来ました。
こちらの方は左右の外枠縦線を太線に出来たと仰っていたのですがどう頑張っても出来ないで作業が止まっています…(ダミーの空白行の外枠は太線に出来ました)
外枠の左右の縦線を太線にする場合はどこを変更すればよいのでしょうか?
もう一つ
サンプルでは罫線を引きたいエリアに対して均等に罫線を引くわけではなく、
レコード量が多く1ページに収まらない場合に
・詳細セクションの通常(1行分)の高さ
・メモ欄の内容が多かった場合(=印刷時拡張された場合)の高さ
で行を連ねて、レコードが入るところまでいき、下部の余りが次の行の高さに満たなかったら、下部に余白があっても次のページに進んでいます。
実は罫線を引きたいエリアの下部が余白ではなく違うセクションで固定で表があるため、このままだと下部の表と罫線を引きたい可変エリアの間に隙間ができてしまうため、
どうにかして形の良いおさまりを探しています。
今考えているのは
①可変エリアの下辺に合わせて固定部分の位置をずらす
②(できたら)可変エリアを印刷時拡張にするけれど、詳細セクションの倍数で拡張して可変エリアのエリア高さを固定にする(ページによって10行の場合もあれば途中でメモ量が多く1行に収まらない行がある場合は9,8,…と可変する)
なのですが
そもそもこれらはACCESSでの作成が可能なのでしょうか?(①は出来そうな気もしますが②は難しそうなのかしら…)
どんどんと話がずれてきてしまいすみません。
どうぞよろしくお願いいたします。
レポートのイベントを使った処理は、イベントの発生メカニズムの理解が必須になります。
まずは、下記のページを読まれて、概要でもいいので理解しておくといいでしょう。
レポートのイベントの発生メカニズムの研究 - hatena chips
レポートのイベントの発生メカニズムの研究 その2 - hatena chips
ページフォーマット時で罫線を引くのが難しい理由は、
ページフォーマットはページ内のイベント(各セクションのフォーマット時,印刷時など)がすべて終了してから最後に発生します。
行数、行高が固定なら、For Nextループで繰り返せば簡単に罫線を引くことができますが、
行数、行高が可変の場内は、やろうと思えばできないことはないですが、複雑になります。
具体的には、各セクションの印刷時で、各セクションの高さを配列なり、Dictionaryなどに格納しておいて、ページフォーマット時でそれを参照して罫線を引くというコードを書くことになります。
それをするぐらいなら、各セクションの印刷時イベントで罫線を引いた方がシンプルです。
請求書確認フォームを別に作ればいいじゃない?
フラグ0のフォームが、請求予定・未請求・請求待ちみたいなもの。フラグ1のフォームが請求実績・請求済・入金待ちみたいなもの。
hatena様
お返事ありがとうございます。
>提示のページフォーマット時(Report_Page)で罫線を引く方法では、行の高さが可変の場合は、むずかしいと思います。
やはりそうなんですね。
リンク先の方法で頑張ってみます。
すぐに取り掛かれないかもしれないので時間がかかるかもしれませんが必ず報告に上がります。
ありがとうございました。
提示のページフォーマット時(Report_Page)で罫線を引く方法では、行の高さが可変の場合は、むずかしいと思います。
下記のリンク先の方法ではだめなんですか。こちらの方がはるかにシンプルに実装できます。
余白に応じて行数指定無く用紙の最後まで罫線を出力する - hatena chips
hatenaさん、ありがとうございます。
対応策までご提示いただき痛み入ります。
仕様のようですね。
出力した後、ファイルをリネームすることになるでしょう。
状況や運用次第ですね。
商品マスターと売上履歴というテーブルにおける価格について考えると、
厳密に設計するなら、
上記以外に、価格変更履歴テーブルを作成して、
売上履歴の日付を元に、価格変更履歴の該当する価格を表示する設計にします。
ただ、その商品が頻繁に価格が変更されるものなら、管理や設計が大変になります。
その場合は、
商品マスターには現在の価格を格納、
売上履歴には、商品ID と 売上時の価格を格納、
でもいいと思います。
売上時の価格 は売上フォームで入力するときに、VBAでマスターの価格を代入するようにします。
取引先マスタの場合で、社名や住所は、そんなんに頻繁に変更されるものではないので、
社名変更履歴や住所変更履歴のテーブルを作成してもいいかもしれません。
例えば、過去の売上伝票を再発行する場合、価格が変わってしまっていては、問題ですが、
社名や住所は現在のものが表示されていても問題ない、逆に現在のものが表示されていた方がいいという考え方もあると思います。
用途や運用次第でしょうね。
例えば、マイナンバーは、一人1個で、死ぬまで変わらない、ということが保証されているので、主キーにしてもいいかもしれません。顧客番号も、一人1個で一度発行したら、絶対変更しない、ということが保証されているなら、主キーにしてもいいでしょう。
自動採番(あるいはオートナンバー型)したものを顧客番号にしてそれを主キーにするということです。
(連番にするか、ランダムな番号にするかは、状況で選択すればいいでしょう、オートナンバー型もランダムの設定があります)
ただ、自動採番されたものは意味がないのですが、それでは、人間が管理しづらい、何らかの情報を持たせたい(意味を持たせたい)ということなら、顧客番号は主キーにせずに、別に主キーフィールドを追加すべきだと思います。
こうする必要があるのなら、主キーは別に設けるべきでしょう。
ただ、その必要性はそれほどあると思いえません。
私が今まで設計したものは、オートナンバーを顧客番号にして主キーにしてますね。その方が設計が楽なので。
売上番号、請求書番号もオートナンバーで主キーにしてますね。
単なる数字にしておけば、顧客がみてもそれに意味があるとは考えないでしょうし、
顧客名や日付は伝票自体にデータとしては持たせるので、それを主キーに入れる必要性はないと思いますので。
ありがとうございます、そちらはできました!
仮にWith文の中身をSubで記述する場合、どのように書けばよいか知りたいです。
下記のような感じです。
第2引数は初期フォントサイズです。このフォントサイズで収まらないときに収まるようにフォントサイズを縮小します。
第3引数は下記のように指定します。
関数自体の機能で実現できたのですね、縦書きテキストボックスだったので使えないかと思い、記述から削除しておりました。
後学の為に、質問文通りの内容を実現するとすれば、どのような記述になりますでしょうか??
Subにまとめる方法で記述を試してみたのですが、色々とエラーが出てしまいます。