プロが教える店舗&オフィスのセキュリティ対策術

教えてください。
1)フォームでテキストボックス2つ、ボタンで新しい入力フォーム表示
2)入力フォームでチェックボックス6個、コンボボックス6個を作ります。
3)チェックボックスにチェック(1個のみ)したら、1)のフォームのテキストボックスにチェックされた、項目とコンボボックスで選択された内容が転記したい。
例)果物にチェック、コンボでブドウと選択
 テキストボックス→果物 ブドウ
というようにフォームに転記させたい。
以前、シートでのマクロを教えていただきましたが、フォームだと頭が混乱してしまいました。
簡単で良いので、マクロの記述を教えてください。

A 回答 (6件)

遅くなりました、takachan7272です。



会社にOffice2000のPCが有るので試してみました。
問題なく動きました。
1つ伝えていなかった事がありました。
Form2にはオプションボタンは6つ無いとダメです。
コンボボックスは3つしか使っていませんが・・・
私のサンプルコードは、For~Nextで6回ループさせて、チェックが入っているオプションボックスを確認しています。
6個無いと・・・見付かるはずがないですね・・・
For i = 1 To 6 Step 1
↑の6を設置したオプションボタンの数に減らせば解決すると思います。

チェックボックスの方法ですが、ただ配置しただけだと全部選択できてしまいます。
下記コードで対応できます(チェックボックス1をクリックした場合)
Private Sub CheckBox1_Click()
If CheckBox1 = True Then
CheckBox2.Enabled = False
CheckBox3.Enabled = False
CheckBox4.Enabled = False
Else
CheckBox2.Enabled = True
CheckBox3.Enabled = True
CheckBox4.Enabled = True
End If
End Sub

CheckBox1がTrueを返した場合、他のチェックボックスのEnableのプロパティをFalseにします。
使用不可に擦るということです。
チェックボックスの数だけ、それぞれに書かなければいけません。
チェックボックスのNo.に気を付けて下さい。

オプションボタンなら、これを書く必要は無いのですが・・・
最初のサンプルコードのOptionButtonをCheckBoxに置き換えるだけでOKだと思います。
動作するか検証はしていませんけど。

帰りが遅かったもので、また明日見に来ます。
継続して、分かる範囲で回答したいと思います。
    • good
    • 0
この回答へのお礼

忙しいところありがとうございました。ループ数を変えるだけで、上手く作動出来ました。自分は読み取る基礎がないのですいませんでした。確かに、オプションボタンの方が記述は楽だとかんじました。しかし、自分が既に作成しているのは、チェックボックスなのでこれからやってみようと思います。本当にありがとうございます。

お礼日時:2007/09/19 07:02

#2です。



#3さんのサンプルは Excel2000でも問題ありません。
提示された回答をご自分で読み解こうという意識はおありですか?
「指定されたオブジェクト名がないとエラー表示されます。」ってそのものずばり、試している環境で UserForm2 に OptionButton1~6 や ComboBox1~6 と言う名前のオブジェクトが無いだけだと思いますけど、、、


> 選択制で、1個だけ選択させたいです。それらの項目と内容だけをフォーム1に記録させたいです。
> それは可能でしょうか?


可能かって話なら可能だと思いますが、1個だけ選択させる制御のために余計なコードを書かなきゃなりません。
OptionButtonなら勝手にやってくれます。

ベタですが、新規ブックで UserForm に CheckBox を6つ置いて、UserFormモジュールにコピペします。

Sub CheckBox_Check(chCnt As Control)
Dim cnt As Control
 For Each cnt In Me.Controls
  Debug.Print TypeName(cnt)
  If TypeName(cnt) = "CheckBox" Then
    If cnt.Name <> chCnt.Name Then cnt.Value = False
  End If
 Next cnt
End Sub

Private Sub CheckBox1_AfterUpdate()
 CheckBox_Check CheckBox1
End Sub

Private Sub CheckBox2_AfterUpdate()
 CheckBox_Check CheckBox2
End Sub

Private Sub CheckBox3_AfterUpdate()
 CheckBox_Check CheckBox3
End Sub

Private Sub CheckBox4_AfterUpdate()
 CheckBox_Check CheckBox4
End Sub

Private Sub CheckBox5_AfterUpdate()
 CheckBox_Check CheckBox5
End Sub

Private Sub CheckBox6_AfterUpdate()
 CheckBox_Check CheckBox6
End Sub

この回答への補足

ループ数を6から3に変化しただけで上手く機動しました。自分は読み取る基礎がないです。すいませんでした。上記の記述早速試してみます。必ず報告します。それとオプションボタンの方が良いと皆さんが言われていた意味が良く理解出来ました。実は今、フォームの中に簡単に誰でも記入出来るように、作成しております。その項目は、いっぱいあって頭の中でも整理出来ていません。papayukaさんにはいつも感謝しております。出来れば、今後もアドバイスお願いします。

補足日時:2007/09/19 07:08
    • good
    • 0
この回答へのお礼

ありがとうございました。試した結果上手くいきました。やはり余分な記述が多いですね。本当困ったもんです。でも参考にして作り上げていきます。

