• ベストアンサー

オプションボタン(配列)のチェック変更

実質、NO.3213956の続きです。 聞いてばかりもだめなので小一時間探したのですが、 見つからないので、また質問させていただきます。 オプションボタンが2個以上(同じオブジェクト名で配列・欠番はないものとする)、テキストボックス(数字しか入力できない)が1個、コマンドボタンが2個あります。 テキストボックスに数字を入力し、コマンドボタンを押すと 入力した数字の配列番号のオプションボタンをTrueにします。 Private Sub Command1_Click() Dim ctl As Control 'コントロール Const conCTLNAME = "Option1" Dim intIndex As Integer For Each ctl In Me.Controls 'テキストに数字入力確認 If IsNumeric(txtIndex.Text) Then intIndex = CInt(txtIndex.Text) Else MsgBox "数字を入れてください" Exit Sub End If 'オプションボタン判定 If InStr(1, conCTLNAME, ctl.Name, vbTextCompare) Then ctl(intIndex).Value = True '※ End If Next ctl End Sub しかし、※でエラー「オブジェクト配列のインデックスを指定してください」が表示されます。 数字を選ぶところは、実際はDBに格納されているNumber型のフラグを持ってくる形になります。 コントロールを変数に格納している仕様で難しいですが、 アドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.2

訂正 Public Function SetCtlValue(ByVal ctlName As String, _               ByVal I As Variant, _               ByVal V As Variant) As Boolean On Error Resume Next   Dim isOK As Boolean   Dim ctl As Control      For Each ctl In Me.Controls     Debug.Print ctl.Name     If ctl.Name = ctlName Then       If I = -1 Then         ctl.Value = V         ctl.Text = V         isOK=True         Exit For       ElseIf ctl.index = I Then         ctl.Value = V         ctl.Text = V         isOK=True         Exit For       End If     End If   Next ctl   SetCtlValue = isOK End Function

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

ctl自体がコントロール配列にはなりえません コントロール自体です   dim ctl as Control   Const conCTLNAME ="Optiion1"   if not isNumber(Text1.text) then     MsgBox "数字を入力してください"     exit sub   end if   for each ctl in Controls     ' 検査対象がオプションボタンか判断     if typeof ctl is OptionButton then       ' 検査対象の名前と一致か       if ctl.name = conCTLNAME then         ' 検索対象がコントロール配列なら         ' Indexプロパティがある         ' 単独コントロールなら エラーになり         on error resume next         if ctl.index = Text1.Text then           ' エラートラップに引っかからなかった場合           if err.Number = 0 then             ctl.value = true             exit for           end if         end if         On error goto 0       end if     end if   next

tocci_pc
質問者

お礼

教えていただいている身分で、揚げ足をとるのは申し訳ないのですが、 2行目は、 Const conCTLNAME ="Option1" ですね。(iが一個多い) テキストボックスの名称を変えましたら出来ました。 http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips117.htm に if typeof ctl is OptionButton then の説明が書いてありましたね。 完成ソースは Private Sub Command1_Click() Dim ctl As Control Dim str As String Const conCTLNAME = "Option1" str = txtIndex.Text If Not IsNumeric(str) Then MsgBox "数字を入力してください" Exit Sub End If For Each ctl In Me.Controls ' 検査対象がオプションボタンか判断 If TypeOf ctl Is OptionButton Then ' 検査対象の名前と一致か If ctl.Name = conCTLNAME Then ' 検索対象がコントロール配列なら ' Indexプロパティがある ' 単独コントロールなら エラーになり On Error Resume Next If ctl.Index = CInt(str) Then ' エラートラップに引っかからなかった場合 If Err.Number = 0 Then ctl.Value = True Exit For End If End If On Error GoTo 0 End If End If Next End Sub ですね。ありがとうございます。

noname#140971
noname#140971
回答No.1

