Excel VBAでUserFormにoptionButtonを配置し、再表示した際にチェックが消える問題の解決方法

このQ&Aのポイント
  • Excel VBAを使用して作成したUserFormに複数のoptionButtonを配置していますが、UserFormを再表示するとチェックが消える問題が発生しています。この問題を解決する方法を教えてください。
  • また、保存したワークシートを読み込んだ場合にも同様の問題が発生します。ワークシートを読み込んだ際にもoptionButtonのチェックが保持される方法を知りたいです。
  • optionButtonのチェック項目は図形の表示と非表示であり、良い方法があれば教えていただきたいです。
回答を見る
  • ベストアンサー

excel VBA 作成したUserFormにoptionButton

excel VBA 作成したUserFormにoptionButtonを多数配置しています。このUserFormをワークシート上に再表示すとる、チェック項目に入力したチェックが消えてしまいます。消えない方法が解りません。 private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=False '図形1表示 End sub private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=True  '図形1非表示 End sub  同様な書式で数項目あります。 又、保存したワークシートを読み込んだ場合も同様に出来ないでしょうか。optionButtonのチェック項目が多数あります。チェック項目は図形を表示と非表示です。何方か良い方法がありましたら教えて頂けないでしょうか。宜しくお願いします。

  • B52
  • お礼率60% (3/5)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

まず、OptionButton でなくてはいけないのですか?Option Button は、多くの中からひとつを選ぶという種類のものです。図形のVisible に連動させるのは、OptionButton ではなく、CheckBotton のはずです。 Initialize イベントは良いにしても、そのままでは思ったようには行きませんね。 Private Sub CheckBox1_Click()  Activesheet.Shapes("図形1").Visible= Not Activesheet.Shapes("図形1").Visible  '図形1表示 End sub これをそれぞれの図形に反映するには、CheckBox#_Click() それぞれに、コードを書くか、クラスで、図形のIndex とCheckBoxのIndexを対応させないといけません。 Private Sub UserForm_Initialize()  Dim i As Long  Dim o As Object  i = 1  For Each o In ActiveSheet.Shapes   Me.Controls("CheckBox" & i).Value = o.Visible   o.Visible = True   i = i + 1  Next End Sub

B52
質問者

お礼

有難う御座いました。 大変参考にさせていただきました。

B52
質問者

補足

早々な回答有難う御座いました。 一つの図形を表示と非表示にしたい為にOption Button を使いました。 図形のVisible に連動させるのは、OptionButton ではなく、CheckBotton との事で勉強不足で知りませんでした。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

>optionButtonを多数配置しています 多数というが、理屈じゃなくて、1つのフォームに表示できるスペース的な余地は、そう沢山無いはず。 質問者の設計や考えに無理があるのではないか。 フォーム・コントロールの配置の全貌や必要性が質問文では伝わりにくい。 ーー フォームやコントロールは起動の都度、望ましい初期状態にして表示しないと、常識的な状態になってしまうと思う。チェックボタンのOffやテキストボックスの空白のような。どうなるかを自分で確認するのも勉強のうち。 ワークシートに直接貼り付けたテキストボックスやチェックボックスは状態が保存された。 FormのLoadやInicializeイベントで表示するごとに、望ましい初期状態に設定することが必要ではないかな。 VisibleがFalseをTrueにするぐらいなら、終了したわけでないので、その前の状態が現れると思うが。 >UserFormをワークシート上に再表示すとるー>すると どういう方法・コード・タイミングで再表示したのかな。 この質問は相当高度な内容を含んでいるようにも思うが。 質問の表現では判らない。 http://questionbox.jp.msn.com/qa1030689.html などVB.NETの例だが、「プロパティ値の保存」という事で話題になっている。 >UserFormをワークシート上に再表示すとる 1つのワークシートとユーザーフォームは本来関係付けるものではないはず。 ユーザーが実質上シートとフォームを関連付けて使っているだけなのではないかな。 表示はアクチブシートの上(?と共に?)に表示される。 「シートごとにユーザーフォームを別にする」ことは使い方としては出来る。 http://itpro.nikkeibp.co.jp/article/COLUMN/20071023/285157/ この辺の理解も初心者には難しいと思う。 ーー フォームの表示そのものが、ブックやシートのイベントをきっかけにして表示されないと、直前のブックを閉じる前にフォームが表示されていたからといって、次に開いたとき自動(特別のユーザープログラムなしで)でそのフォームが現れるものではないと思う。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

ユーザフォームのInitializeイベントで初期値を設定してください。 UserForm_Initialize() です。