お礼日時:2007/09/19 19:01

takachan7272です。


自宅のOffice環境が2003の為、2000で動作するかは未確認です。
申し訳ありませんが、明日、会社のPCで試してみます。

実行時にエラーでしょうか?
それとも、コードを書いている時にエラーでしょうか?
書いている時なら、スペースやピリオド〔.〕は大丈夫でしょうか。
s1 = Me.Controls("OptionButton" & i).Caption
見辛いですが、Captionの前にピリオドがあります。

明日の夜に検証結果を書き込みますね。
    • good
    • 0
この回答へのお礼

ありがとうございます。ピリオドも記入しています。そのままコピーしただけです。実行時エラー -2147024809(80070057) 指定されたオブジェクトはは見つかりませんと書かれていました。出来ればチェック式の記述も教えていただきたいです。お待ちしています。

お礼日時:2007/09/18 16:40

補足を待っている間に回答が付きましたね。


私も同感で、オプションボタン(ラジオボタンと一緒)とループの使用を考えました。

私も転記するタイミングに悩みまして、勝手にフォーム2にもコマンドボタンを設置してみました。
それらしいものを作ってみましたので、ご自分で試してみて下さい。

---------------------------------
UserForm1
---------------------------------
Private Sub CommandButton1_Click()
TextBox1.Value = ""
TextBox2.Value = ""
UserForm2.Show
End Sub

---------------------------------
UserForm2
---------------------------------
Private Sub UserForm_Initialize()
With ComboBox1
.AddItem "ぶどう"
.AddItem "桃"
.AddItem "バナナ"
End With
With ComboBox2
.AddItem "きゅうり"
.AddItem "キャベツ"
.AddItem "にんじん"
End With
With ComboBox3
.AddItem "ビール"
.AddItem "サワー"
.AddItem "日本酒"
End With
End Sub

Private Sub CommandButton1_Click()
Dim i As Integer
Dim s1, s2 As String

For i = 1 To 6 Step 1
s1 = Me.Controls("OptionButton" & i).Caption
s2 = Me.Controls("combobox" & i).Value
If Me.Controls("optionbutton" & i) = True Then
With UserForm1
.TextBox1.Value = s1
.TextBox2.Value = s2
End With
End If
Next i

Unload UserForm2
End Sub
---------------------------------
・フォーム1のボタンを押したらフォーム2を表示して2つのTextBoxを空白にする。
・フォーム2のボタンを押したら、チェックされているOptionBox#の
Captionをフォーム1のTextbox1に書込み。
同時にOptionBoxの#と同じ番号のComboBoxの値をTextbox2に書き込みます。
選択されていなければ空白が入ります。
・最後にフォーム2を閉じてフォーム1の表示を残します。
★フォームの閉じる〔X〕でも終われますが、終了ボタンを作っておくと良いでしょう。

1つ意見ですが、フォーム1のボタンを押してと言うのは必要無いのでは?
フォーム2で選択してボタンを押したらフォーム1を表示するとか。

この回答への補足

フォーム1は全体の項目を把握するもので、フォーム1には他に入力ボタンがいくつもあります。やはりオプションボタンの方が操作しやすいでしょうか?自分はチェックボタンを作ってしまいました。やってみてまた、報告させてください。

補足日時:2007/09/17 13:05
    • good
    • 0
この回答へのお礼

s1 = Me.Controls("OptionButton" & i).Caption←黄色表示
指定されたオブジェクト名がないとエラー表示されます。
コンボボックスの前にはオプションボタンで良いですよね?
どうしてですか?教えてください。自分は2000のエクセルです。

お礼日時:2007/09/17 22:44

チェックボックスは複数選択出来るものなので、仕様としてどうかと思います。


また「チェックボックスにチェックしたら」のタイミングで「コンボボックス」が既に選択されているとは限らず、転記に行くタイミングとしては適切で無いようにも思います。
どちらを先に操作するかはユーザーによって異なるのでは無いでしょうか?
コマンドボタンのクリックで転記を行うにしても、チェックボックスもコンボボックスも複数選択した状態で行う事が可能なわけで、その場合はどれを転記したら良いのかって話になります。
強引にやるなら、ループで最初に見つけた物もしくは最後に残った物って事かな?

ループでチェックボックスの Value を判断して、Caption を代入
ループでコンボボックスの Value を判断して代入

ってところでしょうか、、、

ちなみに用途的にはラジオボタンを使う方が排他制御は楽だと感じます。

この回答への補足

ありがとうございました。選択制で、1個だけ選択させたいです。それらの項目と内容だけをフォーム1に記録させたいです。それは可能でしょうか?

補足日時:2007/09/17 12:39
    • good
    • 0

チェックボックスにチェック(1個のみ)と言うことは


2個以上のチェックは無いと言うことですか?

この回答への補足

ありがとうございます。その中で1個のみチェックされた項目と内容だけをフォーム1のテキストボックスに転記させたいです。2個チェック字はエラー表示させたいです。

補足日時:2007/09/17 12:35
    • good
    • 0

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