Access2003でデータを指定してフォームを開くVBAの設定方法

このQ&Aのポイント
  • Access2003でデータを指定してフォームを開くVBAの設定方法を教えてください。
  • Access2003で社員の情報管理用データベースを作成中です。社員の入力済み基礎情報を参照するメインフォームと、新たに詳細情報を入力するためのサブフォームから成るデータ入力フォームを作成しました。このフォームを開く際に、InputBoxに社員番号を入力して該当社員を呼び出すよう、イベントプロシージャを記述しました。しかし、社員番号を入れずにフォームを開いたり、存在しない社員番号を入力したりすると、空のフォームが開かれてしまいます。
  • 以下の設定にしたいです。1. キャンセルをクリックした際にはフォームの開く動作がキャンセルされる。2. 空欄や存在しない社員番号を入力した際にはフォームが開かず、警告メッセージが表示されるようにしたい。
回答を見る
  • ベストアンサー

Access2003でデータを指定してフォームを開く時のVBAを教えてください。

Access2003で社員の情報管理用データベースを作成中です。 社員の入力済み基礎情報を参照するメインフォームと、新たに詳細情報を入力するためのサブフォームから成る"データ入力"フォームを作成し、メインとサブは"社員番号"でリンクさせました。 このフォームを開く時に、InputBoxに社員番号(アルファベットと数字が混ざった7文字)を入力して該当社員を呼び出すよう、以下のようにイベントプロシージャを記述したのですが、 社員番号を入れずに(あるいは存在しない社員番号や桁数を入力して)[OK]をクリックしたとき、もしくは[キャンセル]をクリックしたときにも白紙のフォームが開いてしまいます。 Private Sub Form_Open(Cancel As Integer) Dim stName As String stName = InputBox("社員番号を入力してください。", "社員番号入力", "半角英数7ケタで入力してください。") DoCmd.ApplyFilter, "社員番号='" & stName & "'" End Sub これを以下のような設定にしたいです。 1.[キャンセル]をクリックしたときにはフォームを開く動作がキャンセルされる 2.空欄、あるいはデータ上に存在しない社員番号を入力した状態で[OK]を押したときにはフォームを開かず、正しい社員番号の入力を促す警告メッセージが表示される 記述の仕方を教えていただきたいです。 どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

InputBox では、「キャンセル」=空欄になったと思います。 なので、空欄時は Cancel するものとします。 以下記述でどうなりますか。 (警告メッセージは出しませんが、社員番号の入力になります) Private Sub Form_Open(Cancel As Integer)   Dim stName As String   Do     stName = InputBox("社員番号を入力してください。", _           "社員番号入力", "半角英数7ケタで入力してください。")     If (Len(stName) = 0) Then       Cancel = True       Exit Do     End If     DoCmd.ApplyFilter , "社員番号='" & stName & "'"     If (Me.Recordset.RecordCount > 0) Then Exit Do   Loop End Sub 補足) このフォームを DoCmd.OpenForm で起動していたら、Cancel = True とすると、 その DoCmd.OpenForm 部分はエラー扱いされたと思います。 On Error Resume Next や On Error GoTo XXXX の記述が必要になると思います。

その他の回答 (6)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.7

