Microsoft Access 掲示板

views
4 フォロー
6,278 件中 401 から 440 までを表示しています。
4

コードの一部を追加しました。
残業区分 = 2の時の処理を記述しました

「元から ElseIf ブロックのコードがモジュールに記述されていた(が、最初の投稿時に端折っただけ)」とおっしゃりたいのか、「実際にはモジュールに記述されていなかったのでコードを修正した」という意味でおっしゃっているのか、どちらなのでしょうか。

仮に前者であるとして、

残業管理ID 130までは残業区分が3に変わりますが、
次は95がとばされてしまい、85のレコードの処理になってしまいます。

rs.Sort = "日付 ASC, 担当者ID ASC, 残業区分 ASC"

現時点では以下のいずれの意味でおっしゃっているのかが不明瞭です。

  1. レコードの並べ替え順が Sort プロパティで指定した通りにならず、[残業管理ID]が 130 であるレコードの次のレコードが 85 のレコードとなり、更にその次のレコード以降に 95 のレコードが現れる。

  2. レコードの並べ替え順は Sort プロパティで指定した通りになっているが、ElseIf ブロック内で呼び出された DCount 関数の戻り値が 0 となる(ので[残業区分]の書き換えとレコードの更新が実行されない)。

  3. レコードの並べ替え順は Sort プロパティで指定した通りになっているが、[残業管理ID]が 95 であるレコードを参照した際、最後の rs.MoveNext メソッドが呼び出されるより前のいずれかのタイミングで次のレコード( 85 )に移動している。

  4. それどころか、レコードセットの中に[残業管理ID]の値が 95 であるレコードが含まれていない。

  5. 上記以外の意味。

例えば 1,2 のいずれかに該当するならテーブル[tbl残業管理]の各レコードの[日付]に格納されている実際の値(例えば日付だけでなく時刻が含まれていないか等)を確認すべきですし、3 に該当するなら「(途中略)」とされた部分全てのコードが疑惑の対象となります。

3
あん 2024/05/01 (水) 16:57:28 b41ab@001b1

申し訳ございません。
コードの一部を追加しました。
残業区分 = 2の時の処理を記述しました。

2
hiroton 2024/05/01 (水) 16:52:10 6bf03@f966d

コードが途中までしか記述されていないので実際にどのような動作をしているのか読み切れませんが、本当に飛ばされているのか確認のテストコードを実行してみるといいと思います

たとえば、Do Until rs.EOFの次にそれ用のコードを記述します

    Do Until rs.EOF
        Debug.Print rs!残業管理ID    'デバッグ用コードを追加してみる

詳しい確認方法などは参考サイトがたくさんあるので適当に覗いてみてください
https://www.google.com/search?q=VBA デバッグ

1

残業管理ID 130までは残業区分が3に変わりますが、
次は95がとばされてしまい、85のレコードの処理になってしまいます。

If rs!残業区分 = 1 Then

[残業管理ID]の値が 95 であるレコードの[残業区分]の値は 2 であり、上記の条件を満たしていないため。

1
hiroton 2024/04/30 (火) 18:21:00 e6c24@f966d

標準機能の「印刷」はそういった操作を考慮しないただの「印刷」のみの機能ですね
「なんやかんやしつつ、『印刷』もして、なんやかんやする」という機能を独自に実装する必要があります

レポートの印刷プレビューウィンドウにボタンを配置する(hatena chipsさん)
Access でカスタム リボンを作成する

とりあえず一例としてリンクを挙げておきますが、汎用性を持たせようとしたり、要求によっては高度な知識や複雑なコーディングが必要になったりします

具体的な肝の部分だけ言えば

プレビュー中のレポートを印刷する
印刷したレポートを閉じる

という2行のVBA/マクロを実行するだけでしょう

1

For文のループ内にDoCmd.GoToRecord , , acNextをいれるというようなことはしたことがないので原因は分かりませんが、
たぶん、もっと効率的かつ高速かつ安全な方法があると思います。

