Microsoft Access 掲示板

views
4 フォロー
5,901 件中 1 から 40 までを表示しています。
3
solamomo 2024/05/02 (木) 17:11:26 087ff@0185a

hatena様
試してみました。
うまく動きました。本当にありがとうございました。

2
solamomo 2024/05/02 (木) 16:52:35 087ff@0185a

hatena様
早速のご回答ありがとうございます。

1

50音選択ボタン(オプションボタン)の設計は下記にサンプルがあります。

オプショングループで50音選択 - hatena chips

オプショングループで50音選択 改良版 - hatena chips

オプショングループで50音選択 高速版 - hatena chips

これらはフォームのFilterに条件を設定して絞り込むサンプルですが、
これをコンボボックスの値集合ソースを書き換えるように書き換えればいいでしょう。

3
ゆきぷりん 2024/05/02 (木) 15:51:01 947bd@b9243

りんご様
ありがとうございました。参考サイトで出来ました

hiroton様 
わざわざご返信いただきましてありがとうございました
この方式を試したのですが各ボックスに書式設定をしても
表示上はその見え方をするのですが データは**//**が残ってしまい
上手く扱えなかったです

いろいろご教授頂きましてありがとうございます
また何かありましたらよろしくお願いいたします

5
MochaShima 2024/05/02 (木) 15:44:43 d2d23@fb7d0

りんご様

お返事ありがとうございます。
PDFを単体で開く場合、自動的に希望の倍率で表示されました。
りんご様の質問に対してはYESです。

自分が混乱しておりました。誠にありがとうございました。

2
hiroton 2024/05/02 (木) 14:40:12 修正 8d44d@f966d

タイトルにあるけど本当に「カレンダーコント―ロール11.0」?
とっくに廃れて解説も見つからないようなコントロールだけど

https://oshiete.goo.ne.jp/qa/2156743.html
https://tsware.jp/study/vol16/vbabegin_34.htm

より高度な使い方を模索しているページしか見つからなかったけど、「クリック時」イベントがあるのでそれを使えば「カレンダーコントロールで指定した値」を取り出せます

イベントで値が使えるならそれをそのまま「ボックス」に入力するようにすればいいです

Private Sub Calendar0_Click()
    Me![(年)] = Me!Calendar0
    Me![(月)] = Me!Calendar0
    Me![(日)] = Me!Calendar0
End Sub

「ボックス」がナニモノか分からないけど、非連結のテキストボックスなら日付データそのまま入れて書式の設定でそれぞれ「yyyy」「mm」「dd」って設定しておけばいいんじゃないですかね
ただ表示するだけでいいのであれば、3回別々にデータを入力することもないので
「(月)」と「(日)」はコントロールソースを=[(年)]としてもいいと思います

16

ご解説ありがとうございます。
値を代入した瞬間にレコード位置が変わっていたのですか。

Sortプロパティも良く気を付けて使わなければならないですね。
Sort設定した瞬間だけ並び替えが行われるのものかと。

15

やはり、残業管理ID=130で残業区分=3にして、rs.updateで並び替えが行われているということですかね。

いえ、「[残業区分]の値に 3 を代入( 1 から 3 に変更)した瞬間」です。
Update メソッドが呼び出されるより先に並べ替えが行われています。

Debug.Print "【値の代入前】"
Debug.Print "[残業管理ID]の値: " & rs![残業管理ID].Value
Debug.Print "[残業区分]の値: " & rs![残業区分].Value
Debug.Print "レコードセット内の絶対位置: " & rs.AbsolutePosition
rs!残業区分.Value = 3
Debug.Print "【値の代入後】"
Debug.Print "[残業管理ID]の値: " & rs![残業管理ID].Value
Debug.Print "[残業区分]の値: " & rs![残業区分].Value
Debug.Print "レコードセット内の絶対位置: " & rs.AbsolutePosition
rs.Update

(イミディエイトウィンドウへの出力結果)

【値の代入前】
[残業管理ID]の値: 130
[残業区分]の値: 1
レコードセット内の絶対位置: 2
【値の代入後】
[残業管理ID]の値: 130
[残業区分]の値: 3
レコードセット内の絶対位置: 3

以上のように、AbsolutePosition プロパティの値の変化からも今回の現象の原因を説明することができます。

14
あん 2024/05/02 (木) 11:45:51 b41ab@001b1

sk様、Hiroton様、Hatena様
皆様、この度は真摯なご回答誠にありがとうございました。
問題解決することができました!

4
りんご 2024/05/02 (木) 11:42:33 修正 935bc@0e907

