テーブルでコンボボックスから選んでデータを入力したい場合、コンボボックスの内容を他のテーブルやクエリあるいは値リストから抽出する方法はわかりますが、コンボボックスの内容に該当するものが無い場合、一覧から選ばずに、手入力することにしたいと思っています。そこで、手入力した後次のレコードに移動した時にコンボボックスの内容に手入力した内容がすぐに反映するようにしたいのですが、うまい方法は無いでしょうか?私としてはいちいち他のテーブルを開いて入力したりせずにしたいのですが・・・

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

A 回答 (5件)

同じテーブルからリストを取得する為には、一度レコードを保存する以外ないようです。

そのため今まで設定した「データ入力のチェック」を"いいえ"に戻し、「リスト外入力時」のボックスから"[イベントプロジージャ]"の文字を消したうえで、「更新後処理」に設定したモジュールの中身を下記のように置き換えます。

' レコードを保存し、コンボボックスのリストを再作成します。

DoCmd.RunCommand acCmdSaveRecord
Me![(コンボボックス名)].Requery

(*)例によって同じフォーム内に、同じテーブル(クエリー)からリストを作っているコンボボックスがあるなら、その分も上記とまったく同じ構文で行を作成します。

あまり綺麗な方法ではないですが、これが一番現実的な方法のようです。
    • good
    • 0
この回答へのお礼

試してみたところうまくいきました!大変ありがとうございました。(お礼が遅れてしまいすみませんでした。)

お礼日時:2001/03/19 12:04

回答が何回にも分かれてしまってすみません。


たしかにクエリーを元にしている場合など、おっしゃる通りの手順を踏まないとリストが更新されないみたいですね。

コンボボックスのプロパティを開き、「更新後処理」から開いたモジュール作成画面で、"Private Sub~"の行と"End Sub"の行の間に、

Me![(コンボボックス名)].Requery

という行を作成してみてください。
同じフォーム内に、同じテーブル(クエリー)からリストを作っているコンボボックスがあるなら、その分も上記とまったく同じ構文で行を作成してみてください。

これで、おそらくコンボボックス更新後にすぐ反映されます。

この回答への補足

すみません。そもそもフォームプロパティの入力チェックの項目を「はい」に変更する操作を行っていませんでした。結果問題なく動作しました。ありがとうございました。ところで、この方法はコンボボックスの値の取得元(例えばテーブルB)がフォームを作成する元になったもの(例えばテーブルA)と別な場合にうまくいきますが、私がやりたい方法としてはコンボボックスの値の取得元が同じテーブルAである場合です。もちろんそのまま取得すると様々な重複した値がそのままコンボボックスの内容になりしますので、重複したデータを自動的に1個にするクエリAを作成して(これは問題なくできました)そのクエリAをコンボボックスの値の取得元にしてみましたが、次のレコードへ移動する前にエラーが表示され、モジュール文の.AddNewのところでとまってしまうようです。そこでフォームプロパティの入力チェックの項目を「いいえ」に変更したところ、次のレコードへ移動しましたが、“更新”に匹敵する操作を行わない限りコンボボックスの値に反映されませんでした。いろいろと文句ばかり言うようで、もうしわけありませんが、上記の内容を解消できる術がありましたらご教示ください。

補足日時:2001/03/15 18:50
    • good
    • 0

再検証してみたのですが、先に紹介したモジュールではやはりフォームでの入力直後にリスト追加されるようですけれど、お使いの環境ではうまくいっていないのでしょうか?


もう一度確認してみてください。

それと、下記のモジュールに一点修正個所があります。
「.Update」の行と「End With」の行の間に一行、

.Close

というrecordset終了行が抜けていました。下記のモジュールをコピーしていた場合、追加しておいてください(なくても動作上不具合はないようですが)。
モジュールに抜けている行があり、すみませんでした。

この回答への補足

