こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Access2000 一覧フォームからチェックボックスで選択して、別フォームへ結果を入力させたい

お世話になります。
Access初心者です。
説明もわかりづらいかと思いますが、どうかお願い致します。

アンケートフォームなどによくある機能で、
住んでいる地域を選択する時などに、「選ぶボタン」や「リンク」などから都道府県が一覧になっている別フォームが開いて、
その中はチェックボックスで選択するようになっており、
該当箇所にチェックすると、アンケートフォームに住所が入力?記載?されるというような動きがしたいです。
この説明だとおかしいですが、このチェックは複数選択が可能であることが条件になり、
なおかつ、データを入れるテーブルは下記のようにしたいのです。


<地域マスタテーブル>
地域CD 県名
1     北海道
2     秋田
3     岩手
4     山形





<アンケートテーブル>
アンケートNo. 氏名 地域
1        田中  1
1        田中  4
2        本田  3
3        中山  8
3        中山  12
3        中山  20





アンケートテーブルから、アンケートフォームを作成し、

|【アンケートフォーム】------------|
|アンケートNo.:1             |
|氏   名  :吉田           |
|地   域  :「選ぶボタン」      |
 --------------------------------

「選ぶボタン」を押すと、地域一覧フォームが出てきて、

<地域一覧フォーム>※チェックボックスで選択(複数可)    
■北海道
□秋田
□岩手
■山形
□宮城・・・・・・   


チェックをしたものが「地域」に入力される。
|【アンケートフォーム】------------|
|アンケートNo.:1             |
|氏   名  :田中           |
|地   域  :北海道  山形    |
 --------------------------------
※アンケートテーブルにはあくまでも、
アンケートNo. 氏名 地域
1        田中  1
1        田中  4
と、なる。
(主キーをアンケートNo.、氏名、地域の3つにしている為)


なにぶん超初心者ですので、解説もして頂けるととても嬉しいです。

どうか宜しくお願い致します。

投稿日時 - 2009-07-15 15:58:46

QNo.5127679

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#1,2です。趣味の世界に入ってしまって申し訳ありませんが、徒然なるままに、動的なコントロール配置にチャレンジしてみました。
Accessでやるのは初めてだったのと、欲張ってフォーム自体も動的に生成させたので、難航しました。
標準モジュールに記して下さい。
Dim formName As String
Dim ctlCheckName(47) As String
Dim ctlLabelName(47) As String

'アンケートフォームのコマンドボタン等のイベントから、このプロシージャを呼ぶ
Sub prefSelection()
Dim frm As Form
Dim ctlText As Control
Dim checkFormName As String
Dim ctlCheck(47) As Control
Dim ctlLabel(47) As Control
Dim ctlButton As Control
Dim i As Long, posX As Long, posY As Long

Set frm = CreateForm
formName = frm.Name
With frm
.RecordSelectors = False
.NavigationButtons = False
.ScrollBars = False
.DividingLines = False
End With
posX = 500
posY = 100
For i = 1 To 47
Set ctlCheck(i) = CreateControl(frm.Name, acCheckBox, , "", "", posX, posY)
ctlCheckName(i) = ctlCheck(i).Name
Set ctlLabel(i) = CreateControl(frm.Name, acLabel, , , "", posX + 200, posY, 2500, 400)
ctlLabelName(i) = ctlLabel(i).Name
'ラベルに設定する都道府県名を、都道府県名のマスターからよみこむ。
ctlLabel(i).Caption = DLookup("県名", "地域マスタテーブル", "地域CD='" & CStr(i) & "'")
If (i Mod 10) = 0 Then
posX = posX + 1200
posY = 100
Else
posY = posY + 400
End If
Next i
Set ctlButton = CreateControl(frm.Name, acCommandButton, , , "", 5200, 3500, 1500, 800)
ctlButton.Caption = "選択終了"
'動的に作成したコマンドボタンにイベントプロシージャを設定する
ctlButton.OnClick = "=prefSelectClose()"
frm.Caption = "都道府県選択(複数選択可能)"
DoCmd.OpenForm frm.Name
DoCmd.Restore
DoCmd.MoveSize , , 7000, 5000
End Sub

'コマンドボタンクリックで実行する関数
Public Function prefSelectClose() As Boolean
Dim i As Long
Dim myCtrl As Control
Dim buf As String

