ACCESSのフォームで、コンボボックスによる入力をするところがあるのですが、ここで、前回選択(または入力)した値を次に入力するときの既定値にすることは可能でしょうか。可能でしたら、その方法を教授ください。

A 回答 (3件)

フォームを閉じても情報を残す必要がある場合は、そのフォーム以外にデータ(規定値)を記録しておくことが必要です。

いろいろ考え方はあるかと思いますが、一般的な方法として、(1)Public変数に代入する。(2)テーブルにデータとして保存する。 の二通りが考えられます。

(1)の方法は、レスポンスが速く、構文も比較的容易にできますが、データベースを閉じてしまうと規定値もクリアされてしまいます。
(2)の方法は、多少処理が煩雑で、応答も(1)に比べると劣りますが、Accessを一旦閉じても規定値は保存されています。

と言うことで少々複雑になりますが、ここでは (2) の方法を提案させていただきます。

まず、規定値情報を保存するためのテーブル(名前を「TextParameter」:文字列情報のパラメーター全般を保存するテーブル)を作ります。
これに [pName] と [pValue] の二つのテキスト型フィールド(名前はこれにこだわらなくても好みでいいです。)をつくって、最初のレコードの[pName]に、「コンボ規定値」と入れてください。([pValue]は空欄でけっこうです。)

前回お示した、プロシージャの Me![コンボ].DefaultValue ~ の次の行に、以下を挿入してください。
DoCmd.RunSQL "UPDATE TextParameter SET pValue = '" & Me![コンボ] & "' WHERE [pName]='コンボ規定値';"
(更新クエリーで、TextParameterテーブルの pValueフィールドに、規定値を書き込む操作です。)

フォームの Open(開く時)イベントに、以下を記述してください。
Me![コンボ].DefaultValue = "'" & DLookup("pValue", "TextParameter", "pName='コンボ規定値'") & "'"
(コンボボックスの規定値に、テーブルに保存してある値をセットする操作です。)

多少複雑になってしまいましたが、たぶん、以上でご希望のことが可能かと思います。

DoCmd オブジェクト、RunSQL メソッド、アクション(更新)クエリー、DLookup 関数、のあたりを、HELP で確認してみてください。
    • good
    • 0
この回答へのお礼

再度の回答ありがとうございます。
アドバイスを参考に頑張ってみます。m()m

お礼日時:2002/02/14 16:16

追加回答がないようですので、代わりに。



まず、HELPで DefaultValue プロパティと BeforeUpdate、AfterUpdate イベントについて調べてみてください。その上で、・・・

フォームをデザインビューで開いて、コンボボックスのイベントタブの更新後処理(更新前処理でもOKだと思います)からイベントプロシージャを開いて、以下のように記述してください。
(コンボ : コンボボックスの名前、 入力するデータが文字列でなく数値なら、前後の "'" & と & "'" は不要)

Private Sub コンボ_AfterUpdate()
Me![コンボ].DefaultValue = "'" & Me![コンボ] & "'" ←この行を打ち込む
End Sub

以上で、コンボボックスの規定値は、最後に入力したコンボボックスの値と同じになります。

この方法では、フォームをを一旦閉じると、規定値もクリアされてしまいます。
再度フォームを開いた際にも規定値が残っていることが必要なら、多少工夫が必要ですので、補足要求をしてください。

この回答への補足

ありがとうございます。
半ばあきらめかけていたので、嬉しいです。
>再度フォームを開いた際にも規定値が残っていることが必要
その通り、というかこれがしたいことなんです。よろしくお願いいたします。
HELP、見ておきます。

補足日時:2002/02/13 18:08
    • good
    • 0

コンボボックス.DefaultValue = コンボボックス


って更新後処理ぐらいのイベントでしてみてはいかがでしょう?

この回答への補足

回答ありがとうございます。
が、何分、ACCESSは初心者なもので、おっしゃっている意味がよく分からないのですが…。^^;

補足日時:2002/02/04 13:49
    • good
    • 0

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

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

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

Q入力した値をコンボボックスにすぐに反映させる方法

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

Aベストアンサー

同じテーブルからリストを取得する為には、一度レコードを保存する以外ないようです。そのため今まで設定した「データ入力のチェック」を"いいえ"に戻し、「リスト外入力時」のボックスから"[イベントプロジージャ]"の文字を消したうえで、「更新後処理」に設定したモジュールの中身を下記のように置き換えます。

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

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

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

あまり綺麗な方法ではないですが、これが一番現実的な方法のようです。

Qコンボボックスからテキストボックスに連続して値を出したい

エクセルVBAのユーザーフォームで、コンボボックスで選択したものをコマンドボタンを押すことで、同じフォーム上のテキストボックスに表示するところまではできたのですが、同じテキストボックスに追記する形でコンボボックスで選択したものを表示したいのですが、可能でしょうか。テキストボックスは複数行表示できるようにプロパティのMultiLineはTlueに設定することはしたのですが、2回目以降コンボボックスで選択した後コマンドボタンを押してもそのまま上書きするようなコードしかわかりません。
テキストボックスに、20回目まで選択項目を追加表示し、最後にはエクセルのシートにそのデータをコピーしたいのです。果たして、そのようなことは可能でしょうか。可能であればどのように記述すればよいのでしょうか。ぜひ諸先輩方のお知恵をお貸しください。よろしくお願いします。