具体的にどのようなことをしたいのか説明されたら、具体的なアドバイスでつきそうです。

表示されている全レコードを更新したいとかなら、更新クエリで更新するとか、フォームのRecordsetプロパティを使って更新するとか、いろいろな方法があります。

7
tokinaito 2024/04/26 (金) 16:00:25 609fe@236a9

素晴らしいです。作業が進みそうです。
ありがとうございました

6

selecl case me.cmb普軽.vlue

すみません。タイプミスです。下記に修正してください。

Selecl Case Me.Cmb普軽.Value

軽自動車を開くときはコントロールがフォーカスを取得しているときはコントロール
を非表示にすることはできませんと出ます。

メッセージ通り、開いた直後は普通車ページにフォーカスがあるのが原因ですので、軽自動車ページにフォーカス移動させればいいでしょう。

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
5
tokinaito 2024/04/26 (金) 13:33:53 609fe@236a9

hatena様ご教示の通りやってみましたが次のようなエラーが出ました。
selecl case me.cmb普軽.vlue
のvlueの部分でメソッドまたはデータメンバーが見つかりませんと出ます。
一応その部分を消してクリックした場合普通車の部分は開くのですが
軽自動車を開くときはコントロールがフォーカスを取得しているときはコントロール
を非表示にすることはできませんと出ます。
よろしくご教示のほどお願いします。

3
りんご 2024/04/26 (金) 11:04:54 935bc@0e907

試験勉強しなきゃいけないのに、模様替えが気になっちゃうパターンかしら?レポートやレイアウトのポンチ絵の前にやるべき事に集中しないとね。

2

日付 氏名 出勤時間 退勤時間

日付 氏名 区分 時間

日付をまたぐ勤務にも簡単に対応できる気がするのですが、普通は前者のようにするものですか?

実際にどのような流れや方法によってデータ入力が行われることになるか、またどのような勤務形態を前提としているか、どのようなルールに基づいて給与計算を行うか――といった諸々の問題が関わってきますので、正解はないでしょう。

例えば「出退勤時にタイムカード(紙)に打刻する」方式と「ICカードリーダーによって入退室管理を行う(直接電子データとして記録される)」方式とでは勝手が違いますし、また深夜/早朝に渡る勤務が当たり前に発生することを前提としているか否かによっても考え方は変わってくるでしょう。

外部のひと(たとえば労働基準監督署)からみたらぱっと見で把握がしづらいでしょうか?

後者のレイアウトにデメリットがあるとすれば、ごくシンプルに「日付ごとの勤務時間の計算がしにくい」という点が挙げられます。
前者のレイアウトであれば、基本的にはレコードごとに[退勤時刻]と[出勤時刻]の差を求めるクエリを作れば済みますが、後者のレイアウトは[出勤]と[退勤]のレコードが別々に記録されることになるため、多少手間がかかります。
また出勤時と退勤時のいずれかにおいて打刻忘れが発生し得ることを想定した場合、[出勤]と[退勤]のレコードの組み合わせを得るための手順は複雑化するでしょう。

1

出勤と退勤は一対(出勤だけ、退勤だけというのは通常はない)のものなので、それを1レコードすると考えるか、
時刻データで種類のことなるものなので別レコードにすると考えるか、
データベース的にはどちらもありです。

それぞれメリット、デメリットがあるので運用や処理においてどちらが使いやすいかで決めればいいと思います。

人間が見たときに、見やすいのは前者ですが、後者でもクロス集計クエリで簡単に前者の形に変換できます。
レポートで出力するときは、「重複データ非表示」プロパティで簡単に、下記の見た目にすることもできます。
2024/04/25□AAA□出勤□9:00
□□□□□□□□□□退勤□17:00
□□□□□□□BBB□出勤□9:00
□□□□□□□□□□退勤□17:00

