質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1168閲覧

入力フォームのテキストボックスで、Enabledの設定をしたい

jimunomado

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/01/22 06:33

編集2019/01/25 01:00

前提・実現したいこと

VBAで以下のような入力フォームを作ろうとしています。

作成中入力フォームイメージ

やろうとしていることは以下の通りです。
①性別を選択するまで男性用、女性用テキストボックスはEnabledにしたい
②性別で、男性が選択されたら男性用と書かれたテキストボックスのみが入力可能になるようにしたい。逆に女性が選択されたら、女性用と書かれたテキストボックスのみが入力可能になるようにしたい。

困っていること

①を実施したいのに、テキストボックスがEnabledにならない
②男性を選択しても女性用テキストボックスも入力可能である

ソースコード

VBA

1Option Explicit 2 3Private sex As String 4Private lastRow As Long 5 6Private Sub UserForm1_Initialize() 7TextBox3.Enabled = False '男性用テキストボックス 8TextBox4.Enabled = False '女性用テキストボックス 9 10 11End Sub 12 13 14Private Sub CommandButton1_click() 15 16With Worksheets("Sheet1") 17 lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 18 .Cells(lastRow, 1).Value = TextBox1.Text '名前 19 .Cells(lastRow, 2).Value = sex '性別選択オプションボックス 20 .Cells(lastRow, 3).Value = TextBox3.Text 21 .Cells(lastRow, 4).Value = TextBox4.Text 22End With 23 24TextBox1.Text = "" 25male.Value = False 26female.Value = False 27TextBox3.Text = "" 28TextBox4.Text = "" 29 30End Sub 31 32Private Sub Male_Change() 33 If male.Value = True Then 34 sex = "男性" 35 End If 36End Sub 37 38Private Sub Male_Change2() 39 If male.Value = True Then 40 TextBox3.Enabled = True 41 TextBox4.Enabled = False 42 43 End If 44End Sub 45 46Private Sub Female_Change2() 47 If female.Value = True Then 48 TextBox3.Enabled = False 49 TextBox4.Enabled = True 50 End If 51End Sub 52 53Private Sub Female_Change() 54 If female.Value = True Then 55 sex = "女性" 56 End If 57End Sub 58

試したこと

ユーザーフォームのプロパティウィンドウから、TextBox3とTextBox4のEnabledオプションをFalseにしてみましたが、そうすると性別選択をしても入力フォームは完全に入力できない状態になります。
あとは

VBA

1Private Sub Male_Change() 2 If male.Value = True Then 3 sex = "男性" 4 End If 5End Sub 6 7Private Sub Male_Change2() 8 If male.Value = True Then 9 TextBox3.Enabled = True 10 TextBox4.Enabled = False 11 12 End If 13End Sub 14 15Private Sub Female_Change2() 16 If female.Value = True Then 17 TextBox3.Enabled = False 18 TextBox4.Enabled = True 19 End If 20End Sub 21 22Private Sub Female_Change() 23 If female.Value = True Then 24 sex = "女性" 25 End If 26End Sub

の入力位置も気になっているのですが、もしこれが間違っているとしてじゃあどこに入力したら適切??となっています……。

操作環境他

Excel2010、Win7 64bit版で操作しています。
また当方VBAを独学で学んでいる初心者です。初歩的なところで間違いなどしているかと思います。
どうぞお手柔らかにお願いいたします。

お礼と最終的なコード

皆様ご回答いただきありがとうございました。大変勉強になりました。
ベストアンサーはhatena19さまにさせていただきました。
皆様のアドバイスを参考に、以下のようなコードになりました。
※2019/01/25追記:コードに誤りがあったため下記修正いたしました。コメントアウトにて修正箇所記入しております。

VBA

1Option Explicit 2 3Private sex As String 4Private lastRow As Long 5 6Private Sub UserForm_Initialize() 7'UserForm1・・・という書き方をしていたのですが、こちらが誤りであると別質問をした際に気が付きました。 8 TextBox3.Enabled = False 9 TextBox3.BackColor = &HC0C0C0 10 TextBox4.Enabled = False 11 TextBox4.BackColor = &HC0C0C0 12End Sub 13 14 15Private Sub CommandButton1_click() 16 17With Worksheets("Sheet1") 18 lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 19 .Cells(lastRow, 1).Value = TextBox1.Text 20 .Cells(lastRow, 2).Value = sex 21 .Cells(lastRow, 3).Value = TextBox3.Text 22 .Cells(lastRow, 4).Value = TextBox4.Text 23End With 24 25TextBox1.Text = "" 26male.Value = False 27female.Value = False 28TextBox3.Text = "" 29TextBox4.Text = "" 30TextBox5.Text = "" 31 32End Sub 33 34 35Private Sub male_click() 36 sex = "男性" 37 TextBox3.Enabled = True 38 TextBox4.Enabled = False 39 TextBox3.BackColor = &HFFFFFF 40 TextBox4.BackColor = &HC0C0C0 41End Sub 42 43Private Sub female_click() 44 sex = "女性" 45 TextBox3.Enabled = False 46 TextBox4.Enabled = True 47 TextBox4.BackColor = &HFFFFFF 48 TextBox3.BackColor = &HC0C0C0 49End Sub

当初希望していた「オプションボタンで選択するまではテキストボックスはEnabled.Falseにしたい」という点は、よくよく考えたところ必要ないことがわかりましたので、実装しないことにしました。
またEnabled.Falseにしたテキストボックスについては、背景色をグレーにすることにしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

通常は男と女のどちらか一方だけ選択できるようにすると思いますので、その場合は、フレーム内にオプションボタンを配置するとグループ化されてその中一つだけが選択できるようになります。