フォームプロパティの入力チェックの項目を「はい」に変更する操作を行っていませんでした。結果問題なく動作しました。ありがとうございました。ところで、この方法はコンボボックスの値の取得元(例えばテーブルB)がフォームを作成する元になったもの(例えばテーブルA)と別な場合にうまくいきますが、私がやりたい方法としてはコンボボックスの値の取得元が同じテーブルAである場合です。もちろんそのまま取得すると様々な重複した値がそのままコンボボックスの内容になりしますので、重複したデータを自動的に1個にするクエリAを作成して(これは問題なくできました)そのクエリAをコンボボックスの値の取得元にしてみましたが、次のレコードへ移動する前にモジュール文の.AddNewのところでとまってしまうようです。そこでフォームプロパティの入力チェックの項目を「いいえ」に変更したところ、次のレコードへ移動しましたが、“更新”に匹敵する操作を行わない限りコンボボックスの値に反映されませんでした。いろいろと文句ばかり言うようで、もうしわけありませんが、上記の内容を解消できる術がありましたらご教示ください。

補足日時:2001/03/15 18:46
    • good
    • 0

Ms Accessではテーブル(クエリー)を元にしたコンボボックスコントロールへリスト外入力を行う事があり、なおかつそれをリストに加えたいという場合、フォームを使用します。



そのため、まずは「コンボボックスから選んでデータを入力したい」テーブルに関連付けたフォームを作成します。いろいろとフォームには作成手順があるのですが、今回のご質問のケースの場合、テーブルに直接入力する事を考えられていたわけですからウィザードを使用して「データシート」で作成してもいいと思います。

次に作成したフォームをデザイン画面(編集画面)で開き、目的のコンボボックスを右クリックして「プロパティ」を開きます。そして開いたダイアログの表示を「イベント」のページに切り替え、ストの中の「リスト外入力時」を選択し、右側に現れた「…」ボタンを押します。するともう一枚ダイアログが表示されると思いますのでその中から「コードビルダ」を選択してください。これで、モジュール作成画面が開くはずです。

そして、画面が切り替わり、モジュール作成画面んが開いたら、"Private Sub~"の行と"End Sub"の行の間に、下記のサンプルを貼り付けてみてください。
ただし、これはあくまでサンプルですので、このままでは動きません。
(テーブル名)の部分はリストのもとになっているテーブル名へ、
(フィールド名)の部分はそのテーブル内のリストが格納されているフィールド名へ、
それぞれ変更してください。

それが終了したらモジュールを保存して作成画面を閉じ、フォームのデザイン画面でまだ開いているはずのコンボボックスのプロパティのページを「データ」に切り替え「入力チェック」の項目を「はい」に切り替えてフォームを保存するだけです。

下記のモジュールの動作確認は済んでいますのでおそらくそれでご希望の機能が動くと思います。

---

Response = acDataErrAdded

Dim rst As Recordset
Dim mydb As Database
Dim crnttbl As String

'現在のリスト一覧をテーブル(クエリー)から取得します。

Set mydb = CurrentDb
crnttbl = "(テーブル名)"
Set rst = mydb.OpenRecordset(crnttbl)

'リストに新規レコードを入力し、取得元テーブルを更新します。

With rst
.AddNew
![(フィールド名)] = NewData
.Update
End With

この回答への補足

細かな所まで説明して頂いて非常に助かりました。実際に試してみましたが、データシートビューのフォームではツールメニューの”レコード”→”更新”を実行して新しい値がコンボボックスに反映されるようです。欲をいって申し訳ありませんが、別のフィールド(レコード)へ移動したらすぐに反映されるようにしたいのですが、無理でしょうか。

補足日時:2001/03/15 14:56
    • good
    • 0

アプリケーションは何を使用されているのでしょうか?(名前とバージョンを教えてください)


アプリケーションによってやり方が変わりますのでそのあたりを教えて頂けないと皆さん回答に困られると思いますよ。

この回答への補足

質問内容が不十分でした。ACCESS2000を使用しています。宜しくお願い致します。

補足日時:2001/03/14 17:19
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法

ユーザーフォームにコンボボックス2個textboxが2個あります
コンボは選択のみです。
コンボとtextbox1は入力必須にして、空欄でコマンドボタンが押された時はメッセージを表示したいです
OKwebを参考に作ったのですが、コンボ1が空欄でもMsgが出ません
願いします

Private Sub CommandButton1_Click()
Dim ctrl As Control, tst1 As String, txt2 As String
Dim ws As Worksheet