前者の設計が多いのは、
勤怠管理で一番多い処理は、勤務時間の集計だと思いますが、
前者だと、退勤時間-出勤時間 で簡単に計算できるからだと思います。
日付をまたぐ場合の対応は、日付も持たせるか、退勤時間<出勤時間 なら24時間足すという対応でもいいでしょう(24時間以上の連続勤務はないと思いますので)

後者でもクロス集計クエリで前者の形に変換できますので、それで同様のことは可能になります。ただし、クロス集計クエリを間にいれることでパフォーマンスに影響があるかも知れません。

結局、データ入力をどうするか、次第ではないかなと。
例えばタイムカードを使っているなら、それが出力する形式に合わせるとか(たいてい前者のレイアウトになっているかな?)

4

了解しました。
まず、

フォーム名「選択」
 テキストボックス名「普軽txt」

上記のテキストボックスを右クリックして「コントロールの種類の変更」で「コンボボックス」を選択します。これでコンボボックスに変更できます。
このコンボックスのプロパティを下記のように設定してください。

名前  cmb普軽
値集合ソース 普通車;軽自動車
値集合タイプ 値リスト
入力チェック はい
リストの編集の許可 いいえ

コマンドボタンの「クリック時」の[イベントプロシージャ]を下記のように記述します。
コマンドボタンの名前は cmd車庫証明Open

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
3
tokinaito 2024/04/25 (木) 12:41:19 95680@7f149

hatena様久しぶりにお世話になります。
下記であってますか。
>>あっています。
コマンドボタンクリックですか、それとも入力したら自動的に実行されるようにしますか。
>>コマンドボタンクリックです。
テキストボックスではなく、コンボボックスでリストから「普」「軽」が選択できるような設計の方がUIとしては優れていると思いますが、そのような設計に変更してはどうでしょう。
>>変更します。

16
hiroton 2024/04/25 (木) 12:04:32 d4e23@f966d

イベント会場の指定席管理システム

にはどのようなデータが必要でしょうか?

これも、よくある受発注データベースサンプルなんかを参考にしたらいいと思いますよ
「席」という商品を「予約毎に受け付ける」という形なので

「T_指定席予約データ」という一つのテーブルで何とかしようとするのではなく、
予約テーブルと予約席明細テーブル2つに分けて登録するとうまく正規化できます

2

あと、「普軽txt」に入力した後、質問の処理をどのように実行しますか。
コマンドボタンクリックですか、それとも入力したら自動的に実行されるようにしますか。

また「普」「軽」以外が入力されたらどうしますか。

テキストボックスではなく、コンボボックスでリストから「普」「軽」が選択できるような設計の方がUIとしては優れていると思いますが、そのような設計に変更してはどうでしょう。

1

説明があいまいな部分があるので、
状況を整理すると下記であってますか。

フォーム名「選択」
 テキストボックス名「普軽txt」

フォーム名「F車庫証明」
 タブコントロール名「普通車・軽自動車」
  1ページ目のページ名「普通車」
  1ページ目のページ名「軽自動車」

違っているなら、それぞれの正確な名前を提示してください。

4

日付選択カレンダーで日付を選択した瞬間にイベントを走らせる事ができないので
Me.Refreshを入れていると思います。

日付を選択した瞬間にイベントを走らせるのに、Me.Refresh をするというのは目的のための道具の選択が適切でないということです。

例えると、大根を切るのに適切な道具は、包丁ですが、チェーンソーを持ち出して切る、というイメージです。

3
アラレ 2024/04/25 (木) 11:26:12 000c5@8dc8e

追記です。
    'キー入力フラグがfalseのときはフォーム入力値を確定する
    If Me![chk_date] = False Then
        DoCmd.RunCommand acCmdSaveRecord
    End If

こうする事で、日付を選択した瞬間にイベントが発生することができました。
保存したいとか、そういう理由はありませんが、そこで保存したことによって
問題もないですし、イメージ通りに動くことができたのでよかったです。
ありがとうございました。