#6です 私は 教えて! goo の方から回答させてもらってます。 #6の投稿メールが届いていないのに、お礼、補足のメールが先に届くというのも・・・ また、お礼が後から届いたので、解決されたのかな、と思ってました。 OKWaveの方で、お礼、補足の投稿日時を見たところ、補足の方が後だったのですね。 確認が遅れて申し訳ありません。 キャンセルはどうしても判別したい、 という補足があった場合用の回答も準備していたので、それも合わせて。 (MsgBox 部分は追加してみました) ・キャンセルを押した ・変更せずにOK押した ・初期表示を消しただけでOK押した この操作を「継続したくない為」、と(同じに)考えれば、 キャンセルを判別する必要はないような気がします。 Private Sub Form_Open(Cancel As Integer)   Dim stName As String   Const sDefMsg = "半角英数7ケタで入力してください。"   Do     stName = InputBox("社員番号を入力してください。", _           "社員番号入力", sDefMsg)     If ((Len(stName) = 0) Or (stName = sDefMsg)) Then       Cancel = True       Exit Do     End If     Me.Filter = "社員番号='" & stName & "'"     Me.FilterOn = True     If (Me.Recordset.RecordCount > 0) Then Exit Do     MsgBox("入力が間違っています。")   Loop End Sub で良いと思います。 次を入力 については、 Private Sub 次を入力_Click()   If MsgBox("続けて別な社員のデータを入力しますか?", vbYesNo) = vbYes Then     DoCmd.Close acForm, Me.Name     On Error Resume Next     DoCmd.OpenForm "データ入力"   End if End Sub で、エラーを無視すれば良さそうです。 (但し、Cancel = True を返すとフォームは消えちゃっていますが) 別案)Form_Open に記述した処理を流用します。 (ただし、現在表示している内容を変えないようにしないと・・・を注意します) Private Sub 次を入力_Click()   Dim stName As String   Const sDefMsg = "半角英数7ケタで入力してください。"   If MsgBox("続けて別な社員のデータを入力しますか?", vbYesNo) = vbYes Then     Do       stName = InputBox("社員番号を入力してください。", _             "社員番号入力", sDefMsg)       If ((Len(stName) = 0) Or (stName = sDefMsg)) Then         Exit Do       End If       stName = "社員番号='" & stName & "'"       If (IsNull(DLookup("社員番号", "テーブル名", stName))) Then         MsgBox("入力が間違っています。")       Else         Me.Filter = stName         Me.FilterOn = True         Exit Do       End If     Loop   End If End Sub ※ DLookup の "テーブル名" 部分は、正しいものに置き換えてください。 ※ このフォームのレコードソースと同じものですよね? 蛇足)Form_Open で Cancel = True を返す場合がある時の一例 このフォームを呼ぶ側ですが、順序立てて考え、構成していきます。   DoCmd.OpenForm "データ入力" Form_Open のパラメータを Cancel = True で戻ると、上記部分はエラー扱いされます。 エラー番号は 2501 になることを確認できます。 エラーの処理記述を追加していきます。 エラー番号が 2501 なら、また呼び出す。   On Error GoTo ERR_HAND   DoCmd.OpenForm "データ入力" ERR_HAND:   If (Err.Number = 2501) Then Resume これで、Cancel = True を返さなくなるまで、フォーム「データ入力」を呼び続けます。 無限にするのも嫌だと思うので、3回まで繰り返しましょうか、というようにするには、   Dim iCount As Integer   On Error GoTo ERR_HAND   iCount = 0   DoCmd.OpenForm "データ入力" ERR_EXIT:   Exit Sub ERR_HAND:   iCount = iCount + 1   if (iCount >= 3) Then Resume ERR_EXIT   If (Err.Number = 2501) Then Resume ここに、自フォームを閉じるのであれば、どこに記述すればよいのか考えます。 OpenForm 前ですると、自フォーム、データ入力とも消えてしまう場合があるので、   On Error GoTo ERR_HAND   iCount = 0   DoCmd.OpenForm "データ入力"   DoCmd.Close acForm, Me.Name DoCmd.Close では、誰を閉じるのか、を指定しておいた方が良いような気がします。 今回は、自分を閉じて自分を開いて・・・なので考えないといけないと思いますが。

nanachinan
質問者

お礼

回答ありがとうございます。無事できました。 一番めのシンプルな記述で行くことにしました。 前回は補足&お礼でわかりにくくてこちらこそすみません…。 私もgooからの利用ですが、投稿メール、平気で2日くらい遅れて届いてきますよね・・・。 とにもかくにも、何回もご親切にありがとうございました!

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.6

#4です DoCmd.ApplyFilter , "社員番号='" & stName & "'" だと連続でできないみたいなので、 Me.Filter = "社員番号='" & stName & "'" Me.FilterOn = True にしてみてください。

nanachinan
質問者

お礼

ありがとうございました! 無事できました。 ちなみに、最後のLoopの前に以下のようにメッセージボックスの記述を入れて、メッセージボックスも表示できました。 MsgBox("入力が間違っています。")

nanachinan
質問者

補足

ちなみに、この"データ入力"フォームを開いた後のことなのですが、 何人かのデータを続けて入力したい場合に、フォームに作ったコマンドボタン[次を入力]をクリックして、社員番号を入力し、新たな社員を呼び出す、 というかたちにしたく、コマンドボタンのクリック時のプロシージャを以下のように記述しました。 Private Sub 次を入力_Click() If MsgBox("続けて別な社員のデータを入力しますか?", vbYesNo) = vbYes Then DoCmd.Close DoCmd.OpenForm "データ入力" Else End if Exit_次を入力_Click: Exit Sub Err_次を入力_Click: MsgBox Err.Description Resume Exit_次を入力_Click End Sub つまり、見かけは連続入力(?)なのですが、実は単純に、いったん閉じてまた開く、という構造にしています。 (この方法以上に複雑なVBAは書けなかったので…。) しかしこの場合、再度開いたインプットボックスで、[OK]の処理は初回同様に問題ないのですが、 [キャンセル]をクリックするとエラーが出てしまいます。 エラーメッセージは「実行時noOpenFormアクションの実行はキャンセルされました」で、 デバックを押すと、4行目の「DoCmd.OpenFrom "データ入力"」の記述のところがマーカーされていて問題みたいなのですが、 どのように修正したらよいかわかりません・・・。 厚かましいお願いですが、もしおわかりになりましたら追加で教えていただけると助かります。 よろしくお願いします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

コード中の説明をいれておきます。 なお、 DoCmd.ApplyFilter , "社員番号=" & lnNumber DoCmd.ApplyFilter , "社員番号='" & lnNumber & "'" の部分はプログラム中でエラーの出ないほうを 選択してください。試していないので。バリアントで 定義しているのでどちらでもと思いますが。 Private Sub Form_Open(Cancel As Integer) Dim lnNumber As Variant lnNumber = InputBox("社員番号を入力してください。", "社員番号入力", "半角英数7ケタで入力してください。 ") 'キャンセルを押した場合 If StrPtr(lnNumber) = 0 Then MsgBox ("キャンセルですね。") Cancel = True '未入力でOKを押した場合 ElseIf Len(lnNumber) = 0 Then MsgBox ("社員番号を入力してください。") Cancel = True Else '数値を入力した場合 If IsNumeric(lnNumber) Then 'テーブルにない社員番号を入力した場合 If funcSearchNumber(lnNumber) = False Then MsgBox ("この社員番号は存在しません。") Cancel = True '正しい社員番号が入力された場合 Else '以下はいづれかで。 Cancel = False ' DoCmd.ApplyFilter , "社員番号=" & lnNumber ' DoCmd.ApplyFilter , "社員番号='" & lnNumber & "'" End If '数値でないものが入力された場合 Else MsgBox ("社員番号は半角英数7ケタで入力してください。") Cancel = True End If End If End Sub Private Function funcSearchNumber(myNumber As Variant) As Boolean Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T社員", dbOpenDynaset) rs.FindFirst "社員番号=" & myNumber If rs.NoMatch Then funcSearchNumber = False Else funcSearchNumber = True End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Function

nanachinan
質問者

お礼

やってみましたが、なぜかエラーになってしまい開けませんでした・・・。 デバックを押すと、 最後のほうの rs.FindFirst "社員ID=" & myNumber にマーカーがされていたのですが、よくわからず・・・ 今回は#4さんの記述でやってみることにしました。 でも、ご回答ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

関数の後処理を抜かしていたので訂正をします。 Private Function funcSearchNumber(myNumber As Variant) As Boolean Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T社員", dbOpenDynaset) rs.FindFirst "社員番号=" & myNumber If rs.NoMatch Then funcSearchNumber = False Else funcSearchNumber = True End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Function

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

メッセージがみな同じではどうもという 感じなので変更しました。以下文章が 同じものがくっついていますが。 社員番号があるテーブルをT社員とします。 InputBoxに入力する社員番号は、 >Dim stName As String だとすると文字型になってしまうし、 InputBoxに文字列が最初から入っている ことなどを考慮して、以下のように します。社員番号が存在するかどうかの 判定に関数を追加しています。 なお、社員テーブルをT社員としています。 必要に応じて変更してください。 Private Sub Form_Open(Cancel As Integer) Dim lnNumber As Variant lnNumber = InputBox("社員番号を入力してください。", "社員番号入力", "半角英数7ケタで入力してください。 ") If StrPtr(lnNumber) = 0 Then MsgBox ("キャンセルですね。") Cancel = True ElseIf Len(lnNumber) = 0 Then MsgBox ("社員番号を入力してください。") Cancel = True Else If IsNumeric(lnNumber) Then If funcSearchNumber(lnNumber) = False Then MsgBox ("この社員番号は存在しません。") Cancel = True Else Cancel = False End If Else MsgBox ("社員番号は半角英数7ケタで入力してください。") Cancel = True End If End If End Sub Private Function funcSearchNumber(myNumber As Variant) As Boolean Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T社員", dbOpenDynaset) rs.FindFirst "社員番号=" & myNumber If rs.NoMatch Then funcSearchNumber = False Else funcSearchNumber = True End If End Function

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

社員番号があるテーブルをT社員とします。 InputBoxに入力する社員番号は、 >Dim stName As String だとすると文字型になってしまうし、 InputBoxに文字列が最初から入っている ことなどを考慮して、以下のように します。社員番号が存在するかどうかの 判定に関数を追加しています。 なお、社員テーブルをT社員としています。 必要に応じて変更してください。 Private Sub Form_Open(Cancel As Integer) Dim lnNumber As Variant lnNumber = InputBox("社員番号を入力してください。", "社員番号入力", "半角英数7ケタで入力してください。 ") If StrPtr(lnNumber) = 0 Then MsgBox ("社員番号を入力してください。") Cancel = True ElseIf Len(lnNumber) = 0 Then MsgBox ("社員番号を入力してください。") Cancel = True Else If IsNumeric(lnNumber) Then If funcSearchNumber(lnNumber) = False Then MsgBox ("社員番号を入力してください。") Cancel = True Else Cancel = False End If Else MsgBox ("社員番号を入力してください。") Cancel = True End If End If End Sub Private Function funcSearchNumber(myNumber As Variant) As Boolean Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T社員", dbOpenDynaset) rs.FindFirst "社員番号=" & myNumber If rs.NoMatch Then funcSearchNumber = False Else funcSearchNumber = True End If End Function

関連するQ&A

  • Access2003でフォームにあるコマンドボタンで更にフォームを開く

    Access2003でフォームにあるコマンドボタンで更にフォームを開くときのVBA記述で困っています。 Access2003で社員情報管理のデータベースを作成中です。 社員の情報を入力するにあたり、【基本情報】と【詳細情報】とでフォームを分けてあり、【詳細情報】を入力したい場合は、"基本情報フォーム"にあるコマンドボタンをクリックして"詳細情報フォーム"を開くようになっています。 この際、"基本情報フォーム"で開いている社員の【社員番号】を"詳細情報フォーム"の【社員番号】欄にも自動的に表示させるため、以下のようなVBAを記述しました。 Private Sub コマンドボタン_Click() DoCmd.OpenForm "詳細情報フォーム" Forms![詳細情報フォーム![社員番号].DefaultValue = Me![社員番号] End Sub 【社員番号】は7ケタの半角英数で、社員によって、数字だけの場合と、英数混じっている場合とがあります(データ型はテキスト型にしてあります)。 困っているのは、 1.上記を実行した際に、数字だけの社員番号は問題ないのですが、英数混じりの場合だと"社員番号"テキストボックスが「#Name?」という表示になってしまう 2."基本情報フォーム"のコマンドボタンをクリックして新規の"詳細情報フォーム"を開き(社員番号のみが反映され、他の項目は空欄の状態)、詳細情報を入力→保存したあと、別の社員番号で"基本情報フォーム"を開き、コマンドボタンで"詳細情報フォーム"を開くと、前に入力した社員の情報が出てきてしまう。 (つまり、"詳細情報フォーム"のもととなるテーブルに、1行でもレコードがあると、それが出てきてしまう。) 【詳細情報】は、 1.データを入力する社員としない社員とがいる 2.新規でレコードを作成する場合と、既存のレコードを上書きする場合とがある ので、もととなる"詳細情報テーブル"にその【社員番号の】レコードがなければ新規入力画面を、レコードがあればそのレコードを呼び出す形にしたいのですが、英数混じりの表示の件も含め、どうすれば、正しく表示されるか教えていただきたいです。 ぜひぜひよろしくお願いします。

  • ACCESSのフォーム

    はじめまして。 個人データの管理でACCESSで名簿入力をしています。 入力のフォームを開く際に、 Private Sub Form_Open(Cancel As Integer) Dim Textname As TextBox Dim strmsg As String Dim varname As Variant Set Textname = Me.入力者表示 strmsg = "入力者氏名を入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname End Sub として、入力者の氏名を入力しています。 詳細は作成者でないので分かりかねますが、 フォームで非連結のテキストボックスを作成して、 なにかしら表示ができるようになっているみたいです。 これはフォームを開く際に出てきた小さい窓に一度だけ入力者氏名を 入力したら、そのままフォームを閉じるまでその氏名が反映されます。 現在、入力するものにコードというものがあるのですが、これも同じようにできないかと思っています。一日のデータ入力作業では 基本同じコードを使用し、一回一回コードを入力していました。 やはり人間の手によるものですから間違いがあり、 違うコードを入力してしまうと行方不明になってしまうのです。 コードも上記の入力者氏名と同じように、 フォームを開く際に出てくる小窓での入力は可能でしょうか? ちなみに現在商品コードを入力したら、コードの種別タイトルという ものが自動で出力される仕組みになっています。 それも反映されないといけないのです。 なにかお知恵を拝借させていただければと思います。 足りない情報があればご指摘ください。 宜しくお願いいたします。

  • 【アクセスVBA】テーブルにフィルタをかけたい

    Sub マクロ() DoCmd.OpenTable "Tテーブル", acViewNormal, acEdit DoCmd.ApplyFilter , "番号 = '123'" End Sub Tテーブルを開き、フィルタをかけたいのですが テーブルを開くまではできるのですが、 フィルタをかける行では 『ApplyFilter アクションの実行はキャンセルされました。』 になってしまいます。 DoCmd.OnFilter , "質問番号 = '0'" でもエラーになり、コードの実行すら行えません。 フォームではなくテーブルにフィルタをかけるにはどうすればいいでしょうか? よろしくお願いします。

  • ユーザーフォームの使い方、データ取得で困ってます。

    '作業用シート Private Sub CommandButton1_Click() Dim shinaName As String Dim shinaNo As String Dim sName As String Dim cName As String shinaName = InputBox("商品名を入力") shinaNo = InputBox("商品Noを入力") shinaDiv = InputBox("分類") sName = shinaName cName = shinaNo dName = shinaDiv 'ひな形シートをコピーし、シート名を商品名に Sheets("sheetnew").Select Sheets("sheetnew").Copy Before:=Sheets(1) Sheets("sheetnew (2)").Name = sName '各セルに商品名と商品コードを Worksheets(sName).Activate With ActiveSheet .Range("A2") = sName .Range("A3") = cName .Range("A4") = dName End With End Sub 構文が正しいのかわかりませんが、ビギナーなりに作ってみました(^^;; 作業用シートのボタンをクリックし、入力情報をもとに シートを新規追加していくのですが、この作業をInputBoxではなく、 ユーザーフォームを呼び出して、入力作業を1回で終わらせたいのです。 ユーザーフォーム1()内に下記5項目を作りました テキストボックス1() '商品名 テキストボックス2() '商品No リストボックス1() '分類1~3 登録ボタン() キャンセル() コマンドボタン1をクリックし、ユーザーフォーム呼び出しはOKです。 フォーム内のキャンセルボタンも機能します。 登録ボタンをクリックすると、どうもテキスト、リストボックス内容が 読み込めないみたいでエラーします。 sName = shinaName cName = shinaNo dName = shinaDiv このインプットボックスのように、変数にすると構文的(宣言の仕方?)に 駄目なのでしょうか? ユーザーフォームを見真似で作ってみたのですが、 どこに、どうセットして、どう呼び出して? また、入力されたデータをどう取得して、構文に組み込むのか? 、、、なんかこの辺りがゴチャゴチャしてわかりません。 追って説明して頂けると助かります、構文の作り方教えてください。

  • Accessの動作がおかしい?

    Accessのフォームで、メインフォーム/サブフォームを作りました。 メインフォームには、伝票番号や日付などの情報、サブフォームは、伝票番号でリンクし、その伝票に記載されている製品名・数量等の詳細情報がデータシートビューで表示されるようになっています。 さらのこのフォームを開く時にパスワードを設定してあります。 フォームをデザインビューで開き、「開くとき」のイベントにイベントプロシージャを選択。 Private Sub Form_Open(Cancel As Integer) If InputBox("パスワードを入力してください") <> "25b0" Then MsgBox "パスワードが違います" Cancel = True End If End Sub ↑このように表記しています。 さらに、別のフォームにメニュー画面を作り、メニューボタンを押すと、このフォームが開くようになっています。 当然、パスワードを聞いてきます。パスワードを入力すると無事、OPENするのですが・・・ 開いたフォームで、レコードの操作ができません。 「新規作成」や「レコードの削除」といったレコード操作ができません。(?_?) その状態から、一度、フォームをデザインビューに切り替えて、再度、通常のビューに切り替えると、もう一度パスワードを聞いてきます。 パスワードを入力すると、今度は通常通り使えるようになります。 どうしてこのようなことが起こるのでしょうか? 何か設定の方法などに間違いなどがあるのでしょうか??? いつもお手数おかけしてすみません。m(_ _)m よろしくお願いします。

  • フォームの検索で一致データが無い場合の表示

    簡単なシステムを作成している初心者です。 エクセル2003を使用しています。 コマンドウィザードを使用してVBAに入力されている状態です。 検索用のフォーム(F_番号検索)で番号を入力し(テキストボックス[番号入力欄])、検索コマンドを押し 一致した番号の情報のみ別フォーム(F_情報)に表示されます 一致した番号の情報がなくても F_情報のフォームが開いてしまうのですが、 これを別フォームでもしくはメッセージボックスで「一致する番号はありません」等の表示 をしたいのですが上手くいきません。 どうすればいいでしょうか・・・? Private Sub 検索_Click() On Error GoTo Err_検索_Click Dim stDocName As String Dim stLinkCriteria As String stLinkCriteria = "[番号]=" & "'" & Me![番号入力欄] & "'" DoCmd.OpenForm "F_情報", , , stLinkCriteria [Forms]![F_番号検索].Visible = True Exit_検索_Click: Exit Sub Err_検索_Click: MsgBox Err.Description Resume Exit_検索_Click End Sub

  • エクセル VBA ユーザーフォームの表示

    excel2000にてシートのB列のみで65行目以下をWクリックするとユーザーフォームが表示されるというコードを教えてください。 以下は調べたりした結果のコードです。B列をWクリックすると表示される状態です。 B60とかをクリックしても表示されないようにしたいです。 Worksheetのコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True If Target.Column = 2 Then 'B列なら   行 = Target.Row '行番号を取得する   UserForm1.Show 'ユーザーフォームを表示する End If End Sub 標準モジュールのコード Option Explicit Public 行 As Variant '行番号 Sub auto_open() Load UFnyuuryoku 'ユーザーフォームをメモリに読み込む End Sub ご存知の方よろしくお願いします。

  • アクセスのフォームでデーター入力用の一覧をだすために,VBAを使いまし

    アクセスのフォームでデーター入力用の一覧をだすために,VBAを使いました。 最初はORDER以降がなくWHEREからの()もなくて,組ID="&Me.C組で動いていたのですが,番号で昇順にする必要ができて,以下のように書くと一覧が表示できなくなりました… 書き方に間違いがあると思うんですが,初心者のためわかりません… どなたかご教授お願いいたします。 Private Sub Form_Open(Cancel As Integer) Me.生徒氏名.RowSource = "SELECT T_生徒.生徒ID, T_生徒.組ID, T_生徒.組, T_生徒.番号, [姓]+[名] AS 生徒氏名, T_生徒.性 FROM T_生徒 WHERE (((組ID) = & Me.C組)) ORDER BY T_生徒.番号 acs" End Sub

  • access フォームについて

    access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub

  • VBAのフォームについて

    今、悩んでいるというか、不思議に思っていることがあります。 ACCESS2003 VBAで、VBAコードでメインのフォームから、ある帳票フォームのインスタンスを作成しています。メインフォームのモジュールに以下のように記述し、 Dim 帳票1 as Form で、ボタンのクリックイベントで、 set 帳票1 = New Form_帳票の元フォーム とインスタンスを生成します。更に、この帳票フォームには、同様に子フォームを持っています。こちらも同様に帳票フォームモジュールに、 Dim 詳細1 as Form として、あるボタンのクリックイベントに、 set 詳細1 = New Form_詳細フォーム と、しています。ここで、帳票1の閉じるボタンを押しても、詳細1のフォームは、閉じません。 同様に、帳票の元フォームに Dim 帳票2 as form ボタンクリックで、 Set 帳票2 = New Form_帳票2の元フォーム とします。さらに帳票2の元フォームには、 Dim Child帳票 as Form ボタンクリックで、 Set Child帳票 = New Form_帳票2の元フォーム としています。 これで、Child帳票は、いくつもいくつもインスタンス化されます。そこで、今までの動作に準じて、たくさんあるChild帳票の大元を閉じると、こちらは子フォームが全部閉じます。例えば10個子フォームを作って、途中を閉じるとちゃんとその子だけが閉じます。最初の例の帳票1フォームを閉じても、詳細1フォームが閉じないのと、何が違うのか分かりません。私は、フォームが閉じるときには、そのメンバクラス(フォーム)は、破壊されるものだと思っていたのですが、そうでもないようです。どなたかわかりやすく、教えていただけないでしょうか?

専門家に質問してみよう