Set ws = Sheets("sheet1")
For Each ctrl In Me.Controls
Select Case ctrl.Name
Case "ComboBox1", "ComboBox2", "TextBox1"
If Me.Controls(ctrl.Name).Value = "" Then
txt1 = txt1 & ctrl.Name & vbLf
Else
txt2 = txt2 & Me.Controls(ctrl.Name).Value & vbLf
End If
End Select
Next
If Len(txt1) > 0 Then
MsgBox "以下の値を入力してください" & vbLf & txt1, vbExclamation
Exit Sub
Else
ret = MsgBox("以下の値を入力します" & vbLf & txt2, vbOKCancel)
If ret <> vbOK Then Exit Sub

ユーザーフォームにコンボボックス2個textboxが2個あります
コンボは選択のみです。
コンボとtextbox1は入力必須にして、空欄でコマンドボタンが押された時はメッセージを表示したいです
OKwebを参考に作ったのですが、コンボ1が空欄でもMsgが出ません
願いします

Private Sub CommandButton1_Click()
Dim ctrl As Control, tst1 As String, txt2 As String
Dim ws As Worksheet

Set ws = Sheets("sheet1")
For Each ctrl In Me.Controls
Select Case ctrl.Name
Case "ComboBox1", "ComboBox2", "...続きを読む

Aベストアンサー

こんにちは。

バグらしいバグは掲載されたソースからは読み取れません。ComboBox に
どのようにデータを追加しているのか、どのようなデータなのかあたり
からも検証しないと。

また、ソースが途中で途切れてますよ。ちゃんと End Sub まで、掲載して
下さい。

とりあえず、新規ブックで Userform を挿入し、

 ・Textbox1
 ・ComboBox1
 ・ComboBox2
 ・CommandButton1

をそれぞれ配置してから、下記ソースを貼り付けて動かしてみて下さい。

Private ws As Worksheet

Private Sub UserForm_Initialize()
  
  Set ws = Sheets("sheet1")
  
  ' // ComboBox 用テストデータ作成
  ws.Cells.Delete
  With ws.Range("A1:C10")
    .Formula = "=""R""&ROW()&""C""&COLUMN()"
    .Value = .Value
  End With
  With ws.Range("D1:D10")
    .Formula = "=""ITEM""&ROW()"
    .Value = .Value
  End With
  ' // 選択 ONLY のコンボボックス(fmStyleDropDownList)に
  ' // データを追加する
  With Me.ComboBox1
    .Style = fmStyleDropDownList
    .ColumnCount = 2
    .List = ws.Range("A1:C10").Value
  End With
  With Me.ComboBox2
    .Style = fmStyleDropDownList
    .List = ws.Range("D1:D10").Value
  End With

End Sub

' // Style が fmStyleDropDownList のコンボボックスで値を消去できるようにする
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 8 Or KeyCode = 46 Then ' 8:backspace / 46: delete key
    ComboBox1.ListIndex = -1
  End If
End Sub
Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 8 Or KeyCode = 46 Then ' 8:backspace / 46: delete key
    ComboBox2.ListIndex = -1
  End If
End Sub

Private Sub CommandButton1_Click()

  Dim ctrl As Control, txt1 As String, txt2 As String
  Dim ret As Integer
  
  For Each ctrl In Me.Controls
    Select Case ctrl.Name
      Case "ComboBox1", "ComboBox2", "TextBox1"
        If Len(Trim$(ctrl.Text)) = 0 Then
          txt1 = txt1 & ctrl.Name & vbLf
        Else
          txt2 = txt2 & ctrl.Text & vbLf
        End If
      Case Else
    End Select
  Next
  
  If Len(txt1) > 0 Then
    MsgBox "以下の値を入力してください" & vbLf & txt1, vbExclamation
    Exit Sub
  Else
    ret = MsgBox("以下の値を入力します" & vbLf & txt2, vbOKCancel)
    If ret <> vbOK Then Exit Sub
  End If

End Sub

追伸:: ....余計なお世話ですが。

■1点目: 変数名が違います。

> Dim ctrl As Control, tst1 As String, txt2 As String

txt1 As String ですよね。このようなミスを防ぐ意味で、Option Explicit
を宣言のうえ、プログラムを作成する習慣をつけた方が、上達が速いですよ。

■2点目: For Each ループについて

For Each ctrl In Me.Controls のループで