2
アラレ 2024/04/25 (木) 11:20:03 000c5@8dc8e

おはようございます。
ご返信ありがとうございます。
http://hiroses.seesaa.net/article/397791059.html
上記のサイトでは
日付選択カレンダーで日付を選択した瞬間にイベントを走らせる事ができないので
Me.Refreshを入れていると思います。
詳しくはわからないのですが・・・

    'キー入力フラグがfalseのときはフォーム入力値を確定する
    If Me![chk_date] = False Then
        'Me.Refresh
        Call txt_date_AfterUpdate()
    End If

こちらを試してみたのですが、日付を選択した瞬間には発生しなかったでした。
フォーカスが移動した瞬間には発生します。

色々ググってみてはみたのですが、日付カレンダーはで日付を選択した瞬間は、イベントが発生しないみたいです。

15

テーブルでの並び順を名前の昇順ということは、通常はあまりないことです。
主キーフィールド順にするか、並び替え用のフィールドを用意するのが普通の設計です。

#8の投稿のテーブルなら、正規化すると、
席種マスターテーブルと席列マスターテーブルを作成することになります。

正規化例
席種マスター
席種ID 席種
1   座席
2   パイプ椅子

席列マスター
席列ID 席列
1   前列
2   後列

ID 席種ID 席列ID 席番
1   1   1   1
2   1   1   2
3   1   1   3
・・・
20   2   2   T

14
驚天動地!前任者失踪丸 2024/04/25 (木) 10:25:20 23e8e@44ebd >> 13

どなたか分かりませんが、スタンプでは分かりませんので文章でお願い致します。

13
驚天動地!前任者失踪丸 2024/04/25 (木) 10:00:01 修正 23e8e@44ebd >> 12

無事に昇順で表示させることができました。ありがとうございました。
どこまでがこの課題の必要情報か分からず、また社内情報保護の為小出しになってしまい申し訳ありません。

通常、コンボボックスのコントロールソースにはキーフィールドを格納するという設計になると思いますが

ここがよく分からないのですが、どういうことでしょうか?

ちなみに社内の既存のシステムなので、テーブル構成を変えるのが難しいです。
メインテーブルのレコードに全ての情報が集約されている感じのテーブル構成です。


T_指定席予約データ

ID席種席1席2席3座席通番予約№予約者氏名予約者〒予約者住所注文取込日時納品書発行日時出荷完了日時etc...

何度かこのサイトで教えて頂いていますが、テーブルが「正規化」されていないから扱いにくいということですかね?例えば席関連のフィールドでいえば、T_指定席予約_席 のようなテーブルを作成して、そこに席関連だけのデータを格納しリレーションでつなぐ・・・といったことをしないといけないということですよね?     

12

テーブル構成がどうなっているか不明なので、とりあえずの推測ですが、
IDをフィールドを最小か最大にすればいいのでは?


通常、コンボボックスのコントロールソースにはキーフィールドを格納するという設計になると思いますが、
このような質問が出てくるのは、その辺のテーブル設計がまずいのではという予感。


後だしで情報を追加していくのではなく、最初から関係するすべての情報を提示して質問してもらった方が、お互いに手間がないかと思いますが。

11
驚天動地!前任者失踪丸 2024/04/25 (木) 09:25:36 23e8e@44ebd >> 10

コンボボックスに同じ選択肢を羅列させないために集計でグループ化しているので、IDをフィールドに入れるとマズイ場合はどうすればよいでしょうか?

10
hatena 2024/04/24 (水) 22:48:08 修正

このようなテーブルがあり、cmb_席種というコンボボックスから「座敷」を選択すると、cmb_席1コンボボックスの選択肢は「前列」だけになり、「前列」を選択するとcmb_席2の選択肢が1~20になり、この際数字が昇順になるように表示させたいということです。

そのテーブルなら、ID の昇順にすればいいだけでは。
cmb_席2 の値集合ソースに下記のSQLを設定すればいいでしょう。