関連するQ&A

  • Excel2003で簡単な図形の表示と非表示のプログラムを作成したので

    Excel2003で簡単な図形の表示と非表示のプログラムを作成したのですが上手く出来ません UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1に楕円の図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1に楕円の図形2非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1に楕円の図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1に楕円の図形2表示 End Sub 上記の記述では上手くいくのですが、下記の様に ワークシート2の図形3と4も同様に表示・非表示したいため追加するとエラーになります。 UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1の楕円図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1の楕円図形2非表示 ActiveSheet.Shapes("Oval 3").Visible=True 'ワークシート2の楕円図形3表示 ActiveSheet.Shapes("Oval 4").Visible=False 'ワークシート2の楕円図形4非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1の楕円図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1の楕円図形2表示 ActiveSheet.Shapes("Oval 3").Visible=False 'ワークシート2の楕円図形3非表示 ActiveSheet.Shapes("Oval 4").Visible=True 'ワークシート2の楕円図形4表示 End Sub VBAの勉強中の初心者です。教えて頂けないでしょうか。

  • Excel VBA で自在に図形を変化させたい

    Excel VBAを使って図形を自由に変化させたいと思っています。 一つの形の四角形や三角形をVBAを使ってシート上に表記することは出来ます。 私はユーザーインターフェースを作り、テキストボックスに値を入れることで図形を変化させることをしたいと思っています。 例えば、一つの三角形を正三角形にしたり、直角二等辺三角形にしたり、自在に角度を変えてVBAに描かせたいと思っています。 三角形は以下のようにコードを記述しましたらシートに表示できました。 Sub 三角形作成() Set ArwLine = ActiveSheet.Shapes.AddLine(10, 10, 200, 200) Set ArwLine = ActiveSheet.Shapes.AddLine(200, 200, 100, 400) Set ArwLine = ActiveSheet.Shapes.AddLine(100, 400, 10, 10) End Sub これを以下のようにして変数(x、y)にユーザーインターファースから値を代入するようにしたいのですがどのようにすればよいのでしょうか教えてください。 Private Sub CommandButton1_Click() UserForm1.Show End Sub Sub 三角形作成() Set ArwLine = ActiveSheet.Shapes.AddLine(10, 10, 200, 200) Set ArwLine = ActiveSheet.Shapes.AddLine(200, 200, x, y) Set ArwLine = ActiveSheet.Shapes.AddLine(x, y, 10, 10) End Sub 前回、「Excel VBAで図面を書きたい」という質問をしたのですがややこしく書いたため解答される方が居ませんでしたので編集して再質問をさせていただきます。 よろしくお願いします。

  • エクセルVBAの構文についての質問です

    ちょっと前から勉強しはじめた超超初心者なんですが、オブジェクトやプロパティといった概念がちょっと理解できないでくるしんでいます 1、 Sub 図形非表示() ActiveSheet.Shapes("図形").Visible=False End Sub これは本にのっていた例文でアクテブシートの「図形」という名前のオートシェイプを非表示にする文なのですが本には「Visible プロパティ」 「Shapes プロパティ オートシェイプを返します」とありますがこれはつまり「Shapesプロパティ自体がオブジェクトになっている」ということなのでしょうか?「Shapes プロパティ」とかいてあるのでただのプロパティなのではないか???とおもってしまうのですが・・・ 2、 1と同じ感じなのですが Sub ワークシートに色を設定()   Worksheets("メニュー").Cells.Interior.ColorIndex=11 End Sub もInteriorプロパティ自体がオブジェクトになっているのでしょうか?? だとしたら全てのプロパティもオブジェクトになれるのでしょうか? 是非どなたか教えてください、よろしくお願いします

  • [エクセル2007] 図形を非表示にするマクロ

    図形「図A」を非表示にするマクロがあります。 Sub 図削除() ActiveSheet.Shapes("図A").Visible = False End Sub これを図A、図B、図C・・・・・・と増やしていく場合はどうすれば良いのでしょうか? Sub 図削除() ActiveSheet.Shapes("図A").Visible = False ActiveSheet.Shapes("図B").Visible = False ActiveSheet.Shapes("図C").Visible = False            ・            ・             ・ End Sub とするしかないのでしょうか?

  • エクセルVBAで

    CommandButton2がクリックされた時に、 すでに表示されているUserForm1を消したいのですが、 Private Sub CommandButton2_Click() UserForm1.(  ) End Sub (  )にくる言葉は何でしょうか?

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • VBA_UserFormの初期値

    毎度お世話になっております。 UserFormを開いた時に、UserForm内にあるTextBoxに初期値として 文字を入れたいのですが、表示されません。 原因が判りません。判りましたらご教授お願いします。 プロジェクトの状況 ワークシート3枚(内コード有1枚 シート名:表紙) フォーム2つ(フォーム名:UF1・UF2) 表紙にあるAボタンを押したらUF1が開くBでUF2が開くようなマクロです。 シート"表紙"コード Private Sub CommandButtonA_Click() UF1.show End Sub UF1(コード) Private Sub UF1_Initialize() TextBox.Value="文字" End Sub "文字"をUF1フォーム内に最初から出したいと考えてます。 宜しくお願いします。

  • EXCELVBAで同じフォームボタンで表示のON/OFFをする。

    EXCELVBA初心者です。 図形描写の”表示”、”非表示”はできたのですが 同じボタンをクリックしてON/OFFする方法を教えてください。 ボタンが2個だといまいちなので、よろしくお願いします。 Sub 図形_del() ActiveSheet.Shapes("daily7").Visible = False End Sub Sub 図形_add() ActiveSheet.Shapes("daily7").Visible = True End Sub

  • エクセルVBAでShapesまたはDrawingObjects

    シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub

  • EXCEL VBA これであっていますか?

    エクセルに地図を貼り付け、その中のある地点Aから半径1キロ、2キロ、3キロといった具合に円を描いています。ある地点B、Cも同様に円があります。セルに“A” と入力した際に該当する地点の円(1キロ、2キロ、3キロの3種類)を赤く表示し、終了すると円が消える(線なしに変わる)ようにするために以下のようなVBAを組みました。が、円が2つしか赤くならなかったり、 ばあいによっては「インデックスが境界を超えています」とエラーが出たりします。 どうしたら良いか教えてください。 Sub iro() Dim i As Variant i = InputBox("表示する地点を指定してください", "地点指定") If i = "A" Then ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False modosu ElseIf i = "B" Then ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False Else MsgBox "指定した地点がありません", vbOKOnly End If End Sub Sub hyoji() Selection.ShapeRange.Line.Visible = msoTrue '「線なし」に設定されている場合、線を表示 Selection.ShapeRange.Line.ForeColor.SchemeColor = 10 Range("A1").Select End Sub Sub modosu() Selection.ShapeRange.Line.Visible = msoFalse '「線なし」に設定 Range("A1").Select End Sub

専門家に質問してみよう