• ベストアンサー

accessで条件によって選択を変えたいのですが・・・

accessのフォームで、 日付を入力します。次に時間を入力します。 入力した日付の曜日が平日の時は、次に入力する時間選択のコンボボックスでテーブル1を表示して、土日の場合はテーブル2)を表示して選択したいのですが、可能でしょうか?何をどのようにすれば良いのか教えてください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.5

フォームに時間選択コンボが有るとして、プロパティで コントロールソースは空白にして、値集合タイプはテーブル/クエリにします。 でDay1の更新後処理で、こんな感じでは?未検証です。 ※前回の回答間違えてましたレコードソースでなくて 値集合ソース(RowSource)でした訂正してお詫びいたします。 Private Sub day1_AfterUpdate() Dim strSql As String Select Case Weekday(Me!day1, vbSunday)   Case vbSaturday, vbSunday     strSql = "select 時間コマID,時間 from テーブル2"   Case Else     strSql = "select 時間コマID,時間 from テーブル1" End Select Me!時間選択コンボ.RowSource = strSql Me!時間選択コンボ.Dropdown End Sub

mini_hana
質問者

お礼

ありがとうございましたm(__)m これからnicotinismさんソースをを参考に四苦八苦?がんばってみます。本当にありがとうございました(^o^)丿

その他の回答 (4)

noname#22222
noname#22222
回答No.4

s_husky です。 まあ、手取り早くコードレスで実現するにはというアイデアです。 私は、次のように DBSelect関数を使っています。 ? DBSelect("id_name", "id管理表",,,,True) Test; ? DBSelect("final_value", "id管理表",,,,True) 2; ? DBSelect("id_name,final_value", "id管理表",,,,True) Test;2; これで、DBSelect関数を利用すれば、レコードソースが容易に切り替えられることが判るかと思います。 なお、多少、SQL Server バージョンですので列の型を判別している記号定数をAccess のそれに修正すれば使えます。 ******************************************************** DBSelect関数が解読出来ない場合は、2つのクエリを用意して If 文かなにかで切り替えればいいです。 ******************************************************** ' ------------------------------------------------------------------------------------------------------- ' DBSelect(列リスト, '      表名, '      グループ指定文, '      条件文, '      並び替え文, '      isOneSentence, ---- 列データをセミコロン(;)で連結して1文にするか否か? '      isConvert) -------- 列データを表示形式に変換してから配列に代入するか否か? ' ------------------------------------------------------------------------------------------------------- Public Function DBSelect(ByVal strFields As String, _              ByVal strTable As String, _              Optional strGroupBy As String, _              Optional strWhere As String, _              Optional strOrderBy As String, _              Optional isOneSentence As Boolean = False, _              Optional isConvert As Boolean = False) As Variant On Error GoTo Err_DBSelect    Dim I      As Integer    Dim J      As Integer    Dim R      As Integer  ' データを代入する配列 DataValue(,) のインデックスを決める行カウンター    Dim C      As Integer  ' データを代入する配列 DataValue(,) のインデックスを決める列カウンター    Dim M      As Integer  ' データを代入する配列 DataValue(,) の一つ目の添字の最大値=行総数 - 1    Dim N      As Integer  ' データを代入する配列 DataValue(,) の二つ目の添字の最大値=列総数 - 1    Dim strQuerySQL As String    Dim rst     As ADODB.Recordset    Dim fld     As ADODB.Field    Dim strList   As String   ' 全てのデータをセミコロン(;)で区切った1行の文字列を格納する変数       Set rst = New ADODB.Recordset       strQuerySQL = "SELECT " & strFields & " FROM " & strTable    If Len(strGroupBy) > 0 Then      strQuerySQL = strQuerySQL & " GROUP BY " & strGroupBy    End If    If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere    End If    If Len(strOrderBy) > 0 Then      strQuerySQL = strQuerySQL & " ORDER BY " & strOrderBy    End If    ' =================    ' Begin With: rst    ' -----------------    With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        ' --------------        ' 配列を再宣言        ' --------------        M = .RecordCount - 1        N = .Fields.Count - 1        If M > 99 Then          MsgBox "読込む行総数を100行に下方修正しました。(DBSelect)", _             vbInformation, _             " お知らせ"          M = 99        End If        ReDim DataValues(M, N)        ' ------------------------------------        ' 列情報を For-Next で配列に代入する        ' ------------------------------------        .MoveFirst        For R = 0 To M          C = -1          For Each fld In .Fields            ' =================            ' Begin With: fld            ' -----------------            With fld              C = C + 1              If Not isConvert Then                DataValues(R, C) = Nz(.Value, "")              Else                ' --------------------------                ' 列データを表示形式に変換                ' --------------------------                Select Case .Type                  Case adBoolean         ' ブール型                    DataValues(R, C) = IIf(.Value = -1, "Yes", "No")                  Case adChar, adVarChar     ' 文字列型                    DataValues(R, C) = Nz(.Value, "")                  Case adDBDate, adDBTimeStamp  ' 日付型、日付/時刻型                    DataValues(R, C) = .Value                  Case adSmallInt, adInteger   ' 整数                    DataValues(R, C) = FormatNumber(.Value, 0)                  Case adSingle, adDouble     ' 浮動小数点型                    DataValues(R, C) = FormatNumber(.Value, 2)                  Case adCurrency         ' 通貨型                    DataValues(R, C) = FormatCurrency(.Value, 2)                  Case Else                    DataValues(R, C) = .Value                End Select              End If            End With            ' ---------------            ' End With: fld            ' ===============          Next fld          .MoveNext        Next R      Else        ReDim DataValues(0, 0)        DataValues(0, 0) = ""        strList = ""      End If    End With    ' ---------------    ' End With: rst    ' ===============    If isOneSentence Then      ' -------------------------------      ' セミコロン(;)で連結して1文に      ' -------------------------------      For I = 0 To M        For J = 0 To N          strList = strList & DataValues(I, J) & ";"        Next J      Next I    End If Exit_DBSelect: On Error Resume Next    rst.Close    Set rst = Nothing    DBSelect = IIf(isOneSentence, strList, DataValues())    Exit Function Err_DBSelect:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _        "・Err.Description=" & Err.Description & Chr$(13) & _        "・SQL Text=" & strQuerySQL, _        vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBSelect End Function

