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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

9726閲覧

オプションボックスクリック時にテキストボックスを有効にしたい他

jimunomado

総合スコア19

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2019/04/03 04:34

編集2019/04/08 06:58

前提・実現したいこと

①ユーザーフォーム読み込み時、その他の隣にあるテキストボックスは無効の状態で、BackColorは&HC0C0C0である
②その他のオプションボタンが押下されたら、隣のテキストボックスが有効になりなおかつBackColorが&HFFFFFFになる。
③オプションボタンの女が選択されたら、セルA1に「女」と転記される。その他ボタンが選択された場合は、その他ボタンの隣のテキストボックスに記載された内容がA1に転記されるようにしたい
※一般的なアンケートで、「あなたはこのサイトをどこで知りましたか?」という問いがあったときに「その他」欄に自由記述できるような、そんな感じのものを作りたいのです…
やりたいことのイメージ
↑やりたいことのイメージ ↓実装中の入力フォーム
実装中の入力フォーム

発生している問題・エラーメッセージ

①UserForm_Initializeでその他のテキストボックス(txtOther)のBackColorがグレー(&HC0C0C0)になっていてほしいのにならない。あとそのテキストボックスがEnabled = Falseにならない
②実現したいことが実現されない……
④登録ボタン押下後、オプションボタンもテキストボックスも入力できない状態になってしまう

※上記につきまして、このエラーの大半が私の単なるスペルミス(UserForm_Initializeのスペルを間違えていた)起因と判明いたしましたので、こちら一度は削除いたします。大変申し訳ございませんでした。

その他ボタンをクリックした際、セルA1には隣のテキストボックスに入力された内容を転記したいと考えているのですが、実装したコードでは転記されません。

該当のソースコード

VBA

1Option Explicit 2 3Private op As String 4Private lastrow As Long 5 6Private Sub UserForm_Initiialize() 7 txtOther.Enabled = False 8 txtOther.BackColor = &HC0C0C0 9End Sub 10 11Private Sub cmdRegist_click() 12 lastrow = Cells(Rows.Count, 1).End(xlUp).Row + 1 13 Worksheets("Sheet1").Cells(lastrow, 1) = op 14 15 opF.Enabled = False 16 opOther.Enabled = False 17 txtOther.Enabled = False 18 txtOther.BackColor = &HC0C0C0 19 20End Sub 21 22Private Sub opF_click() 23 op = "女" 24End Sub 25 26Private Sub opOther_click() 27 txtOther.Enabled = True 28 txtOther.BackColor = &HFFFFFF 29 op = txtOther 30End Sub 31

考えたこと

VBA

1Private Sub opOther_click() 2 txtOther.Enabled = True 3 txtOther.BackColor = &HFFFFFF 4 op = txtOther 5End Sub

op = txtOtherでない、というところはわかっているのですが、逆にどうしたらよいのかというところで考えが詰まっています。

補足情報(FW/ツールのバージョンなど)

Excel2010を使用しています。

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

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

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

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

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

guest

回答3

0

テキストボックスの上にもう一つラベルを置きます。
プロパティボックスでそのラベルを選び
そのラベルのSpecialEffectプロパティを
fmSpecialEffectSunkenを選んでおきます。

で、以下のコードでいかがでしょうか?

VBA

1Private Sub OptionButton2_Change() 2 With Me.OptionButton2 3 Me.TextBox1.Visible = .Value 4 Me.Label1.Visible = Not .Value 5 End With 6End Sub

非表示のコントロールは選択出来ないので、
非表示にし、それっぽいものを別途表示して、見せます。

あと、オブジェクトボックスと
プロシージャボックスから、
選択すると、誤記を防げます。

参考URL>>
VBEについて(Excel2007)

投稿2019/04/03 11:45

mattuwan

総合スコア2136

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

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

0

ベストアンサー