ちょっとバグを取るには、色々とあり過ぎます。 そこで、幾つかの対案を示して回答とします。 SetCtlValue 関数が即答に近いかと思います。 プログラムコードの書き方はケースバイケース。 Private Sub Command1_Click() On Error Resume Next   Dim intIndex As Integer   Dim ctl   As Control   If IsNumeric(txtIndex.Text) Then     intIndex = txtIndex.Text     Set ctl = Option1(intIndex)     ctl.Value = True   Else     MsgBox "数字を入れてください"   End If End Sub これでもOKですよね。 Private Sub Command2_Click()   Dim isOK As Boolean      isOK = SetCtlValue("Option1", 2, True)   If isOK Then     MsgBox "値をセットしました!"   Else     MsgBox "値をセットに失敗しました!"   End If   SetCtlValue "Text1", -1, "TEST"   SetCtlValue "Check1", -1, 1 End Sub このように SetCtlValue という関数を用意するのも手ですね。 Cption をセットすることが無ければ、問題はないでしょう。 Public Function SetCtlValue(ByVal ctlName As String, _               ByVal I As Variant, _               ByVal V As Variant) As Boolean On Error Resume Next   Dim ctl As Control      For Each ctl In Me.Controls     Debug.Print ctl.Name     If ctl.Name = ctlName Then       If I = -1 Then         ctl.Value = V         ctl.Text = V         Exit For       ElseIf ctl.index = I Then         ctl.Value = V         ctl.Text = V         Exit For       End If     End If   Next ctl   SetCtlValue = CBool(ctl.Value = V) End Function

tocci_pc
質問者

お礼

前半部分は、Dim ctl As Control にしない場合の記述ですね。 後半部分は、またおもしろいですね。 No.3の案解析後試させていただきます。

