ID登録せずに、無料で質問できる♪ 教えて!gooアプリ>>

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

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/04 12:20

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/04 12:25

Weekday 関数でコンボボックスのレコードソースを


変えるとか・・

この回答への補足

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

補足日時:2006/07/03 11:35
    • good
    • 0

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

この回答への補足

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

補足日時:2006/07/03 15:43
    • good
    • 0

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング