- ベストアンサー
Access+VB コンボックスに値を追加?
フォームで実行されている時に、コンボックスで選択値以外の数値(文字列)を入力したら、自動的にその値をコンボックスの選択値に追加する方法はないですか? 値集合タイプはテーブルです。 値リストでは実行中は出来そうなんですが、終了後追加した分は残らないみたいです。 どこかのサイトでその方法を見たような気がするんですが。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>を元に戻すには コメントにして下さい '<---を先頭に入れて下さい 気になった点だけ (1)コンボの最後の「;」を除いていますが区切りなので、そのままセットして良かったと思いますが、うまく動作しているのであれば現状のままでも良いと思います。 (2)以下は更新部分が不足しています。 > rss.AddNew > rss!項目名 = st rss.update 'これで初めて実更新されます rss.close '<--必ず行って下さい set rss = nothing '<--使用領域を開放しますので必須と思って下さい これでDBへの更新は出来ると思います。 DBの更新方法も色々記述がありますが、私は、余程の事がない限り、.addnew ...で記述(今のコーディング方法)するのが判り易くて良いと思います(^^)
その他の回答 (4)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
「値集合タイプ=値リスト」で実現させようとしているようですが、元になるデータがテーブルに存在しているのであれば、「値集合タイプ=テーブル/クエリ」で実現させることにした方が良いと思います。 簡単ですが、サンプルです。 ※コンボボックス用のテーブル「テーブル1」 ・フィールド1 [ID]/数値型/主キー ・フィールド2 [項目名]/テキスト型 ※フォームをコンボボックスに作成してください「コンボ0」 'イベント:フォーム_開く時 Private Sub Form_Open(Cancel As Integer) With Me.コンボ0 '値集合タイプ .RowSourceType = "Table/Query" '値集合ソース .RowSource = "SELECT 項目名 FROM テーブル1 Order By ID" '入力チェック .LimitToList = True End With End Sub 'イベント:コンボ0_リスト外入力時 Private Sub コンボ0_NotInList(NewData As String, Response As Integer) Static flgBusy As Boolean Dim strSQL As String 'エラーをシステムで通知させない Response = acDataErrContinue '排他状態の時は未処理 If flgBusy Then Exit Sub End If '排他フラグを立てる flgBusy = True '問い合わせ If MsgBox("追加しますか", vbYesNo) = vbNo Then Exit Sub End If 'IDを最大値より1を増やし、新たな項目を登録する strSQL = "" strSQL = strSQL & "INSERT INTO テーブル1 (ID,項目名)" & vbCrLf strSQL = strSQL & "SELECT IIf(IsNull(Max(ID)),0,Max(ID)) + 1 , '" & NewData & "'" & vbCrLf strSQL = strSQL & "FROM テーブル1" & vbCrLf Call CurrentDb.Execute(strSQL) 'コンボのリフレッシュ Me.コンボ0.Text = "" Me.コンボ0.Requery '最終行を選択 Me.コンボ0.ListIndex = Me.コンボ0.ListCount - 1 '排他フラグ解除 flgBusy = False End Sub
お礼
いつもご親切にありがとうございます。 サンプルコードまで書いて頂き恐縮です。 とても参考になりました、が、悲しいことにSQLは苦手で・・・ (私の技量がまだそこまでいってなくて) 今後ともよろしくです。
- arare2005
- ベストアンサー率31% (63/199)
フォームのレコード登録時に、コンボの内容も一緒に登録するのであれば、No.2さんの回答を参考にして下さい。 どうしても処理上、コンボの登録を先に行いたい場合は、マクロだけではアクセスの標準メッセージが出る様なので(ワーニングを止めるだけでは出ます/私はマクロでの止め方が判らないのでコメンなさいm(_ _)m)、以下の事を参考にして下さい。 ・データ:入力チェック=はい ・イベント:入力チェック=イベントプロシージャで下記 Private Sub コンボ0_NotInList(NewData As String, Response As Integer) Dim wCbo As String 'COMBO へ戻す Response = acDataErrContinue '標準 ERROR MESSAGE 抑制 If MsgBox("追加しますか", vbYesNo) = vbNo Then Exit Sub End If With Forms![フォーム2]![コンボ0] wCbo = .Text DoCmd.OpenQuery "クエリ1", acNormal, acEdit .Text = "" .Requery .Text = wCbo End With End Sub ※ここまで組むとINSERT のクエリ1 も書けば良いのでしょうが、時間が無くなったので... とりあえず、ここまでのアドバイスと言う事で...(^^; もしも、ご不明な点がありましたら、再度コメントをお願いします m(_ _)m
補足
ありがとうございます。 大変参考になりました。 結局#2さんへの補足に書いたようにしましたが、まだうまくいってません。 >Response = acDataErrContinue '標準 ERROR MESSAGE 抑制 を元に戻すにはどうしたらよろしいでしょうか。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
#1さんの発言にプラスです。 画面のコンボの名前が仮に「コンボ0」だとして、お話します。 コンボ0のプロパティ⇒値集合ソース の元になるテーブルにデータを追加し、VBAで コンボ0.Requery を発行すると、即座にコンボ0に反映されます。 >フォームを実行中、コンボックスに選択値以外の値を入力した時点でメッセージが「ダメ」と出るんです。 コンボ0のプロパティ⇒入力チェックを「いいえ」にすると回避されます。
補足
いつもありがとうございます いろいろやってみましたがうまくいかず、値集合タイプを値リストにし、入力チェック「はい」、リスト外入力時イベントをおきました。 汚いコードですが下記のようにしました。 Private Sub Form_Open(Cancel As Integer) Set rss = CurrentProject.Connection.Execute("テ-ブル名") sn = "" While rss.EOF = False sn = sn + rss("項目名") + ";" rss.MoveNext Wend rss.Close If sn <> "" Then sn = Left(sn, Len(sn) - 1) コンボ0.RowSource = sn End If End Sub Private Sub コンボ0_NotInList(NewData As String, Response As Integer) Response = acDataErrContinue '標準 ERROR MESSAGE 抑制 If MsgBox("追加しますか", vbYesNo) = vbNo Then Exit Sub st = コンボ0.Text コンボ0.RowSource = コンボ0.RowSource + ";" + st Dim db As DAO.Database Dim rss As DAO.Recordset Set db = CurrentDb Set rss = db.OpenRecordset("チェック名", dbOpenTable) rss.AddNew rss!項目名 = st End Sub 実行中はコンボに新しい値が入るのですが、元になるテーブルには反映されず再実行では表示されません。 上記の下から6行目あたりからよくわかりません。 テーブルに追加するには、どうしたらよろしいでしょうか?
- arare2005
- ベストアンサー率31% (63/199)
>値集合タイプはテーブルです。 そのテーブルに INSERT .... して下さい(^^)
補足
>INSERT つまりテーブルに追加したらいいと言う事ですか? 追加するコードまで行く前に、 フォームを実行中、コンボックスに選択値以外の値を入力した時点でメッセージが「ダメ」と出るんです。 その部分はいかがしたらよろしんでしょうか?
お礼
あぁ、なんかトンチンカンな補足質問だったです。 お蔭様で、バッチリ解決です。ありがとう御座いました。 _
補足
ありがとうございます。 解決しました。 フォーム側からVBで直接テーブル操作したことがないので困ってました。 >コメントにして下さい ですが、その部分はそのままにして役目が終わったらまた元に戻す、ということなのですが・・・(VB上で) 試し実行中のエラーメッセージを出したいわけで。