mini_hana
質問者

お礼

s_husky さん。たくさん書いていただいて、ありがとうございます。ちょっと今の私には難しく・・・・(@_@;)ごめんなさい。少しずつ勉強して、s_husky さんのソースを解読していきたいと思います。がんばってみます!!本当にありがとうございましたm(__)m

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

Weekday 関数でコンボボックスのレコードソースを 変えるとか・・

mini_hana
質問者

補足

すみません。初心者なものでweekday関数の使用方法がわかりませんので教えてください。 詳しく書きますと、フォーム内の日付は、day1。タイムは、day1。day1はコンボボックスで、集合値ソースはテーブルのタイムです。(平日と土曜日のテーブルを分けて考えていたのですが、よくわからなくなってしまったので、同一テーブルに、ID:1-14が平日、15-23を土曜にして現在考えています。できればタイムテーブルを平日と土曜と二つ用意して考え行きたかったのですが・・・どちらの方法が良いのかもよくわからないので・・・・) フォーム内で日付を入力し、その後タイムを入力します。伝わったでしょうか?何か他に必要なことがあればご質問ください。よろしくお願い申し上げます。

noname#22222
noname#22222
回答No.2

s_huskyです。 面目ない!余りにも冗長な書き方でした。 Private Sub txtHiduke_AfterUpdate()   Dim isNichiyo As Boolean   isNichiyo = CBool(Weekday(Me.txtHiduke) = 1)   Me.cmbJikan_1.Visible = isNichiyo   Me.cmbJikan_2.Visible = Not isNichiyo End Sub

mini_hana
質問者

補足

たびたびありがとうございますm(__)m再度質問させてください。 上記を参考にしようと思ったのですが、初心者なのでなんとなくはわかるのですが、よくわかりませんでした。ごめんなさい。 上記を見るとこコンボボックスが2つ用意されているように思うのは間違いなのでしょうか? 私が行いたいのは、フォームの日付(day1)を入力した際、時間(time1)のコンボボックスで、(day1)に入力した日付の条件(平日と土曜)の違いによって、(time1)で参照するテーブル(タイムテーブル、タイムテーブル土<時間コマID、時間>)を変えたいということです。可能でしょうか? タイムテーブルとタイムテーブル土のテーブルをひとつにまとめた方が簡単かも?と考えて現在はそちらを考えていたりします。しかし、そちらもき詰っています。 値集合ソースの中で、タイムテーブル:時間コマID、時間、youbi:datepart("W",Forms![フォーム名]![day1] として、time1に入力した場合に土曜なら数字の7が表示できるようにはなったのですが、条件を入れて、土曜(7)の時、時間コマIDが15-23、それ以外は1-14と設定できません。(どこに何を入れたらよいかわかりません) 他に何か必要なことがあればご質問ください。 何卒、よろしくお願いいたしますm(__)m

noname#22222
noname#22222
回答No.1

Private Sub txtHiduke_AfterUpdate()   Dim isNichiyo As Boolean   isNichiyo = CBool(Weekday(Me.txtHiduke) = 1)   If isNichiyo Then     Me.cmbJikan_1.Visible = True     Me.cmbJikan_2.Visible = False   Else     Me.cmbJikan_1.Visible = False     Me.cmbJikan_2.Visible = True   End If End Sub 論理式を駆使すれば2行でも書けると思います。 Me.Controls("cmbJikan_" & XXXX).Visible = True

関連するQ&A