アクセスで定数を利用したい

このQ&Aのポイント
  • フォームで取得した値を他のプロシージャやクエリでも利用したいと思っています。
  • 標準モジュールで定数を利用する方法について試してみましたが、うまくいきません。
  • 他のプロシージャで定数を利用する方法も試しましたが、正常に動作しません。
回答を見る
  • ベストアンサー

アクセスで定数を利用したい。

アクセスで定数を利用したい。 アクセス初心者です。 フォームで取得した値を他のプロシージやクエリでも利用したいと思っています。 標準モジュールで Public Sub 学年() Dim nen As Integer nen = Forms![F_start]![対象学年] end sub というのをつくってみましたがうまくいきません。"nen"というのを活用したいと思っています。 dim の代わりにpublic constを使ってみたりもしましたが,うまくできません。 また,nenを他のプロシージャで利用しようと思って,次のようなものもつくりましたが,うごきません。 Private Sub 学級編成1_Click() Dim nen As Integer Select Case nen Case nen = 1 DoCmd.OpenQuery "Q_学級編成1" Case nen = 2 DoCmd.OpenQuery "Q_学級編成2" Case nen = 3 DoCmd.OpenQuery "Q_学級編成3" End Select End Sub あとクエリの抽出条件にもつかいたいのですが・・・ ご指導よろしくお願いいたします。

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

  • ベストアンサー
  • layy
  • ベストアンサー率23% (292/1222)
回答No.5

初心者でしたね。 ちょっと難しい仕掛けかもしれませんので 以下参考レベルです。 DoCmd.OpenQuery "Q_学級編成1" ですが、 1)クエリ名を変数nenで構成し指定 DoCmd.OpenQuery "Q_学級編成" & nen 2)クエリ名をフォームの項目名で構成し指定 DoCmd.OpenQuery "Q_学級編成" & Forms![F_start]![対象学年] 3)クエリをSQLで実行し条件式を変数nen strSQL="select * from T_学級編成 where = xxxx" & nen こんな感じにすれば学年が何年であろうとクエリ名を考慮しておけば CASE文で各クエリを選ばなくてもできるように思います。 定数テーブル案についてですが、 何しようと変わらない値(ログインユーザ、システム日付、システムパス、レポート部数等の)保持に使いました。1レコードで。 自分が試したものと状況が同じなら、使ってみてもいいですが 実行結果をいろいろ確認してからにしてください。 別途フォームを作れば値変更も随時できますし、 DLOOKUP関数使えばこのテーブル1レコードのある項目値も取得できますから なにかと便利ではありました。 ★★★サンプル★★★ 【T_学級編成テーブル】 学年,性別,氏名 【T_対象テーブル】・・・・・・・・・・・定数値のテーブル 対象学年,対象クラス 【Q_学級編成】 SELECT T_学級編成.学年, T_学級編成.性別, T_学級編成.氏名, T_対象.対象学年, T_対象.対象クラス FROM T_学級編成, T_対象 WHERE (((T_学級編成.学年) Like [T_対象]![対象学年]));

その他の回答 (4)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

>nen = Forms![F_start]![対象学年] こんなことしないで、直接Forms![F_start]![対象学年]を 使う。 Select Case Forms("F_start").Controls("対象学年")     Case 1 '★ nen = 1ではない     以下略 End Select また、クエリの条件式に直接記述する。 SELECT ~ WHERE Gakunen = Forms![F_start]![対象学年] 勿論、フォームが開いていないとエラーになる。

wakusan
質問者

お礼

ありがとうございます。勉強になります。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

標準モジュール以外ではどこでも使いたい値を保持する方法として、定数テーブルという1レコードだけのものを用意してやるとかあります。 フォーム起動中のそのクエリなら、フォームに非連結のコントロールを準備し変数nenをセットしてやるのはどうですか。 クエリをDOCMDでなくSQLで実行させればWHERE部分を変数使った文字列にできます。

wakusan
質問者

お礼

ありがとうございます。 >標準モジュール以外ではどこでも使いたい値を保持する方法として、定数テーブルという1レコードだけのものを用意してやるとかあります。 まさにこれをしたいです。 もしよろしければ,つくり方を教えてください。

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

'--- 標準モジュール 宣言セクション----     Public nen As Integer   '----------------------------------- Function Gakunen() As Integer   Gakunen = Forms![F_start]![対象学年] End Function '------------------------------------ クエリでは変数なんて知ったこっちゃ無い! なので自前の関数にして クエリの抽出欄に Gakunen() とすれば・・・・                なのですが そもそもクエリで使うだけなら Forms![F_start]![対象学年]  を抽出条件に入れれば 事足りるでしょうし Select Case nen Case nen = 1   DoCmd.OpenQuery "Q_学級編成1"   Case nen = 2   DoCmd.OpenQuery "Q_学級編成2"   Case nen = 3   DoCmd.OpenQuery "Q_学級編成3" End Select も Select Case Forms![F_start]![対象学年]   Case  1   DoCmd.OpenQuery "Q_学級編成1"   Case  2   DoCmd.OpenQuery "Q_学級編成2"   Case  3   DoCmd.OpenQuery "Q_学級編成3" End Select とすればF_startが閉じられてなければ変数も使わなくて済みそうですけど? 参考リンク  変数の適用範囲 http://support.microsoft.com/kb/141693/ja

