質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

Access VBA パラメータクエリの結果をサブフォームに表示する

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 402

ttakka

score 2

前提・実現したいこと

Accessのフォームに入力した値を基にデータを抽出し、それをサブフォームに表示させたい。
理想としては勤怠管理システムの管理者フォームを目指して作っています、

発生している問題・エラーメッセージ

・サブフォームに一件しか抽出されない。
・フィルターが上手く動作しない。

該当のソースコード

[T-社員]テーブル

フィールド名 🔑
社員ID オート 主キー
氏名 文字列

[T-勤務]テーブル

フィールド名 🔑
データナンバー オート 主キー
出勤時刻 日付
外出 日付
再入  日付
退勤時刻 日付
有給 数値
欠勤 数値
社員ID 数値 外部キー

[F-勤務時間検索]メインフォーム:単票フォーム
[subsub]サブフォーム:帳票フォーム

サブフォーム・サブフォームコントロール(テキストボックス)ともに非連結状態です。
MsgBoxの時点では社員IDが正常に送られていましたが、抽出が上手く行えず引数として渡した社員IDと関係の無いレコードが一件だけ表示されます。(どの社員IDの値を引数として渡しても常に同じレコードが一件表示されます。)

Private Sub コマンド41_Click()
MsgBox Me.コンボ0

 Call DataRead(Me.コンボ0)
End Sub

Function DataRead(Datakey As Long)
    Dim oRS As Recordset
    With Application.CurrentDb
    Set oRS = .OpenRecordset("T-勤務", dbOpenDynaset)

    oRS.FindFirst "社員ID=" & Datakey

    Me!subsub.Form!出勤時刻.Value = oRS("出勤時刻").Value
    Me!subsub.Form!外出.Value = oRS("外出").Value
    Me!subsub.Form!再入.Value = oRS("再入").Value
    Me!subsub.Form!退勤時刻.Value = oRS("退勤時刻").Value
    Me!subsub.Form!有給.Value = oRS("有給").Value
    Me!subsub.Form!欠勤.Value = oRS("欠勤").Value

    oRS.Close
    End With

End Function

試したこと

試そうとしている事ですが、連想配列に一度代入し繰り返し文で記述を行おうとしています。(現時点で自力では難しそうですが。。。)

補足情報(FW/ツールのバージョンなど)

Access2016
ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

サブフォーム・サブフォームコントロール(テキストボックス)ともに非連結状態です。

サブフォームコントロールに埋め込まれているサブフォームが非連結(レコードソースが空欄)という意味でしょうか。
サブフォームの名前は「SubSub」ということ?サブフォームコントロールの名前は?

サブフォームコントロールとサブフォームは別物ですが、それは理解してますか。

サブフォームとサブフォームコントロールの違いとは?

まずは、Access用語を理解して、正確な用語を使って説明する努力をしてください。現状の説明では状況が正確に伝わりません。

試そうとしている事ですが、連想配列に一度代入し繰り返し文で記述を行おうとしています。

非連結フォームに配列からデータを代入して連結帳票フォームのように複数レコードを表示させようとしているなら、それは不可能です。非連結フォームは1件分しか表示できません。

複数レコードを表示したいならサブフォームのレコードソースにはテーブルかクエリを設定して、各コントロールのコントロールソースを設定してください。

追記

やりたいことを想像して回答すると、

やりたいこと

  • メインフォームのコンボボックスで社員名を選択する。
  • その社員の勤怠データ(T-勤務のデータ)をサブフォームに表示される。

上記の想像があっているなら下記のようにしてくだい。

メインフォーム
レコードソース 空欄のまま

コンボボックス
名前 cb社員ID
値集合ソース T-社員
連結列 1
列数 2
列幅 0

これで名前リストで選択できます。

サブフォームのレコードソースを「T-社員」に設定。
サブフォームのテキストボックスのコントロールソースに適切なフィールド名を設定。
(連結フォームにするということ)

サブフォームコントロールのリンクフィールドを下記のように設定。

リンク親フィールド cb社員ID
リンク子フィールド 社員ID

以上で、ご希望の動作になります。
VBAは不必要なので削除してください。

追記2

コメントより

・[社員ID/氏名]のコンボボックス
・テキストボックス[年(西暦)]と[月]の二つ
があり、社員IDと日付で抽出して月単位の勤務情報をサブフォームに表示しようとしています。

フォームのモジュールに下記の関数を作成します。

Function SetFilter()
    If IsDate(Me.[年(西暦)] & "/" & Me.[月] & "/01") Then
        Me.subsub.Form.Filter = "出勤時刻>=#" & Me.一時 & "#" & _
                           " AND 出勤時刻<#" & DateAdd("m", 1, Me.一時) & "#" 
        Me.subsub.Form.FilterOn = True
    Else
        Me.subsub.Form.Filter = "" 
        Me.subsub.Form.FilterOn = False
    End If
End Function


[年(西暦)]と[月]のテキストボックスの「更新後処理」欄に下記のように設定します。

=SetFilter()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 18:49

    分かりづらい質問に答えて頂きありがとうございます、分かりづらい上に「実現したい事」に書くべき事を書けていませんでした、申し訳ありません。

    概ね仰られている通りなのですが、現状
    ・[社員ID/氏名]のコンボボックス
    ・テキストボックス[年(西暦)]と[月]の二つ
    があり、社員IDと日付で抽出して月単位の勤務情報をサブフォームに表示しようとしています。

    下記条件式クエリでテーブルやレポートには抽出はできているので、
    ・クエリ結果をサブフォームに表示する
    ・ご教示頂いだ方法に更にフィルターを追加する
    で求めているものが作れないかと思案しております。



    社員ID:[Forms]![F-勤務時間検索]![コンボ0]
    出勤時刻:>=CDate([Forms]![F-勤務時間検索]![一時])
    And <CDate(DateAdd("m",1,[Forms]![F-勤務時間検索]![一時]))

    [一時]にはテキストボックス[年]と[月]を結合した[2020/07]などが入っています。

    キャンセル

  • 2020/07/15 16:58

    作ろうとしていたものを作ることができました、ありがとうございます!

    データの流れやどう設定するべきなのか理解を進める事ができました、指摘していただいたAccessのもっと基本的な用語や構造をもっと学習を進めたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る