SELECT 席2, ID FROM テーブル名 WHERE 席2='" & Me.cmb_席1 & "' ORDER BY ID;
9
りんご 2024/04/24 (水) 20:34:20 935bc@0e907 >> 8
テーブル{席種}
座敷
パイプ椅子
テーブル{席種席列}
座敷   前列
座敷後列
パイプ椅子前列
パイプ椅子後列
テーブル{席種席列席番号}
座敷前列1
座敷前列
座敷前列20
座敷後列1
座敷後列
座敷後列20
パイプ椅子前列
パイプ椅子後列
8
驚天動地!前任者失踪丸 2024/04/24 (水) 19:28:27 23e8e@44ebd >> 5

レスが遅くなってしまい申し訳ありません。
実際にはイベント会場の指定席管理システムを作っていまして、

ID席種席1席2
1座敷前列
2座敷前列
20座敷前列20
21パイプ椅子後列
22パイプ椅子後列
40パイプ椅子後列

このようなテーブルがあり、cmb_席種というコンボボックスから「座敷」を選択すると、cmb_席1コンボボックスの選択肢は「前列」だけになり、「前列」を選択するとcmb_席2の選択肢が1~20になり、この際数字が昇順になるように表示させたいということです。
このため、席2フィールドに全角数字と全角アルファベットがあります。

1

そもそもMe.Refreshをする必要性が分からないのですが、なんのために必要なのでしょうか。

リンク先の説明では、日付選択カレンダーで日付を選択した瞬間に「更新後処理」イベントを実行したいということのようですが、そのために Me.Refresh は目的と手段があっていないように思います。
Refresh はカレントレコードの更新をテーブルに反映させて(=レコード保存)、かつ、テーブルデータを再読込するということですが、その必要性があるでしょうか。(再読込するので一旦非表示になる)

「更新後処理」プロシージャを実行したいのなら、それをCallすれば済む話です。

リンク先のコードなら、下記でいいとおもうのですが。

Private Sub txt_date_Change()

    'キー入力フラグがfalseのときはフォーム入力値を確定する
    If Me![chk_date] = False Then
        'Me.Refresh
        Call txt_date_AfterUpdate()
    End If

End Sub

もし、日付選択カレンダーで日付を選択した瞬間にレコード保存(?)したいのなら、下記でいいですし。
(再読込はしないので非表示にはならない)

Private Sub txt_date_Change()

    'キー入力フラグがfalseのときはフォーム入力値を確定する
    If Me![chk_date] = False Then
        DoCmd.RunCommand acCmdSaveRecord
    End If

End Sub
4
あん 2024/04/24 (水) 10:52:24 b41ab@001b1

hatena様
ありがとうございます。
こちらもやってみます!

3
hatena 2024/04/23 (火) 17:24:16 修正

hirotonさんの回答と同じ考え方のものですが、下記にサンプルがあります。
ご参考に。

帳票フォームでレコード毎にテキストボックスの表示/非表示を切り換えたい
表形式フォームで FieldA のデータが英字のみの場合、FieldBを表示、それ以外は非表示にしたいのですが、VisibleをTrueやFalseにすると、表全部がなってしまい、行単位で表示、非表示ができません。 Accessの帳票フォームで「可視」プロパティをVBA等で変更した場合は、すべての行に反映されます。プロパティがレコード数分存在するわけではないのでしょうがないことです。 「条件付き書式」を使って使用不可にすれば、...
Fc2

2
あん 2024/04/23 (火) 16:31:37 b41ab@001b1

hiroton様
ご回答ありがとうございます。

そのやり方をやってみます。
見栄えや使いやすさなどをよく判断してみます。

1
hiroton 2024/04/23 (火) 15:56:40 b3ded@f966d

基本的にはできないですね

コントロールBの前面にテキストボックスを配置して、背景スタイルプロパティを「透明」に、コントロールソース=IIf([テキストボックスA]<>1,"███")としてコントロールBを隠すとか、そんなことならできます