> Me.Controls(ctrl.Name).Value

とするのは、折角 For Each を使う意味が無くなってしまいますから、
そのまま ctrl.value とか、ctrl.text で使って下さい。

こんにちは。

バグらしいバグは掲載されたソースからは読み取れません。ComboBox に
どのようにデータを追加しているのか、どのようなデータなのかあたり
からも検証しないと。

また、ソースが途中で途切れてますよ。ちゃんと End Sub まで、掲載して
下さい。

とりあえず、新規ブックで Userform を挿入し、

 ・Textbox1
 ・ComboBox1
 ・ComboBox2
 ・CommandButton1

をそれぞれ配置してから、下記ソースを貼り付けて動かしてみて下さい。

Private ws As Worksheet

Private Sub ...続きを読む

Qコンボボックスの値が変更されたらそのコンボボックスに表示されたURLを開きたい

データ型がハイパーリンクの文字列が入力されたテーブルをコンボボックスに表示させています。(添付画像参考)
希望は、
プルダウンでURLを選択したと同時にリンク先へ飛びたいです。
現在は、
プルダウンでURLを選択→コンボボックスをクリック
でリンク先に飛んでいます。
多分コンボボックスのChangeイベントだと思うのですが
どうすればいいのでしょうか?

アドバイスよろしくお願いします。

Aベストアンサー

No.2です。

> ""を開いています。

このメッセージから、推測される原因を確認した結果、
おおよそ状況がつかめました。

前回回答前のこちらでのテストでは、ハイパーリンク型
フィールドへのファイルのドラッグ&ドロップでアドレス
を記録したのですが、この場合、入力データにカーソルを
合わせた後、F2キーで編集モードにすると
「http//www.goo.ne.jp/#http//www.goo.ne.jp/#」
と、アドレスが二重に表示されます。
(実際には1個目のアドレスは文字列としての表示、
 2個目のアドレスが実際のリンク先)

一方、Webブラウザなどからアドレスをコピー&ペースト
した場合は
「#http//www/goo.ne.jp#」
と、実際のリンク先のアドレスのみが記録されますが、
このデータを「Call FollowHyperlink(コンボ0)」の
形で参照すると、エラーとなってしまうようです。
大変失礼致しました。


対処法としては、「データの先頭文字が『#』かどうかで
切り分け」も考えましたが、今回の件では「Follow」を
使用した方がよさそうです(汗)