Excel VBA フレームを使用してオプションボタンをグループ化する

その場合、オプションボタンのChangeイベントは、一つのオプションボタンを選択すると他のオプションボタンでも発生してしまいます。
そこで、Clickイベントを使うとコードがシンプルになります。

vba

1Option Explicit 2Private sex As String 3 4Private Sub UserForm1_Initialize() 5 TextBox3.Enabled = False '男性用テキストボックス 6 TextBox4.Enabled = False '女性用テキストボックス 7End Sub 8 9Private Sub male_Click() 10 sex = "男性" 11 Me.TextBox3.Enabled = True 12 Me.TextBox4.Enabled = False 13End Sub 14 15Private Sub female_Click() 16 sex = "女性" 17 TextBox3.Enabled = False 18 TextBox4.Enabled = True 19End Sub 20 21Private Sub CommandButton1_click() 22 With Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp) 23 .Offset(1, 0).Value = TextBox1.Text '名前 24 .Offset(1, 1).Value = sex '性別選択オプションボックス 25 .Offset(1, 2).Value = TextBox3.Text 26 .Offset(1, 3).Value = TextBox4.Text 27 End With 28 29 TextBox1.Text = "" 30 male.Value = False 31 female.Value = False 32 TextBox3.Text = "" 33 TextBox4.Text = "" 34 TextBox3.Enabled = False 35 TextBox4.Enabled = False 36End Sub

イメージ説明


オプションボタンのグループ化について補足しておきます。

オプションボタンというのは名前の通り、複数の選択肢から一つを選択するためのものです。
単独で、On/Offの切り替えとして使うこともできますが、そういう用途の場合はチェックボックスを使うのがWindowsでの標準のUIです。

今回は、男か女のどちらか一方しか選択できないようにすべきなので、
それをコードで実現するなら、「男」が選択されている状態で「女」を選択したら、「男」の選択が解除されるようにコーディングする必要があります。

しかし、グループ化すればそのようなコードは不必要になります。オプションボタンのグループ化の方法は2つあり、今回の回答のようにフレーム上に配置する方法と、オプションボタンのGroupNamプロパティに共通のグループ名を設定する方法があります。
フレームでグループ化するとFor Eachでフレーム上のコントロールを参照できるのでこちらの方が使い勝手がいいかと思います。

投稿2019/01/22 10:50

編集2019/01/23 05:27
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimunomado

2019/01/22 11:03

ありがとうございます!こんな書き方もあるのですね、、、。 ところでcellsプロパティとこのoffset……何か違いはありますでしょうか?恥ずかしながら、offsetなるものを初めて見たのです(-_-;)
hatena19

2019/01/22 11:30

cellsだと lastRow という最終行を格納する変数が必要になりますが、 Offsetを使えば不要になり若干コードがシンプルになります。 あと、基準列が変更になった場合(現状は1列目からですが、2列目からデータとなったりなど)、修正個所が1か所ですみます。 ということで、私はOffsetを多用します。 まあ、その辺は好みの問題ですので、読みやすいと思う方を選択すればいいかと思います。
jawa

2019/01/23 01:14

ちょっと横から失礼してcellsとoffsetについて補足させてください。m(__)m ・`Cells`は行番号・列番号を指定する「絶対座標指定」 ・`Offset`は基準となるセル(今回の場合A列最終行)からみた行・列のズレを指定する「相対座標指定」 使い分けを考える際は、ここが原点になると思います。 hatena19さんの言うとおり基本的にどちらを使うかは好みの問題ではありますが、`Offset`の方がコーディング的に便利な場面が多いです。 反面、パッとみて「どこを指しているのかわかりにくい」というデメリットもあります。 今回の「最終行の下に出力」といった具合に、変動する基準セルに応じて位置が決まるような場面では`Offset`の方が効率的です。 しかし毎回決まった位置(固定座標)を指定するなら、`Cells`や`Range`で記述したほうが可読性がよくなります。 基本的に自分が記述する際は上記のような判断基準でどちらにするか決定しています。 可読性の話なので、最終的には周辺のコードの書きっぷりや好みによるところも大きくなりますし、場合によっては「固定座標でもOffsetの方がみやすい(わかりやすい)」ということもあるのですが、大枠はそんなところです。 参考になれば幸いです。
jimunomado

2019/01/23 01:22

お二方ともありがとうございます!そんな違いがあるのですね、、、。わかりやすい説明をありがとうございます。
guest

0

①性別を選択するまで男性用、女性用テキストボックスはEnabledにしたい

UserForm1_Initializeで、両テキストボックスをfalseにしてるから。

②性別で、男性が選択されたら男性用と書かれたテキストボックスのみが入力可能になるようにしたい。逆に女性が選択されたら、女性用と書かれたテキストボックスのみが入力可能になるようにしたい。

Change2というイベントはありません。
ChangeイベントにChange2の中身を移せばよいと思います。

VBA

1Private Sub Male_Change() 2 If male.Value = True Then 3 sex = "男性" 4 TextBox3.Enabled = True 5 TextBox4.Enabled = False 6 End If 7End Sub

投稿2019/01/22 06:46

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimunomado

2019/01/22 07:47 編集

大変わかりやすい回答をありがとうございました!やりたいことができました。
guest

0

二つのChange2プロシージャが実行されていないからでは?
そんなイベントはないので、Changeプロシージャから呼ぶか、処理内容をChangeプロシージャ内に記述しましょう。

投稿2019/01/22 06:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimunomado

2019/01/22 07:31

わー!そこはみおとしておりました、、、。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問