前景色プロパティで、メインの背景と同じ色になるようにして、フォントの設定でうまく塗りつぶすようにします。境界線や立体表示、余白の設定なんかも調整する必要があります

コントロールによってはテキストボックスよりも前面に表示されるモノ(前後の優先順位が固定のコントロール)もあるので、それらに関しては打つ手なしだと思います

5
フィールド1
・・・
18
19
20
・・・

というようなテーブルデータとういことですか。
これはどのようなリストでしょうか。
データベース的な設計なら、主キー必須なので下記のような感じとかになるはずです。
で、主キーで並び替えます。

IDData
11
22
33
・・・・
1818
1919
2020
21
22
・・・・
46

質問内容をあまり省略しすぎると、その内容に最適化された回答をしますので、
実際の処理に合わないものになる可能性が大きいです。

なるべく実態に近い質問内容にしてください。

例えば、前回の質問では、下記のようにいってますが、

イメージ的には、cmb_1で都道府県を選択したら、cmb_2にはその県にある市だけが選択できるようになる

もしこの内容なら、市町村コードというものがありますので、それで並び替えるとかになります。

4
驚天動地!前任者失踪丸 2024/04/20 (土) 09:58:17 23e8e@44ebd >> 3

説明不足で申し訳ありません。
ひとつ前の質問と関連するのですが、他のコンボボックスで選んだものによって選択肢が変わります。

例えば昇順に並べ替えたいコンボボックスがcmb_検索2だとすると、cmb_検索1でAを選ぶと1~20が、Bを選ぶとA~Zがリストに表示されるといったような感じです。

3

ならばデータ例もそうのように提示すべきですね。
全角数字のあとにアルファベットがくるのですか。
であるなら、前回の回答の最初のクエリでいいでしょう。

商品コード的なもので、数字+アルファベット という書式のものなら、
数字部分とアルファベット部分にわけて、それぞれ数値型、テキスト型フィールドにするという設計もあります。

というようなこともあるので、どのような書式になるのか、データ例もあげて、仕様を明確に提示してください。

2
驚天動地!前任者失踪丸 2024/04/20 (土) 08:33:03 23e8e@44ebd >> 1

同じフィールドにアルファベットが入る可能性があるので数値型に出来ません。

1
hatena 2024/04/20 (土) 05:03:41 修正

全角数字はVal関数では数値と判断されずに0になります。
StrConv関数で半角に変換してVal関数で数値化すればいいでしょう。

SELECT T_昇順実験.短いテキスト型, Val(StrConv([短いテキスト型],8)) AS 式1
FROM T_昇順実験
ORDER BY 2;

StrConv 関数 (Visual Basic for Applications) | Microsoft Learn


そもそも論ですが、数値順にならべたいフィールドを、テキスト型で全角数字にする意味が不明です。
素直に数値型のフィールドにしておけば無駄なことをせずにすみます。
StrConvやValで囲むことで無駄な処理が増えて、かつインデックスが無効になるので重くなります。

もし、表示上、全角にしたいのなら、フィールドのデータ型は数値型にしておいて、表示するときに全角に変換すればいいでしょう。

SELECT StrConv(T_昇順実験.数値型,4) AS 数値型
FROM T_昇順実験
ORDER BY T_昇順実験.数値型;
2
驚天動地!前任者失踪丸 2024/04/19 (金) 18:25:54 23e8e@44ebd >> 1

ありがとうございます!
思った通りに動かせるようになりました。

1

cmb_2の値集合ソースのクエリ(SQL)をcmb_1の値で絞り込んだものにします。

SELECT * FROM テーブル名 WHERE 種類=[cmb_1];

これだけだとcmb_1を変更してもリストが更新されないので、フォーカス取得時に再クエリします。

'cmb_2フォーカス取得時
Private Sub cmb_2_Enter()
    Me.cmb_2.Requery
End Sub