Private Sub コンボ0_AfterUpdate()

  If Nz(コンボ0, ") = "" Then Exit Sub

  'コンボ0に記録されたハイパーリンクを実行
  '(FollowHyperlinkと違い、アドレスを引数とする必要
  ' はなし。こちらの詳細もヘルプを参照下さい(汗))
  コンボ0.Hyperlink.Follow

End Sub

No.2です。

> ""を開いています。

このメッセージから、推測される原因を確認した結果、
おおよそ状況がつかめました。

前回回答前のこちらでのテストでは、ハイパーリンク型
フィールドへのファイルのドラッグ&ドロップでアドレス
を記録したのですが、この場合、入力データにカーソルを
合わせた後、F2キーで編集モードにすると
「http//www.goo.ne.jp/#http//www.goo.ne.jp/#」
と、アドレスが二重に表示されます。
(実際には1個目のアドレスは文字列としての表示、
 2個目のアドレスが実際...続きを読む

Qエクセル コンボボックスで選んだ文字を

エクセルにて
コントロール ツールボックスで、コンボボックスを作りました。
コンボボックス内の項目は都道府県名を選べるようにした場合
北海道を選んだらA1に北海道
沖縄を選んだらA1に沖縄と
コンボボックスで選んだ文字がA1へ返されるようにしたいのですが
どのようにすれば宜しいのでしょうか?

ご存知の方いらっしゃいましたら宜しくお願い申し上げます。

Aベストアンサー

#1のご回答どおりですが、
ツールバーの編集モードのアイコン(定規と鉛筆)をクリックして
編集モードに入る(へっこんだ感じになる)
8個の小さい丸が辺に現れる
コンボ上で右クリック
プロパティウインドウが現れる
LinkedCellを探し右枠に「A1」と入れる。(通常の番地表記式で入力する。1セルだけしか指定できない。
上記編集モードのアイコンをクリックして、編集モードを脱する。
ほかにVBAでも設定もできる。
ーーー
似たようなもので、入力規則の「リスト」りようあり。
ーーー
ほかに似たものとして、ListFillRangeがあり、複数セルを指定可。

Qエクセルのマクロ コンボボックス他について

下記のプログラムでユーザーフォームを作成しました。
まったく同じ記述で、他のブックでは、最終処理として、所定の箇所に選択した記号が表示(コピー)されるのですが、このブックでは表示されません。
しかし、エラーは出ていないので文法的には合っているようにおもいます。
それだけに、どこが違うのか尚更わかりません。

なお、Unload UserForm1 を Unload UserForm にした場合、
Sheets("基本データ作成").Range("C3") = UserForm1.ComboBox1.Value の UserForm1 を
UserForm にした場合、
「実行時エラー424、オブジェクトが必要です。」のエラーが出ます。
どこが悪いのかわかりません。
どなたか、教えてください。

なお、エクセルは2003、OSはXPです。

Private Sub ComboBox1_Change()
End Sub

Private Sub ComboBox2_Change()
End Sub

Private Sub ComboBox3_Change()
End Sub

Private Sub CommandButton1_Click()
Unload UserForm1
Sheets("基本データ作成").Range("C3") = UserForm1.ComboBox1.Value
Unload UserForm1
Sheets("基本データ作成").Range("C4") = UserForm1.ComboBox2.Value
Unload UserForm1
Sheets("基本データ作成").Range("C5") = UserForm1.ComboBox3.Value
End Sub

Private Sub UserForm_initialize()
With ComboBox1
.AddItem "U"
.AddItem "K"
.AddItem "E"
End With
With ComboBox2
.AddItem "A"
.AddItem "B"
.AddItem "C"
End With
With ComboBox3
.AddItem "D"
.AddItem "E"
.AddItem "F"
End With
End Sub

下記のプログラムでユーザーフォームを作成しました。
まったく同じ記述で、他のブックでは、最終処理として、所定の箇所に選択した記号が表示(コピー)されるのですが、このブックでは表示されません。
しかし、エラーは出ていないので文法的には合っているようにおもいます。
それだけに、どこが違うのか尚更わかりません。

なお、Unload UserForm1 を Unload UserForm にした場合、
Sheets("基本データ作成").Range("C3") = UserForm1.ComboBox1.Value の UserForm1 を
UserForm にした場合、
...続きを読む

Aベストアンサー

#1です。

エラーも出ないで、思った動作にもならないとは思えませんが、、、
質問に書いたコード以外にも記述があるのかな?

> 最終処理として、所定の箇所に選択した記号が表示(コピー)される

ここでいう「最終処理」とはCommandButton1をクリックする事で、「所定の箇所」とは基本データ作成シートのセルC3~C5の事で、「記号」とは各ComboBox1~3の値(AとかKとか)ですよね?

> 一度閉じてしまったユーザーフォームの画面を開けるには

Show メソッドを呼ぶだけです。
ユーザーフォームのオブジェクト名が UserForm1 なら

 UserForm1.Show

QAccess2003フォームでコンボボックスの内容が消える。

こんにちは。
Access2003について質問させてください。

フォームにコンボ[1]コンボ[2]コンボ[3]があり
[1]の選択結果によって[2]、[2]の選択結果によって[3]の内容が変わるように
SQLステートメントの抽出条件に[forms]![フォーム名]![○○○]で設定をしています。
これで、テーブルにはきちんと入力データが保存されているのですが、
次回フォームを開いたときにコンボ[2][3]が空欄になっています。

どうしてなのでしょうか?
フォームにも表示させておく方法があれば教えて下さい。

Aベストアンサー

>フォームは入力用の設定はなく

>フォームを開くときのイベントにも
>コンボボックスを再クエリするコードを入れましたが
>やはり表示されません(>_<)
なんか変なやり方をしているのでしょうね

実物を見ないで想像だけでそれが何かを言い当てるのは
できそうにありません

誰か身近のAccessのできる人に実物を見てもらってください
たぶんそんな難しいことじゃないでしょから
大ベテランでなくても大丈夫だと思いますよ


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報