①UserForm_Initializeでその他のテキストボックス(txtOther)のBackColorがグレー(&HC0C0C0)になっていてほしいのにならない。

単純に、Private Sub UserForm_Intiialize() の部分のスペルミスかと。

正しくは、Private Sub UserForm_Initialize()

②実現したいことが実現されない……

コードが希望のように記述されていないからだと思いますが、
希望のことは下記のどちらですか。

  • オプションボタンを選択(クリック)したら、すぐにセルに値を代入したい。
  • 登録ボタンをクリックしたときに、選択されているボタンの値を代入したい。

説明では前者のようですし、コードでは後者のように読めます。
普通の設計としては、登録ボタン時に代入かと思います。
でないと、「その他」を選択した場合、テキストボックスがその時点で入力可になるので、
空白がセルに代入されることになるし、間違えた場合も修正ができずにセルに追加されて行ってしまいます。

④登録ボタン押下後、オプションボタンもテキストボックスも入力できない状態になってしまう

登録ボタン押下で Enabled = False してますから当然そうなりますね。

他にも、その他選択でテキストボックスが空欄の時に登録ボタンを押すと空白をセルに代入することになったり、「女」を選択しなおしたとき、テキストが有効のままでいいのかと、とか、いろいろインターフェイスとしておかしい部分があると思います。

もう少し、落ち着いて、本当にやりたいことは何かを整理してみることを推奨します。


一応、こちらで勝手にやりたいであろうことを想像して、コード例を書いてみました。

勝手に推測した仕様
0. フォームは開いた直後は、オプションボタンはすべて非選択、テキストボックス無効、
登録ボタン無効(選択されていない場合、押せないように)
0. 「女」オプションを選択すると、登録ボタン有効
0. 「その他」オプションを選択した時、テキストボックスが空欄なら登録ボタン無効、入力されていれば、登録ボタン有効
0. 「テキストボックス」に入力すれば登録ボタン有効、削除して空欄になると無効
0. 登録ボタンクリックでSheet1 A列の最終行に選択した値を代入
その後、初期状態に戻す(オプション非選択、テキスト空欄かつ無効、登録ボタン無効)

vba

1Option Explicit 2 3Private selOption As Control 4 5Private Sub txtOther_Change() 6 If txtOther.Text <> "" Then 7 cmdRegist.Enabled = True 8 Else 9 cmdRegist.Enabled = False 10 End If 11End Sub 12 13Private Sub UserForm_Initialize() 14 txtOther.Enabled = False 15 txtOther.BackColor = &HC0C0C0 16 cmdRegist.Enabled = False 17End Sub 18 19Private Sub cmdRegist_click() 20 With Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1) 21 If selOption.Caption = "その他" Then 22 .Value = txtOther.Value 23 Else 24 .Value = selOption.Caption 25 End If 26 End With 27 28 opF.Value = False 29 opF.Enabled = True 30 opOther.Value = False 31 opOther.Enabled = True 32 txtOther.Value = "" 33 Set selOption = Nothing 34 Call UserForm_Initialize 35End Sub 36 37Private Sub opF_click() 38 Set selOption = opF 39 txtOther.Enabled = False 40 txtOther.BackColor = &HC0C0C0 41 cmdRegist.Enabled = True 42End Sub 43 44Private Sub opOther_click() 45 txtOther.Enabled = True 46 txtOther.BackColor = &HFFFFFF 47 Set selOption = opOther 48 Call txtOther_Change 49End Sub

投稿2019/04/03 07:22

編集2019/04/04 13:27
hatena19

総合スコア33620

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

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

jimunomado

2019/04/04 00:37

スペルミスをしているんじゃないかと思いつつ、疲れからか全然見つけられませんでした><!ありがとうございました・・・!!!
jimunomado

2019/04/08 07:00

わかりづらい説明を大変失礼いたしました。やりたいことの整理・・・おっしゃる通りです。やりたいことはなんなのかということを、ひとまず日本語に直すことをしたいと思います。。。 やりたいことは「登録ボタンをクリックしたときに、選択されているボタンの値を代入したい。」こちらでした。
guest