Aベストアンサー

テキストボックスの場合、改行コードも文字としてあつかっているので、区切りを自分で探す必要があります。
リストボックスだとlstBox.Items(i)のように1行ずつを簡単に抜き出すことができます。

エクセルのセルに順にセットするには
for i = 1 to 20
ActiveWorksheet.Range(1,i).Value = lstBox.Items(i)
next
のようになります。

20回までの制限はlstBox.Items.Countで登録済みのデータの数を確認できますので、IF文で判断すればできます。

Q【エクセル】既定で、入力値のハイパーリンクを無効にする

エクセルで、
セルにメールアドレス(user@domain.comなど)や
Webアドレス(http://www.domain.comなど)を入力すると

ハイパーリンク(=クリッカブルリンク)になります。

親切心でやってくれているのかもしれませんが、
作成されたエクセルファイルを開いて、クリックで
それらを利用する頻度はきわめて低いです。

なので、既定でその機能を無効にしたいと考えています。

下記のような解決方法はあります。

・個別にハイパーリンクを無効
→セル選択後、右クリックで、ハイパーリンクを無効

・シート毎、ファイル毎に無効にする方法
→http://support.microsoft.com/kb/417113/ja

ただ、今後エクセルファイル作成において
ハイパーリンク機能を既定で使いたくないので
個別ではなく、既定で変更する方法を教えてください。

使っているエクセルは2000,2003,2007です。
*どの解決方法でもいいです。バージョンによる操作の違いは
自分で解決します。

よろしくお願いします。

エクセルで、
セルにメールアドレス(user@domain.comなど)や
Webアドレス(http://www.domain.comなど)を入力すると

ハイパーリンク(=クリッカブルリンク)になります。

親切心でやってくれているのかもしれませんが、
作成されたエクセルファイルを開いて、クリックで
それらを利用する頻度はきわめて低いです。

なので、既定でその機能を無効にしたいと考えています。

下記のような解決方法はあります。

・個別にハイパーリンクを無効
→セル選択後、右クリックで、ハイパーリンクを無効

...続きを読む

Aベストアンサー

2003 の場合です。
[ツール] - [オートコレクトのオプション] - [入力オートフォーマット]タブの
「インターネットとネットワークのアドレスをハイパーリンクに変更する」
のチェックをはずしてください。

Q【EXCEL】あるセルにAという値が入力されたら既定範囲にマクロを自動実行したい

「あるセルにAという値が入力されると,既定範囲にマクロを自動実行する」ということはできますか?

たとえばB2に「欠席」という値が入ったらその下のB3~B8までセルを斜線にする.
    C3に「欠席」という値が入ったらその下のC3~C8までセルを斜線にする.

という感じです.マクロサイトもいくつかみたのですが分かりません.お願いします.

Aベストアンサー

#02です。
>結合して斜線1本にしたかったです
結合するならこんな感じでしょう。ざっとしかテストしてませんが…
ただしB3:B8の複数セルに値が入力されていると、先頭セル以外の値は消えてしまいますがよいですね。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r, trg As Range
 Set trg = Intersect(Target, Range("B2:C2"))
 If Not trg Is Nothing Then
  For Each r In trg
   If r.Value = "欠席" Then
    Application.DisplayAlerts = False
    r.Offset(1, 0).Resize(6, 1).Merge
    Application.DisplayAlerts = True
    r.Offset(1, 0).MergeArea.Borders(xlDiagonalDown) _
        .LineStyle = xlContinuous
   Else
    r.Offset(1, 0).Resize(6, 1).MergeCells = False
    r.Offset(1, 0).Resize(6, 1).Borders(xlDiagonalDown) _
        .LineStyle = xlNone
   End If
  Next r
 End If
End Sub

#02です。
>結合して斜線1本にしたかったです
結合するならこんな感じでしょう。ざっとしかテストしてませんが…
ただしB3:B8の複数セルに値が入力されていると、先頭セル以外の値は消えてしまいますがよいですね。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r, trg As Range
 Set trg = Intersect(Target, Range("B2:C2"))
 If Not trg Is Nothing Then
  For Each r In trg
   If r.Value = "欠席" Then
    Application.DisplayAlerts = False
    r.Offset(1...続きを読む

QExcel ユーザーフォームでコンボボックスを使用してデータ入力

Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。
コンボボックス:ComboBox1
テキストボックス1-3:TextBox1-3
コンボボックスのRowSource:シート名!A2:C100
コンボボックスの変更時の動作:
Me!TextBox1.Value = ComboBox1.Value

とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、
どのようにしたらいいのでしょうか?

Aベストアンサー

ComboBox1のクリックイベントに書いてみます。
  (当然ですが、ComboBox1のColumnCount=3です)

Private Sub ComboBox1_Click()
  With ComboBox1
    TextBox1.Text = .List(.ListIndex, 0)
    TextBox2.Text = .List(.ListIndex, 1)
    TextBox3.Text = .List(.ListIndex, 2)
  End With
End Sub


人気Q&Aランキング

おすすめ情報