Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cn = CurrentProject.Connection
rs.CursorLocation = adUseClient
rs.Open "tbl残業管理", cn, adOpenKeyset, adLockOptimistic
rs.Sort = "日付 ASC, 担当者ID ASC, 残業区分 ASC"
rs.MoveFirst
Do Until rs.EOF
If rs!残業区分 = 1 Then
If DCount("休日", "tbl休日", "休日 = #" & rs!日付 & "#") > 0 Then
rs!残業区分 = 3
rs.Update
End If
ElseIf rs!残業区分 = 2 Then
If DCount("休日", "tbl休日", "休日 = #" & rs!日付 & "#") > 0 Then
rs!残業区分 = 4
rs.Update
End If
End If
rs.MoveNext
Loop
rs.Sort = ""
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
Private Sub cmd車庫証明Open_Click()
If Nz(Me.cmb普軽) = "" Then
MsgBox "「普通車」または「軽自動車」を選択してください。"
Exit Sub
End If
DoCmd.OpenForm "F車庫証明"
With Forms!F車庫証明
Select Case Me.cmb普軽.Value
Case "普通車"
.普通車.Visible = True
.普通車.SetFocus
.軽自動車.Visible = False
Case "軽自動車"
.軽自動車.Visible = True
.軽自動車.SetFocus
.普通車.Visible = False
End Select
End With
End Sub
Private Sub cmd車庫証明Open_Click()
If Nz(Me.cmb普軽) = "" Then
MsgBox "「普通車」または「軽自動車」を選択してください。"
Exit Sub
End If
DoCmd.OpenForm "F車庫証明"
With Forms!F車庫証明
Select Case Me.cmb普軽.Vlue
Case "普通車"
.普通車.Visible = True
.軽自動車.Visible = False
Case "軽自動車"
.普通車.Visible = False
.軽自動車.Visible = True
End Select
End With
End Sub
hatena様
試してみました。
うまく動きました。本当にありがとうございました。
hatena様
早速のご回答ありがとうございます。
50音選択ボタン(オプションボタン)の設計は下記にサンプルがあります。
オプショングループで50音選択 - hatena chips
オプショングループで50音選択 改良版 - hatena chips
オプショングループで50音選択 高速版 - hatena chips
これらはフォームのFilterに条件を設定して絞り込むサンプルですが、
これをコンボボックスの値集合ソースを書き換えるように書き換えればいいでしょう。
りんご様
ありがとうございました。参考サイトで出来ました☺
hiroton様
わざわざご返信いただきましてありがとうございました
この方式を試したのですが各ボックスに書式設定をしても
表示上はその見え方をするのですが データは**//**が残ってしまい
上手く扱えなかったです
いろいろご教授頂きましてありがとうございます
また何かありましたらよろしくお願いいたします
りんご様
お返事ありがとうございます。
PDFを単体で開く場合、自動的に希望の倍率で表示されました。
りんご様の質問に対してはYESです。
自分が混乱しておりました。誠にありがとうございました。
タイトルにあるけど本当に「カレンダーコント―ロール11.0」?
とっくに廃れて解説も見つからないようなコントロールだけど
https://oshiete.goo.ne.jp/qa/2156743.html
https://tsware.jp/study/vol16/vbabegin_34.htm
より高度な使い方を模索しているページしか見つからなかったけど、「クリック時」イベントがあるのでそれを使えば「カレンダーコントロールで指定した値」を取り出せます
イベントで値が使えるならそれをそのまま「ボックス」に入力するようにすればいいです
「ボックス」がナニモノか分からないけど、非連結のテキストボックスなら日付データそのまま入れて書式の設定でそれぞれ「yyyy」「mm」「dd」って設定しておけばいいんじゃないですかね
ただ表示するだけでいいのであれば、3回別々にデータを入力することもないので
「(月)」と「(日)」はコントロールソースを
=[(年)]
としてもいいと思います下記を参考に実現できませんか?
T’sWare #550日付データを年・月・日別々のテキストボックスに表示する方法
ご解説ありがとうございます。
値を代入した瞬間にレコード位置が変わっていたのですか。
Sortプロパティも良く気を付けて使わなければならないですね。
Sort設定した瞬間だけ並び替えが行われるのものかと。
いえ、「[残業区分]の値に 3 を代入( 1 から 3 に変更)した瞬間」です。
Update メソッドが呼び出されるより先に並べ替えが行われています。
(イミディエイトウィンドウへの出力結果)
以上のように、AbsolutePosition プロパティの値の変化からも今回の現象の原因を説明することができます。
sk様、Hiroton様、Hatena様
皆様、この度は真摯なご回答誠にありがとうございました。
問題解決することができました!
個々に手動で変更しなくても、自動的に希望の倍率(環境設定の値)で表示されるようになったのかしら?YESの場合、目的(PDF表示倍率変更)は達成されたのだから、Access云々の手段は不要になったはずですが。手段と目的がすり替わっていませんか?
sk様
ご提示の
「Sort プロパティを使用せず Open メソッドの呼び出し時に「 ORDER BY 句付きの SELECT 文」を渡すこと」
で出来ました!
debug.printでも95が表示されますし、処理も残業区分が4になってます。
ちなみにレコードの並び替えが必要な理由は、途中略の部分にありますので(おそらく並び替えが必要な処理)
やはり、残業管理ID=130で残業区分=3にして、rs.updateで並び替えが行われているということですかね。
もっとも、「[日付]の値が休日に該当する場合は[残業区分]の値を書き換える」という処理だけに着目するのであれば、そもそもレコードを並べ替えること自体が不要であるとも言えますが。
hatena様
イミディエイトでは何も出力されませんでした。
デバッグコードの位置を以下にすると、
以下のように出ます。
84 2024/04/20
130 2024/04/21
85 2024/04/21
ならば考えられる原因は 1 つだけです。
[残業管理ID]の値が 130 であるレコードの[残業区分]の値に 3 を代入( 1 から 3 に変更)した瞬間に、そのレコードが 2 番目から 3 番目のレコードに、[残業管理ID]の値が 95 である([残業区分]の値が 2 である)レコードが 3 番目から 2 番目のレコードになった(レコードセット内での絶対位置が入れ替わった)からです。
【 3 を代入する直前の状態】
【 3 を代入した直後の状態】
順番が入れ替わってもその時点でのカレントレコードは[残業管理ID]の値が 130 であるレコードのままなので、その後 MoveNext メソッドを呼び出せばその次( 4 番目)のレコードは[残業管理ID]の値が 85 であるレコードとなります。
回避手段としては、Sort プロパティを使用せず Open メソッドの呼び出し時に「 ORDER BY 句付きの SELECT 文」を渡すことが挙げられます。
コードには問題がなさそうなので、データの問題の可能性が大です。
このような場合は、こちらにはデータがないのでそちらでデバッグ作業をするしかなです。
デバッグの方法についてはすでにリンクが紹介されていますので、そちらを参照してもらうとして、
とりあえず下記のデバッグコードを埋め込んで、イミディエイトの出力結果を確認してみてください。
皆様
早急なご回答誠にありがとうございます。
試したところPDFファイルを単独で開くと同じ倍率で表示するようになりました。
しかし、adobe PDF reader ActiveXを貼り付けると
「OLEが見つかりません」とメッセージが表示され、動作しません。
調べたところAdobe AcrobatがないとOLEインストールできないようです。
次にX-Change Viewerでも同じことを試しました。
同様にPDFファイルから開くと同じ倍率になりますが、
貼り付けても反映されませんでした。
Adobe Acrobatを持っていないため購入するか、
X-Changeを調査していく方向になりそうです。
もしほかに方法がございましたらお教えいただけませんでしょうか。
どうぞよろしくお願いいたします。
84、130、85しか表示されていませんでした。
書き換えたコードは途中略なしです。
Hiroton様
Debug.Print rs!残業管理ID を実行しましたが、95が表示されていませんでした。
sk様
追加のコードについては、投稿時に端折っただけです。
ご提示の1~5の選択肢については3だと思われます。
下記のコードに書き換えて実行してみました。
それでも同じく残業管理ID 95の残業区分が4にならずに2のままでした。
他の残業区分IDは残業区分が3になっています。
PDFを常に同じ倍率で表示する! 毎回、表示を変更する手間を省く時短方法
adobe reader の環境設定で初期倍率を設定しないの?
「元から ElseIf ブロックのコードがモジュールに記述されていた(が、最初の投稿時に端折っただけ)」とおっしゃりたいのか、「実際にはモジュールに記述されていなかったのでコードを修正した」という意味でおっしゃっているのか、どちらなのでしょうか。
仮に前者であるとして、
現時点では以下のいずれの意味でおっしゃっているのかが不明瞭です。
レコードの並べ替え順が Sort プロパティで指定した通りにならず、[残業管理ID]が 130 であるレコードの次のレコードが 85 のレコードとなり、更にその次のレコード以降に 95 のレコードが現れる。
レコードの並べ替え順は Sort プロパティで指定した通りになっているが、ElseIf ブロック内で呼び出された DCount 関数の戻り値が 0 となる(ので[残業区分]の書き換えとレコードの更新が実行されない)。
レコードの並べ替え順は Sort プロパティで指定した通りになっているが、[残業管理ID]が 95 であるレコードを参照した際、最後の rs.MoveNext メソッドが呼び出されるより前のいずれかのタイミングで次のレコード( 85 )に移動している。
それどころか、レコードセットの中に[残業管理ID]の値が 95 であるレコードが含まれていない。
上記以外の意味。
例えば 1,2 のいずれかに該当するならテーブル[tbl残業管理]の各レコードの[日付]に格納されている実際の値(例えば日付だけでなく時刻が含まれていないか等)を確認すべきですし、3 に該当するなら「(途中略)」とされた部分全てのコードが疑惑の対象となります。
申し訳ございません。
コードの一部を追加しました。
残業区分 = 2の時の処理を記述しました。
コードが途中までしか記述されていないので実際にどのような動作をしているのか読み切れませんが、本当に飛ばされているのか確認のテストコードを実行してみるといいと思います
たとえば、
Do Until rs.EOF
の次にそれ用のコードを記述します詳しい確認方法などは参考サイトがたくさんあるので適当に覗いてみてください
https://www.google.com/search?q=VBA デバッグ
[残業管理ID]の値が 95 であるレコードの[残業区分]の値は 2 であり、上記の条件を満たしていないため。
標準機能の「印刷」はそういった操作を考慮しないただの「印刷」のみの機能ですね
「なんやかんやしつつ、『印刷』もして、なんやかんやする」という機能を独自に実装する必要があります
レポートの印刷プレビューウィンドウにボタンを配置する(hatena chipsさん)
Access でカスタム リボンを作成する
とりあえず一例としてリンクを挙げておきますが、汎用性を持たせようとしたり、要求によっては高度な知識や複雑なコーディングが必要になったりします
具体的な肝の部分だけ言えば
という2行のVBA/マクロを実行するだけでしょう
For文のループ内にDoCmd.GoToRecord , , acNextをいれるというようなことはしたことがないので原因は分かりませんが、
たぶん、もっと効率的かつ高速かつ安全な方法があると思います。
具体的にどのようなことをしたいのか説明されたら、具体的なアドバイスでつきそうです。
表示されている全レコードを更新したいとかなら、更新クエリで更新するとか、フォームのRecordsetプロパティを使って更新するとか、いろいろな方法があります。
素晴らしいです。作業が進みそうです。
ありがとうございました
すみません。タイプミスです。下記に修正してください。
Selecl Case Me.Cmb普軽.Value
メッセージ通り、開いた直後は普通車ページにフォーカスがあるのが原因ですので、軽自動車ページにフォーカス移動させればいいでしょう。
hatena様ご教示の通りやってみましたが次のようなエラーが出ました。
selecl case me.cmb普軽.vlue
のvlueの部分でメソッドまたはデータメンバーが見つかりませんと出ます。
一応その部分を消してクリックした場合普通車の部分は開くのですが
軽自動車を開くときはコントロールがフォーカスを取得しているときはコントロール
を非表示にすることはできませんと出ます。
よろしくご教示のほどお願いします。
試験勉強しなきゃいけないのに、模様替えが気になっちゃうパターンかしら?レポートやレイアウトのポンチ絵の前にやるべき事に集中しないとね。
実際にどのような流れや方法によってデータ入力が行われることになるか、またどのような勤務形態を前提としているか、どのようなルールに基づいて給与計算を行うか――といった諸々の問題が関わってきますので、正解はないでしょう。
例えば「出退勤時にタイムカード(紙)に打刻する」方式と「ICカードリーダーによって入退室管理を行う(直接電子データとして記録される)」方式とでは勝手が違いますし、また深夜/早朝に渡る勤務が当たり前に発生することを前提としているか否かによっても考え方は変わってくるでしょう。
後者のレイアウトにデメリットがあるとすれば、ごくシンプルに「日付ごとの勤務時間の計算がしにくい」という点が挙げられます。
前者のレイアウトであれば、基本的にはレコードごとに[退勤時刻]と[出勤時刻]の差を求めるクエリを作れば済みますが、後者のレイアウトは[出勤]と[退勤]のレコードが別々に記録されることになるため、多少手間がかかります。
また出勤時と退勤時のいずれかにおいて打刻忘れが発生し得ることを想定した場合、[出勤]と[退勤]のレコードの組み合わせを得るための手順は複雑化するでしょう。
出勤と退勤は一対(出勤だけ、退勤だけというのは通常はない)のものなので、それを1レコードすると考えるか、
時刻データで種類のことなるものなので別レコードにすると考えるか、
データベース的にはどちらもありです。
それぞれメリット、デメリットがあるので運用や処理においてどちらが使いやすいかで決めればいいと思います。
人間が見たときに、見やすいのは前者ですが、後者でもクロス集計クエリで簡単に前者の形に変換できます。
レポートで出力するときは、「重複データ非表示」プロパティで簡単に、下記の見た目にすることもできます。
2024/04/25□AAA□出勤□9:00
□□□□□□□□□□退勤□17:00
□□□□□□□BBB□出勤□9:00
□□□□□□□□□□退勤□17:00
前者の設計が多いのは、
勤怠管理で一番多い処理は、勤務時間の集計だと思いますが、
前者だと、退勤時間-出勤時間 で簡単に計算できるからだと思います。
日付をまたぐ場合の対応は、日付も持たせるか、退勤時間<出勤時間 なら24時間足すという対応でもいいでしょう(24時間以上の連続勤務はないと思いますので)
後者でもクロス集計クエリで前者の形に変換できますので、それで同様のことは可能になります。ただし、クロス集計クエリを間にいれることでパフォーマンスに影響があるかも知れません。
結局、データ入力をどうするか、次第ではないかなと。
例えばタイムカードを使っているなら、それが出力する形式に合わせるとか(たいてい前者のレイアウトになっているかな?)
了解しました。
まず、
フォーム名「選択」
テキストボックス名「普軽txt」
上記のテキストボックスを右クリックして「コントロールの種類の変更」で「コンボボックス」を選択します。これでコンボボックスに変更できます。
このコンボックスのプロパティを下記のように設定してください。
名前 cmb普軽
値集合ソース 普通車;軽自動車
値集合タイプ 値リスト
入力チェック はい
リストの編集の許可 いいえ
コマンドボタンの「クリック時」の[イベントプロシージャ]を下記のように記述します。
コマンドボタンの名前は cmd車庫証明Open
hatena様久しぶりにお世話になります。
下記であってますか。
>>あっています。
コマンドボタンクリックですか、それとも入力したら自動的に実行されるようにしますか。
>>コマンドボタンクリックです。
テキストボックスではなく、コンボボックスでリストから「普」「軽」が選択できるような設計の方がUIとしては優れていると思いますが、そのような設計に変更してはどうでしょう。
>>変更します。
にはどのようなデータが必要でしょうか?
これも、よくある受発注データベースサンプルなんかを参考にしたらいいと思いますよ
「席」という商品を「予約毎に受け付ける」という形なので
「T_指定席予約データ」という一つのテーブルで何とかしようとするのではなく、
予約テーブルと予約席明細テーブル2つに分けて登録するとうまく正規化できます
あと、「普軽txt」に入力した後、質問の処理をどのように実行しますか。
コマンドボタンクリックですか、それとも入力したら自動的に実行されるようにしますか。
また「普」「軽」以外が入力されたらどうしますか。
テキストボックスではなく、コンボボックスでリストから「普」「軽」が選択できるような設計の方がUIとしては優れていると思いますが、そのような設計に変更してはどうでしょう。
説明があいまいな部分があるので、
状況を整理すると下記であってますか。
フォーム名「選択」
テキストボックス名「普軽txt」
フォーム名「F車庫証明」
タブコントロール名「普通車・軽自動車」
1ページ目のページ名「普通車」
1ページ目のページ名「軽自動車」
違っているなら、それぞれの正確な名前を提示してください。