0

なぜコメントが貰えないか考えて、疑
問に真っ直ぐに答えてないからだと気づきました。
反射的に「こうしたらいいじゃん。」ってコード書いちゃったですが、
全体を網羅してなかったので、再度書き込みます。

①ユーザーフォーム読み込み時、その他の隣にあるテキストボックスは向こうの状態で、BackColorは&HC0C0C0である
UserForm_Initializeでその他のテキストボックス(txtOther)のBackColorがグレー(&HC0C0C0)になっていてほしいのにならない。あとそのテキストボックスがEnabled = Falseにならない
②その他のオプションボタンが押下されたら、隣のテキストボックスが有効になりなおかつBackColorが&HFFFFFFになる。またテキストボックスに入力された内容がセルに転記されるようにしたい
※女ボタンを押下した場合は「女」とセルに転記されるようにしたい
実現したいことが実現されない……
③登録ボタン押下後、入力した内容がクリアされるようにしたい
④登録ボタン押下後、オプションボタンもテキストボックスも入力できない状態になってしまう

1)ブレークポイントを置いて、ステップ実行しながら、挙動を確認してみてください。
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う
Enabled = Falseにならないのではなく、挙動が期待している結果になってないだけでしょう。
多分、lockedプロパティをTureにしたらいいのでは?

2)ステップ実行をしながら、ローカルウィンドウで変数の中身を確認してみてください。

3)値を(選択を)クリアするなら、オプションボタンのValueプロパティを
Falseにしてください。

4)opF.Enabled = False
としてますから、書いた通りにプログラムは実行されています。

一応、全体を書いてみました。

VBA

1Option Explicit 2 3 4Private Sub UserForm_Initialize() 5 初期化 6End Sub 7 8Private Sub OptionButton2_Change() 9 If Me.OptionButton2.Value Then 10 With Me.TextBox1 11 .Enabled = True 12 .Locked = False 13 .BackColor = vbWhite 14 .SetFocus 15 End With 16 End If 17End Sub 18 19Private Sub CommandButton1_Click() 20 With ActiveSheet.Range("A1").CurrentRegion 21 .Cells(.Rows.Count + 1, 1).Value = GetOPButtonValue 22 End With 23 24 初期化 25End Sub 26 27Private Function GetOPButtonValue() As String 28 Dim C As MSForms.Control 29 Dim s As String 30 31 For Each C In Me.Controls 32 If TypeName(C) = "OptionButton" Then 33 If C.Value = True Then 34 If C.Object.Caption = "その他" Then 35 s = Me.TextBox1.Text 36 Else 37 s = C.Object.Caption 38 End If 39 Exit For 40 End If 41 End If 42 Next 43 44 GetOPButtonValue = s 45End Function 46 47 48Private Sub 初期化() 49 With Me.TextBox1 50 .BackColor = &HC0C0C0 51 .Text = "" 52 .Enabled = False 53 .Locked = True 54 End With 55 Me.OptionButton1.Value = False 56 Me.OptionButton2.Value = False 57End Sub

だめだ^^;勘が鈍ってる><
https://www.moug.net/faq/viewtopic.php?p=494370#494370

投稿2019/04/04 10:46

編集2019/04/04 12:14
mattuwan

総合スコア2136

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

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

hatena19

2019/04/04 13:22

OptionButton2_Change() としてますが、Changeイベントは、コードで変更しても発生してしまいます。 OptionButton2_Click() か OptionButton2_AfterUpdate() ならコードで変更した場合は発生しないので、こちらが適切かと。
jimunomado

2019/04/08 07:03

ご回答ありがとうございます。こんな方法があったのですね・・・。情けない・・・。 一度内容確認いたします(割り込み案件が入ってしまったので、一応読んでいますよのコメントです)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問