試したところPDFファイルを単独で開くと同じ倍率で表示するようになりました。

 個々に手動で変更しなくても、自動的に希望の倍率(環境設定の値)で表示されるようになったのかしら?YESの場合、目的(PDF表示倍率変更)は達成されたのだから、Access云々の手段は不要になったはずですが。手段と目的がすり替わっていませんか?

13
あん 2024/05/02 (木) 11:39:49 b41ab@001b1

sk様
ご提示の
「Sort プロパティを使用せず Open メソッドの呼び出し時に「 ORDER BY 句付きの SELECT 文」を渡すこと」
で出来ました!

debug.printでも95が表示されますし、処理も残業区分が4になってます。

ちなみにレコードの並び替えが必要な理由は、途中略の部分にありますので(おそらく並び替えが必要な処理)

やはり、残業管理ID=130で残業区分=3にして、rs.updateで並び替えが行われているということですかね。

12

もっとも、「[日付]の値が休日に該当する場合は[残業区分]の値を書き換える」という処理だけに着目するのであれば、そもそもレコードを並べ替えること自体が不要であるとも言えますが。

11

hatena様
イミディエイトでは何も出力されませんでした。

デバッグコードの位置を以下にすると、

Do Until rs.EOF

    Debug.Print rs!残業管理ID, rs!日付

        If rs!残業区分 = 1 Then

以下のように出ます。
 84           2024/04/20
 130          2024/04/21
 85           2024/04/21

10

ならば考えられる原因は 1 つだけです。

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

rs!残業区分 = 3

[残業管理ID]の値が 130 であるレコードの[残業区分]の値に 3 を代入( 1 から 3 に変更)した瞬間に、そのレコードが 2 番目から 3 番目のレコードに、[残業管理ID]の値が 95 である([残業区分]の値が 2 である)レコードが 3 番目から 2 番目のレコードになった(レコードセット内での絶対位置が入れ替わった)からです。

【 3 を代入する直前の状態】
画像1

【 3 を代入した直後の状態】
画像2

順番が入れ替わってもその時点でのカレントレコードは[残業管理ID]の値が 130 であるレコードのままなので、その後 MoveNext メソッドを呼び出せばその次( 4 番目)のレコードは[残業管理ID]の値が 85 であるレコードとなります。

回避手段としては、Sort プロパティを使用せず Open メソッドの呼び出し時に「 ORDER BY 句付きの SELECT 文」を渡すことが挙げられます。

rs.Open "SELECT * FROM [tbl残業管理] ORDER BY [日付] ASC, [担当者ID] ASC, [残業区分] ASC", cn, adOpenKeyset, adLockOptimistic
9

コードには問題がなさそうなので、データの問題の可能性が大です。

このような場合は、こちらにはデータがないのでそちらでデバッグ作業をするしかなです。
デバッグの方法についてはすでにリンクが紹介されていますので、そちらを参照してもらうとして、
とりあえず下記のデバッグコードを埋め込んで、イミディエイトの出力結果を確認してみてください。

'前略

        ElseIf rs!残業区分 = 2 Then
            Debug.Print rs!残業管理ID, rs!日付     'デバッグコード
            If DCount("休日", "tbl休日", "休日 = #" & rs!日付 & "#") > 0 Then

'後略
3
MochaShima 2024/05/02 (木) 10:24:02 d2d23@fb7d0

皆様

早急なご回答誠にありがとうございます。
試したところPDFファイルを単独で開くと同じ倍率で表示するようになりました。
しかし、adobe PDF reader ActiveXを貼り付けると
「OLEが見つかりません」とメッセージが表示され、動作しません。
調べたところAdobe AcrobatがないとOLEインストールできないようです。

次にX-Change Viewerでも同じことを試しました。
同様にPDFファイルから開くと同じ倍率になりますが、
貼り付けても反映されませんでした。

Adobe Acrobatを持っていないため購入するか、
X-Changeを調査していく方向になりそうです。
もしほかに方法がございましたらお教えいただけませんでしょうか。
どうぞよろしくお願いいたします。

8

84、130、85しか表示されていませんでした。

7

書き換えたコードは途中略なしです。

6
あん 2024/05/02 (木) 10:12:49 b41ab@001b1

Hiroton様

Debug.Print rs!残業管理ID を実行しましたが、95が表示されていませんでした。

5

sk様
追加のコードについては、投稿時に端折っただけです。

ご提示の1~5の選択肢については3だと思われます。

下記のコードに書き換えて実行してみました。
それでも同じく残業管理ID 95の残業区分が4にならずに2のままでした。
他の残業区分IDは残業区分が3になっています。

    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
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ページ目のページ名「軽自動車」

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