wakusan
質問者

お礼

ありがとうございました。 caseは私の記入ミスでした。 いろいろとすいませんでした。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

  Dim nen As Integerを削除して、  Publicステートメントで宣言セクションで宣言する   '--- 標準モジュール 宣言セクション----     Public nen As Integer   '----------------------------------- Public Sub 学年()   nen = Forms![F_start]![対象学年] end sub '------------------------------------ 因みに、nenは"定数"ではなくて"変数"です。  以上です。    

wakusan
質問者

補足

ありがとうございます。勉強になります。 もしよろしかったら,ここで取得したnenをクエリーの抽出条件に入れるにはどうしたらよいか教えてください。単に抽出条件の欄にnenと入れるだけではうごきませんでした・・・ すいません。

関連するQ&A

  • access レコードソースを選択し、DoCmd.OpenFormする方法

    Select Caseのフレームで、レコードソース(クエリ)を選択し、 そのソースを基にDoCmd.OpenFormする方法がわかりません。 よろしくお願いします。 ---------------------------------------------------- Dim strSource As String Dim Q1, Q2 As String Dim stDocName As String Dim フォーム1 As Form stDocName = "フォーム1" Q1 = "クエリ1" Q2 = "クエリ2" Select Case フレーム1 Case 1 strSource = Q1 Case 2 strSource = Q2 End Select 'stDocName.RecordSource = strSource '-----この文はこの位置でよいのでしょうか? DoCmd.OpenForm stDocName, acFormDS ---------------------------------------------------- クエリ1,クエリ2は基になるテーブルが違いますが、フィールドは同一にしてあります。 ですのでフォーム1には、対応するテキストボックスは用意してあります。

  • Access 追加クエリ実行時のメッセージを表示させない方法

    いつもお世話になっております。 Accessでフォームのボタンを押すと、追加クエリを12回実行させるよう、下記のように作っています。 Private Sub 年次請求_Click() Dim i As Integer For i = 1 To 12 DoCmd.OpenQuery "請求按分4" Next i End Sub しかし、追加クエリが実行される数だけ、メッセージが表示され、非常に鬱陶しいのです。。。 追加クエリを実行する際のメッセージを、表示させない方法をご存知でしたら教えてください。

  • 「クエリが閉じてるなら」「クエリが開いてるなら」

    Sub test() If クエリが閉じてるなら Then  DoCmd.OpenQuery "クエリ1" ElseIf クエリが開いてるなら Then  DoCmd.Close acQuery, "クエリ1" End If End Sub という事をやりたいのですが、 「クエリが閉じてるなら」 「クエリが開いてるなら」 のコードがわかりません。 よろしくお願い致します。

  • DAOでテーブルの内容を検索したいのですが…

    DAOでテーブルの内容を検索したいのですが… アクセス初心者です。 フォームで取得した値をテーブルで検索して命令するために,次のようなことをしてみましたが,FindFirstのところでエラーがでます。 どうしたらよいのかご指導ください。 コマンドボタンのイベントプロシージャで Private Sub テストテーブル作成_Click() Dim gakki As Integer Dim test As Integer Me.学期 = gakki Me.テスト = test Call testテーブル作成 End Sub として,標準モジュールに Sub testテーブル作成() Dim myDB As DAO.Database Dim myRS As DAO.Recordset Set myDB = CurrentDb Set myRS = myDB.OpenRecordset("T_生徒テスト") myRS.FindFirst "学期ID=" & "" & "gakki" & "" & "AND テストID =" & "" & "test" & "" If myRS.NoMatch = False Then DoCmd.OpenQuery "Q_TSテストA" DoCmd.OpenForm "F_テスト" DoCmd.Close Else DoCmd.OpenQuery "Q_TSテスト" DoCmd.OpenQuery "Q_テスト" DoCmd.Close DoCmd.OpenForm "F_テスト" End If myRS.Close: Set myRS = Nothing myDB.Close: Set myDB = Nothing End Sub としました。よろしくお願いします。

  • アクセスで複数データ削除

    myPath = "D:\" myfilename = Dir(TxB04) Do Until myfilename = "" DoCmd.TransferText acImportDelim, , "tbl1", myPath & myfilename, False myfilename = Dir Loop MsgBox "取込が正常に終了しました。" MsgBox "二重打刻をチェックしてます。" '取込ファイル名を変換します。 DoCmd.SetWarnings False DoCmd.OpenQuery "データ変換" DoCmd.OpenQuery "実績追加" DoCmd.OpenQuery "重複データ削除" DoCmd.OpenQuery "削除クエリ" DoCmd.SetWarnings True Cmd21.Enabled = False ★Kill (strInFPath)★ 'メッセージマスタ取得 Sqlstate2 = "SELECT * FROM 氏名登録なし;" Set M_MSG2 = MyDB2.OpenRecordset(Sqlstate2, dbOpenSnapshot) If M_MSG2.RecordCount > 0 Then DoCmd.SetWarnings False DoCmd.OpenQuery "くえり1" DoCmd.SetWarnings True End If Exit Sub Err_Set_Seisan_Click: End Sub 今、vbでこのようなデータ取込を作っており★のところで取込データを削除させてます。 ただこれだと1つのデータしか削除できず、複数あったときには対応が困ってます。 こちら歯どのような対応でできるでしょうか? ご指導お願いします。

  • ACCESSの検索について

    過去ログを見たのですが、該当するものが見つからなかったので質問させてください。 すでに入力してあるデータの生年月日から特定の月に誕生日を迎える人を検索したいと思っております。 クエリの検索条件で Like "*" & [Forms]![誕生日検索2]![テキスト0] & "*" とし、フォームの誕生日検索2のテキスト0に入力されたものを抽出したいのですが、クエリで開いてパラメータの入力のところでは「2008/07」とすれば今年の7月に誕生日を迎える人が抽出できるのに、フォームのテキスト0に同じように入力してもデータが抽出されません。 ちなみにフォームのイベントプロシージャは Private Sub コマンド2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) DoCmd.OpenQuery "誕生日検索" End Sub Private Sub テキスト0_AfterUpdate() DoCmd.Requery End Sub としております。 どこをどう直せばうまく抽出できるようになるのでしょうか?

  • アクセス フィールド名の変更

    フィールド名 [1],[2],・・・・を [090701],[090702],・・・ に変更するように Dim i As String Dim ret As String ret = InputBox("入力例  090701") i = ret DoCmd.RunSQL "SELECT [クエリ112].[1] AS [" & i & "], [クエリ112].[2] AS [" & i + 1 & "], ........中略 End Sub としましたが [090701],[90702],[90703],・・・ 2番目から 090702 になりません。 どのようにすればよいのか教えていただけませんか。

  • Access csvファイルの取り込み

    Access2021 2箇所の保存先の違う所からcsvファイルの取り込みについて伺います。 csv取り込みボタンは、2つ用意しています。 1つ目のボタンに、コード記述して動作確認は正常に動作して他のボタンも正常に動作。 2つ目にのボタンに、csvの格納パス名のみ変更後コード記述して動作確認したら全てのボタンが反応しなくなりました。 動作としては、削除クエリでテーブルのデータを削除してから、指定したフォルダからcsvファイルを選択して取り込ます。 同じテーブルを使用して、格納先の違うcsvファイルを使用する操作になります。 コードは、以下の通りです。 ①ボタン1 Private Sub コマンド61_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名①" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ②ボタン2 Private Sub コマンド62_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名②" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ご教授の程、宜しくお願い致します。

  • Accessのフォームのオープンのコマンド。

    テーブル1 ・名前 ・誕生日 ・年齢 フォーム1 ・名前 ・誕生日 ・年齢 ・コマンドボタン コマンドボタンのコード Private Sub コマンド6_Click() Age_Keisan End Sub 関数Age_Keisanのコード Private Sub Age_Keisan() Dim Age As Integer Dim Birth_Y As Integer Dim Birth_M As Integer Dim Birth_D As Integer Dim Now_Y As Integer Dim Now_M As Integer Dim Now_D As Integer Birth_Y = Left([誕生日], 4) Birth_M = Right(Left([誕生日], 7), 2) Birth_D = Right([誕生日], 2) Now_Y = Left(Date, 4) Now_M = Right(Left(Date, 7), 2) Now_D = Right(Date, 2) Select Case Birth_M Case Is < Now_M Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_M Age = Now_Y - Birth_Y - 1 Me![年齢] = Age Case Is = Now_M Select Case Birth_D Case Is <= Now_D Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_D Age = Now_Y - Birth_Y - 1 Me![年齢] = Age End Select End Select End Sub となっています。 これですと、年齢を入れて、ボタンを押さないと誕生日が過ぎた場合、年齢が増えていきません。 クエリーを使用してフォームをつくればよかったのですが、テーブルから直接フォームを作成しているので 計算もできません。 できればフォームのオープンコマンドに上記のボタンと同じような機能を入れたいのですが、 どのようにすればいいのでしょうか?

  • エクセルVBAでアクセスの更新クエリを実行

    エクセルVBAでアクセスの更新クエリを実行する方法はありますか? アクセスもエクセルも常に起動している状態です。 エクセルからアクセスの更新クエリを実行するコードを教えてください。 アクセスで実行するとしたら Sub test1() DoCmd.OpenQuery "更新クエリ" End Sub というコードになります。 できれば、ADODBを使ったやり方がいいのですが、 エクセルからアクセスのプロシージャーのtest1を呼ぶしかないのでしょうか?

専門家に質問してみよう