For i = 1 To 47
With Forms(formName)
If .Controls(ctlCheckName(i)).Value = True Then
If buf = "" Then
buf = .Controls(ctlLabelName(i)).Caption
Else
buf = buf & "," & .Controls(ctlLabelName(i)).Caption
End If
End If
End With
Next i
Forms("アンケートフォーム").地域TextBox.Value = buf
DoCmd.Close acForm, formName, acSaveNo
End Function
オブジェクト変数の配列にコントロールを入れたつもりがアクセスが思うようにいかず、結局名前でアクセスしています。

投稿日時 - 2009-07-18 01:20:29

ANo.2

#1です。WEBから都道府県名の一覧を取得し、
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130_070.html
を参考に、エクセルで47都道府県名をフィールド名として持つテーブルを作成しました。これを元に単票オートフォームを作ってみましたが、一番端のチェックボックスが1/3位に切れてしまって、TABで送って選択しないと、幅の調整(プロパティで数値で入力)が出来ないなんてトラブルもあり、すんなりとは行きませんでした。
アンケートフォームの選択した都道府県名のリストのテキストボックスに、選択された都道府県名をカンマ区切り文字列で入れるコードは、次の様にできます。
'地域選択フォームの、選択終了ボタンのコード
Private Sub 選択終了ボタン_Click()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim buf As String
Dim mySQL As String
Dim i As Long

DoCmd.Close acForm, "地域選択フォーム"
mySQL = "SELECT * FROM 地域選択ワークテーブル"
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open mySQL, cn, adOpenForwardOnly, adLockReadOnly
For i = 0 To 46
If rs.Fields(i).Value = True Then
If buf = "" Then
buf = rs.Fields(i).Name
Else
buf = buf & "," & rs.Fields(i).Name
End If
End If
Next i
Forms("アンケートフォーム").地域TextBox.Value = buf
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
次回地域選択フォームを開く時には、地域選択ワークテーブルのレコードを削除してやって、常に最初のレコードに書き込む様に設定する必要がありますが、ご自分でお願いします。
次に、アンケートフォームの書込ボタンで、アンケートテーブルに書き込むコードですが
Private Sub 書込ボタン_Click()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim buf As Variant
Dim i As Long

Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
buf = Split(Me.地域TextBox.Value, ",")
rs.Open "アンケートテーブル", cn, adOpenKeyset, adLockOptimistic
For i = 0 To UBound(buf)
rs.AddNew
rs.Fields(0).Value = Me.アンケートNoTextBox.Value
rs.Fields(1).Value = Me.氏名TextBox
rs.Fields(2).Value = buf(i)
Next i
rs.Update
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
といった感じでできます。コントロールの名前は、コードから読み取ってください。なお、直接都道府県名を書き込むコードになっていますので、対応する都道府県コードを書き込む様にするには、一ひねりが必要です
以上、ご参考まで。

投稿日時 - 2009-07-16 23:36:29

ANo.1

非連結のアンケートフォームと、非連結の地域一覧フォームを作成して、地域一覧フォームで選択したチェックボックスに相当する地域名を、カンマ区切りで、アンケートフォームの非連結テキストボックスに入れ、登録ボタンを押すと、ADOを用いて、テキストボックスの内容をsplitして、アンケートテーブルに登録するといった事は可能と思いますが、VBAの知識が不可欠と思います。
また、47個の非連結のチェックボックスを制御するのは、ラベルとチェックボックスは別物なので、非常に煩雑なコードになりそうです(ラベルとチェックボックスをコードで動的に配置できれば管理は楽ですが)。それよりも、コンボボックスで、地域マスターの内容を表示して、複数選択可能にする方が、ずっと楽に実現できると思います。
どうしてもチェックボックスでやりたければ、47都道府県をそれぞれフィールド名にもつBoolean型のワークテーブルを作成して、単票のオートフォームを生成したのを用いる手もあるかもしれません。
構想だけ記してみましたが、上記の一部分でも独力で作れるスキルのある方でないと、実現は難しいと存じます。

投稿日時 - 2009-07-15 22:59:52

補足

mitarashiさんありがとうございます。
元々、設計段階ではAccessで作る予定ではなかったものを、無理やりAccessで作ろうとしているが為、
テーブル設計などの無理が生じてきているのかもしれません。。

後記の単票テーブルを作成する手はなるほどと思い、
例えば1(北海道)にチェックが入ったら<アンケートテーブル>にデータを追加・・・としたかったのですが、
insert文がうまく作成できず、悩んでいます。
そもそもinsert文ではないのかな・・・?

もしこの場合だと、どのようなコードになるか、ご指導頂けますでしょうか?
どうか、宜しくお願い致します。

投稿日時 - 2009-07-16 11:14:30

あなたにオススメの質問