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

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

ただいまの
回答率

88.77%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,821

jimunomado

score 19

前提・実現したいこと

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

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

①UserForm_Initializeでその他のテキストボックス(txtOther)のBackColorがグレー(&HC0C0C0)になっていてほしいのにならない。あとそのテキストボックスがEnabled = Falseにならない ②実現したいことが実現されない…… ④登録ボタン押下後、オプションボタンもテキストボックスも入力できない状態になってしまう
※上記につきまして、このエラーの大半が私の単なるスペルミス(UserForm_Initializeのスペルを間違えていた)起因と判明いたしましたので、こちら一度は削除いたします。大変申し訳ございませんでした。

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

該当のソースコード

Option Explicit

Private op As String
Private lastrow As Long

Private Sub UserForm_Initiialize()
    txtOther.Enabled = False
    txtOther.BackColor = &HC0C0C0
End Sub

Private Sub cmdRegist_click()
    lastrow = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Worksheets("Sheet1").Cells(lastrow, 1) = op

    opF.Enabled = False
    opOther.Enabled = False
    txtOther.Enabled = False
    txtOther.BackColor = &HC0C0C0

End Sub

Private Sub opF_click()
    op = "女"
End Sub

Private Sub opOther_click()
    txtOther.Enabled = True
    txtOther.BackColor = &HFFFFFF
    op = txtOther
End Sub

考えたこと

Private Sub opOther_click()
    txtOther.Enabled = True
    txtOther.BackColor = &HFFFFFF
    op = txtOther
End Sub

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

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

Excel2010を使用しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

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

正しくは、Private Sub UserForm_Initialize()

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

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

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

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

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

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

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

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


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

勝手に推測した仕様

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

Private selOption As Control

Private Sub txtOther_Change()
    If txtOther.Text <> "" Then
        cmdRegist.Enabled = True
    Else
        cmdRegist.Enabled = False
    End If
End Sub

Private Sub UserForm_Initialize()
    txtOther.Enabled = False
    txtOther.BackColor = &HC0C0C0
    cmdRegist.Enabled = False
End Sub

Private Sub cmdRegist_click()
    With Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1)
        If selOption.Caption = "その他" Then
            .Value = txtOther.Value
        Else
            .Value = selOption.Caption
        End If
    End With

    opF.Value = False
    opF.Enabled = True
    opOther.Value = False
    opOther.Enabled = True
    txtOther.Value = ""
    Set selOption = Nothing
    Call UserForm_Initialize
End Sub

Private Sub opF_click()
    Set selOption = opF
    txtOther.Enabled = False
    txtOther.BackColor = &HC0C0C0
    cmdRegist.Enabled = True
End Sub

Private Sub opOther_click()
    txtOther.Enabled = True
    txtOther.BackColor = &HFFFFFF
    Set selOption = opOther
    Call txtOther_Change
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/04 09:37

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

    キャンセル

  • 2019/04/08 16:00

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

    キャンセル

+1

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

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

Private Sub OptionButton2_Change()
    With Me.OptionButton2
        Me.TextBox1.Visible = .Value
        Me.Label1.Visible = Not .Value
    End With
End Sub


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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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
としてますから、書いた通りにプログラムは実行されています。

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

Option Explicit


Private Sub UserForm_Initialize()
    初期化
End Sub

Private Sub OptionButton2_Change()
    If Me.OptionButton2.Value Then
        With Me.TextBox1
            .Enabled = True
            .Locked = False
            .BackColor = vbWhite
            .SetFocus
        End With
    End If
End Sub

Private Sub CommandButton1_Click()
    With ActiveSheet.Range("A1").CurrentRegion
        .Cells(.Rows.Count + 1, 1).Value = GetOPButtonValue
    End With

    初期化
End Sub

Private Function GetOPButtonValue() As String
    Dim C As MSForms.Control
    Dim s As String

    For Each C In Me.Controls
        If TypeName(C) = "OptionButton" Then
            If C.Value = True Then
                If C.Object.Caption = "その他" Then
                    s = Me.TextBox1.Text
                Else
                    s = C.Object.Caption
                End If
                Exit For
            End If
        End If
    Next

    GetOPButtonValue = s
End Function


Private Sub 初期化()
    With Me.TextBox1
        .BackColor = &HC0C0C0
        .Text = ""
        .Enabled = False
        .Locked = True
    End With
    Me.OptionButton1.Value = False
    Me.OptionButton2.Value = False
End Sub

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/04 22:22

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

    キャンセル

  • 2019/04/08 16:03

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

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る