関連するQ&A

  • クリックされたオプションボタンによって、常時複数のテキストBOXの桁数を変えたい

    掲題の件ですが、クリックされたオプションボタンによって常時テキストの桁数を変えたいのですが、 これを複数の組み合わせで行いたいときはどのsub(form_load等)にどのように記述したらよいでしょうか? 例えば、オプションボタンで3桁、4桁、5桁の選択肢があるとすると、 Private Sub Option1_Click(Index As Integer) Me.text1.MaxLength = 3 End Sub Private Sub Option2_Click(Index As Integer) Me.text2.MaxLength = 4 End Sub Private Sub Option3_Click(Index As Integer) Me.text3.MaxLength = 5 End Sub となりますが、この組み合わせを複数作りたい場合、オプションボタンとテキストboxをコントロール配列にして、 Dim i As Integer For i = 0 to 3 If Option1(i).Value = True Then Me.text(i).MaxLength = 3 ElseIf Option2(i).Value = True Then Me.text(i).MaxLength = 4 ElseIf Option3(i).Value = True Then Me.text(i).MaxLength = 5 End If Next このような形になると思いますが、これですとForm_Loadに貼り付けても常時桁を変えることができません。 どのsubにどのようにコードを記述したらよいか教えていただけたら幸いです。 よろしくお願い致します。

  • Excel VBA オプションボタンについて

    こんばんは オプションボタンが5つあり、 登録ボタンが1つあるユーザーフォームを作りました。 このオプションにチェックを入れずに登録ボタンを押したときに 「必ず選択してください。」とメッセージを表示し、再度入力させるようにしたいのですが、どうしたらよいのでしょうか。 Excelのバージョンは2003です。 調べたところ (1)で動きそうだ。ということが判ったのですがチェックを入れ値がtrueになるとエラーが発生して止まってしまいます。(理由がわかりません) Private Sub commandbutton2_click() Dim opt As ControlFormat, flg As Boolean flg = False For Each opt In frame1.Controls If opt.Value = True Then '←ここの行でtrueだった場合のエラーが発生してしまう。 flg = True Selection.Value = opt.Caption End If Next Unload userform1 End Sub (2)この方法で何とか動いたのですが、初めの方に書いたとおり、オプションボタンが選択されずに登録ボタンが押された場合、チェックするように促すメッセージを表示する方法がわかりません。また、できればユーザーホームの×ボタンを押せなくする方法もしくは、閉じられた場合にマクロを抜けるようにするにはどうしたらよいのでしょうか。宜しくお願い致します。 Private Sub commandbutton1_click() Dim i As Integer For i = 1 To 5 If Me.Controls("optionbutton" & i).Value = True Then Selection.Value = Me.Controls("optionbutton" & i).Caption End If Next i Unload userform1 End Sub

  • 全てのコマンドボタンの名前を変更したい

    先日質問した「オブジェクト(コントロール)の名前を変更したい」 http://okwave.jp/qa/q7896863.html?by=datetime&order=DESC の応用で、 前回はDexMachina様にご回答いただいて解決したのですが今度は違う部分で詰みました。 フォームに乗っかっているコマンドボタンの名前を変更しつつ、 インデックスを付けていこうと思うのですが ************************************** Sub オブジェクト名変更() Dim ctl As Control Dim i As Long Dim f As String f = "フォーム1" i = 1 DoCmd.OpenForm f, acDesign 'デザインビューで開く For Each ctl In Forms(f).Controls If ctl.ControlType = acCommandButton Then Forms(f)!Controls(ctl.Name).Caption = i Forms(f)!Controls(ctl.Name).Name = i End If Next ctl DoCmd.Close acForm, "フォーム1", acSaveYes '保存する End Sub ************************************** のControls(ctl.Name).でエラーになります。 エラー内容は 実行時エラー2465 指定した式で参照されている’ Controls’フィールドが見つかりません。 です。 イミディエイトで?ctl.Nameして見ると コマンド0となるので問題ないと思うのですが文法がおかしいのでしょうか? Forms(f)!コマンド0.Caption にすると問題なく動作します。 ご回答よろしくお願いします。

  • VBAでオプションボタン変更によって・・・

    エクセルVBAのユーザーフォーム内にあるコンボボックス3つを選択することによりデータ入力を行っています。 この度選択肢を増やすことになり、オプションボタンを2つ追加しようと思っています。 オプションボタンはどちらかを決定することで、コンボボックスの選択内容を変更する予定です。 コンボボックスは大中小分類としており、シート2から抽出したものをシート1に落としている現状をオプションボタン新設により、ボタン1は従来通りシート2から、ボタン2選択時はシート3にあるリストからコンボボックスへ繁栄させようとしたいのですが、方法が分かりません。 どなたか、教えていただけると助かります。 よろしくお願いします。 現在のコードを下記に記します。 Private Sub UserForm_Activate() With UserForm3 .OptionButton1 = True *この段階でボタン2を選択時は、シート3にあるリストよりコンボボックスの内容を抽出したい。 以下中小分類も同様としたい。 .ComboBox1.RowSource = "シート2!A3:A15" .ComboBox1.SetFocus End With End Sub Private Sub ComboBox1_Change() Dim myLlist As String myLlist = ComboBox1 With UserForm3 .ComboBox2.Text = "" .ComboBox3.Text = "" Select Case myLlist Case "大1" .ComboBox2.RowSource = "シート2!B21:B26" Case "大2" .ComboBox2.RowSource = "シート2!B27:B28" End Select End With End Sub Private Sub ComboBox2_Change() Dim myMlist As String myMlist = ComboBox2 With UserForm3 .ComboBox3.Text = "" Select Case myMlist Case "中1" .ComboBox3.RowSource = "シート2!C101:C111" Case "中2" .ComboBox3.RowSource = "シート2!C121:C124" End Select End With End Sub Private Sub OKボタン_Click() With UserForm3 ActiveSheet.Unprotect 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm3.ComboBox1.Value Cells(行, 列 + 1) = UserForm3.ComboBox2.Value Cells(行, 列 + 2) = UserForm3.ComboBox3.Value ActiveSheet.Protect End With End Sub

  • エクセルVBAマクロのオプションボタンについて

    オプションボタンのマクロに関して教えて下さい。 マクロのスキルレベルは、新しいマクロの記録を多用して、マクロを組むレベルです。 「表示-ツールバー-フォーム」から選ぶオプションボタンを使って、オプションボタンAが押されている場合とBが押されている場合で、処理を変えたいのですが、そのオプションボタンの値をどうやっても拾えません。 色々検索した結果、以下のマクロでできる気がしたのですが、駄目でした。 Private Sub OptionButton1_Click() オプション1 = True End Sub Private Sub OptionButton2_Click() オプション2 = True End Sub Sub オプションボタン() If オプション1 = True Then Range("a1") = 1 ElseIf オプション2 = True Then Range("a1") = 2 Else Range("a1") = 0 End If End Sub 作ったオプションボタンを右クリックしてマクロ登録を選ぶと、「オプション1_Click」となっているので、「OptionButton1_Click」を「オプション1_Click」に変えてみたのですが、やっぱり駄目でした。 ネットではユーザフォームを使ったマクロ例はあるのですが、そのまま使用するオプションボタンの例がありません。できればユーザフォームは使いたくありません。 ご存知の方がいらっしゃいましたら、教えて下さい。よろしくお願いします。

  • VBでの簡易電卓の作成(減算方法)で困っています。

    技術評論社のVisual Basic5.0入門編という、 参考書を見ながら、作成したのですが。 どうも、参考書のコードが間違っているみたいでした 良かったら、お知恵をお貸しください。 とりあえず、足し算と引き算処理の作成です。 ※使用コントロール 0から9までのコマンドボタンをコントロール配列と、 足し算、引き算、クリアーのコマンドボタンが3つ、 後、数字入力用のテキストボックスが1つです。 コード **************************************************** Option Explicit Dim EnterFlag As Boolean 'プラス、マイナスキーが押された直後ならTrueを示すフラグ。 Dim S As Long Private Sub Command3_Click() 'クリアーボタン Text1.Text = "" S = 0 End Sub Private Sub Plas_Click() '加算処理 S = S + Val(Text1.Text) Text1.Text = S EnterFlag = True End Sub Private Sub Mainas_Click() '減算処理 S = S - Val(Text1.Text) Text1.Text = S EnterFlag = True End Sub Private Sub Form_Load() Text1.Text = "" S = 0 End Sub Private Sub key_Click(Index As Integer) If EnterFlag Then Text1.Text = "" EnterFlag = False End If If Len(Text1.Text) < 10 Then '10桁以内のとき Text1.Text = Text1.Text & Index End If End Sub ********************************************************* とこんな感じです。 加算処理は、上手くできますが。 減算処理は、明らかにコードが間違っていると思いました。 初めて(1回目)マイナスボタンを押した時に、変数Sには、必ずマイナス が入ってしまう状態です。 上手く減算処理出来る方法のアドバイスよろしくお願いします。

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

  • オプションボタンについて

    VBAはまだやり始めたばかりで、ちょっとわからないので、教えて 下さい。 TextBox1~19に金額を入力すると、 TextBox60に小計 TextBox61に消費税 TextBox62に合計 が入るように設定してあります。 TextBox61のよこに OptionButton1 切捨て OptionButton2 切り上げ OptionButton3 四捨五入 OptionButton4 税込み(「-」を入力) を設定し、オプションボタンを選択するごとに、TextBox61の 消費税設定を変えたいと思っています。 標準では下記のコードでOptionButton1が選択されるように してあります。 オプションボタンで切り替えるにはどのようにしたら よいでしょうか。。。 Private Sub 合計Sub(ByVal myTextBox As MSForms.TextBox) Const cnsTax As Double = 0.05 Dim i As Long Dim v(1 To 19) As Long Dim y(60 To 62) As Long ' With myTextBox .Value = Format$(.Value, "#,##0") End With '再計算 On Error Resume Next For i = 1 To 19 v(i) = CLng(Me.Controls("TextBox" & i).Value) Next With Application.WorksheetFunction y(60) = .Sum(v) If myTextBox Is Me.TextBox61 Then y(61) = CLng(myTextBox.Value) Else y(61) = .RoundDown(y(60) * cnsTax, 0) End If y(62) = .Sum(y(60), y(61)) End With On Error GoTo 0 For i = 60 To 62 Me.Controls("TextBox" & i).Value = Format$(y(i), "#,##0") Next End Sub

  • コントロールが配列かどうかを知るには?

    Visual Basic6.0(SP5)で伺いたいことがあります。 フォーム上の全てのオブジェクトを For Each文で取得しています。以下の様にです。 Dim Control As Object For Each Control In Form1.Controls If TypeOf Control Is Text Then End If Next Control このとき個々のControlがコントロール配列かどうかを知りたいのですが、どうすればよろしいでしょうか?フォーム上にはコントロール配列のオブジェクトも、コントロール配列ではないオブジェクトもあります。 Control.Indexの値を参照しようとしても、コントロール配列でない場合は 「配列ではないオブジェクトです」とエラーになります。 IsArray関数でもFalseになってしまいます。 何を行いたいかというと、そのControlがコントロール配列(Text1(0)とかText1(1)とか)かどうかを調べて、そのIndexをある関数の引数にしたいのです。全てコントロール配列だったら、Control.Indexで値を取得できるのですが。 よろしくお願いします。

  • オプションボタン

    昨日も質問させていただいたものです。 オプションボタンの使い方について質問があります。 コマンドボタン1つ、テキストボックスを1つ、ラベルを一つ、 フレームを二つ用意し、それぞれのフレームに3つずつオプションボタンを配置します(●フレームA、B●オプションA1、A2、A3、オプションB1、B2、B3とする)。 オプションA1~3には1~3年生というキャプションを、 オプションB1~3には1~3組というキャプションを設定します。 テキストに名前を打ちこんでコマンドボタンを押すと、 ラベルに(テキストが太郎の場合)"太郎は3年1組です" と表示されるようなものを作ろうと考えています。 コマンドボタンを使用せずに、オプションボタンのみで作ると Privat Sub OptionA1_Click() If OptionB2.Valrue=True Then Label1.Caption="" と言うような感じで何個も書けば良いと思うのですが、 これにをコマンドボタンで実行させようとすると方法がわかりません。 アドバイスお願いします。

専門家に質問してみよう