dポイントプレゼントキャンペーン実施中!

エクセルのVBAでフォームをつくり
3つのオプションボタンを配置し
チェックした項目のとき、指定したセルに「レ」の印を書き込ませたいのですが、うまくいきません。
同じフォーム内のテキストボックスやコンボボックスの内容はうまくセルに書き込めるのですが・・・

オプションボタンのグループは設定してあります。
下のように記述したのですが、なぜ思うように動作しないか教えてください。

If オプション(3) = True Then
ActiveCell.Value = "レ"
ElseIf オプション(1) = True Then
Range("H21").Value = "レ"
ElseIf オプション(2) = True Then
Range("H23").Value = "レ"
End If

A 回答 (6件)

チェックボタンではなく、オプションボタンって事は、いずれか1つしか「レ」は付かないようにしたいって事ですよね?


OptionButton3 をチェックしたら、OptionButton1 と OptionButton2 に対応するセルをクリアしないと、チェックした全部にレが付いちゃいますけど、、、

そう言う事ではない?

'--------------------------------------------------
Private Sub OptionButton1_Click()
  OpValueSet (Array("レ", Null, Null))
End Sub

'--------------------------------------------------
Private Sub OptionButton2_Click()
  OpValueSet (Array(Null, "レ", Null))
End Sub

'--------------------------------------------------
Private Sub OptionButton3_Click()
  OpValueSet (Array(Null, Null, "レ"))
End Sub

'--------------------------------------------------
Sub OpValueSet(myArray)
Dim rAddress, i As Integer
 If Not IsArray(myArray) Then Exit Sub
 rAddress = Array("H21", "H23", "H25")
  For i = 0 To 2
   ActiveSheet.Range(rAddress(i)) = myArray(i)
  Next i
End Sub
    • good
    • 0
この回答へのお礼

うまく動作しました。ありがとうございました。
勉強のために教えていただきたいのですが、


 rAddress = Array("H21", "H23", "H25")
  For i = 0 To 2
   ActiveSheet.Range(rAddress(i)) = myArray(i)
  Next i

この部分を解説していただけないでしょうか

よろしくお願いします。

お礼日時:2005/06/10 10:42

質問者がやりたいこととあっているか心配ですが


ワークシートにUserformを貼り付けました。
実はVBEの画面で挿入-ユーザーフォームです。
そしてそのユーザーフォームの上にチェックボックスを貼り付けました。
標準モジュールに
Sub test01()
UserForm1.Show vbModeless
End Sub
別にチェックボックスのクリックイベントプロシージュアーに
Private Sub CheckBox1_Click()
If CheckBox1 = True Then
ActiveCell = "V"
Else
ActiveCell = ""
End If
End Sub
を作りました。
実行すると、ワークシート画面になりフォームが現れます。
好きなセルを指定して、ユーザーフォームのチェックボックスをクリックすると、アクチブセルに「V」が
入ります。別のセルの「V」の入ったセルでチェックボックスのVをクリックするとそのアクチブセルは空白になります。
vbModelessのことが言いたかったのですが、エクセル
2000以上でないと使えないそうです。
フォームが表示されている間も、セルの指定を動かすことができました。
    • good
    • 0

投稿途中で中止して、ちょっと書換えたら#3~4が2重投稿になっちゃったようでスミマセン。




Wendy02さん
こんにちは。

> なお、グループ化しても、オブジェクトとしてまとまるだけで、あまり役に立たないと思います。
> 使う場合は、フレームで囲います。

たぶんグループ化ではなく GroupName プロパティで同グループに設定してあるって意味ではないかと、、、
フレームに置かなくてもすみますし。
    • good
    • 0

もう、解決をしているようですが、少し、私のほうからも書かせていただきます。



papayukaさんの回答でうまく行っているというと、ユーザーフォームなんですね。
ご質問は、「フォーム」と、お書きになっていたので、EXCELでは、「フォーム」は、ワークシートのオブジェクトの配下に入りますので、そちらのように読めました。

ユーザーフォームでは、あえて、個別のコントロール・コレクションを作らないと、VBのようには、コレクション化ができません。

>If オプション(3) = True Then
を使うのでしたら、以下のようになります。

'<ユーザーフォーム・モジュール>
Dim オプション As New Collection
Private Sub UserForm_Initialize()
'コントロールのコレクション化
For i = 1 To 3
 オプション.Add Me.Controls("OptionButton" & i)
Next
End Sub

Private Sub CommandButton1_Click()
 Union(ActiveCell, Range("H21"), Range("H23")).ClearContents
 If オプション(3).Value = True Then
  ActiveCell.Value = "レ"
 ElseIf オプション(1).Value = True Then
  Range("H21").Value = "レ"
 ElseIf オプション(2).Value = True Then
  Range("H23").Value = "レ"
 End If
End Sub

'※UserForm の起動は、モードレス(0)
'第3番目のElseIf があるというのは、他にもOptionButton がある、ということでしょうか?なければ、Else だけでもよいです。

のようにします。

しかし、一般的なOfficeのVBAのコードですと、このようにしたら楽だと思います。

'<ユーザーフォーム・モジュール>

Private Sub OptionButton1_Click()
 ActiveCell.ClearContents
 Range("H23").ClearContents
 Range("H21").Value = "レ"
End Sub

Private Sub OptionButton2_Click()
  ActiveCell.ClearContents
  Range("H21").ClearContents
  Range("H23").Value = "レ"
End Sub

Private Sub OptionButton3_Click()
  Range("H21,H23").ClearContents
  ActiveCell.Value = "レ"
End Sub

'※UserForm の起動は、モードレス(0)

なお、グループ化しても、オブジェクトとしてまとまるだけで、あまり役に立たないと思います。使う場合は、フレームで囲います。
    • good
    • 0

#2です。



>  rAddress = Array("H21", "H23", "H25")
>   For i = 0 To 2
>    ActiveSheet.Range(rAddress(i)) = myArray(i)
>   Next i

各OptionButton のクリックでサブルーチンを呼ぶ際に配列を渡します。

 OpValueSet (Array("レ", Null, Null))

受け取った配列 myArray は 3つ値を保持しています。
最初の Index は 0 なので、myArray(0)で "レ" を取り出せます。

同様に セルのアドレスを配列にして、0~2でループすれば、

 ActiveSheet.Range("H21") = "レ"
 ActiveSheet.Range("H23") = Null
 ActiveSheet.Range("H25") = Null

こう書いたのと同じ意味です。
押されたボタンによって、

 ActiveSheet.Range("H21") = Null
 ActiveSheet.Range("H23") = "レ"
 ActiveSheet.Range("H25") = Null



 ActiveSheet.Range("H21") = Null
 ActiveSheet.Range("H23") = Null
 ActiveSheet.Range("H25") = "レ"

となります。
    • good
    • 0

#2です。



>  rAddress = Array("H21", "H23", "H25")
>   For i = 0 To 2
>    ActiveSheet.Range(rAddress(i)) = myArray(i)
>   Next i

各OptionButton のクリックでサブルーチンを呼ぶ際に配列を渡します。

 OpValueSet (Array("レ", Null, Null))

受け取った配列 myArray は 3つ値を保持しています。
最初の Index は 0 なので、myArray(0)で "レ" を取り出せます。

同様に セルのアドレスを配列にして、0~2でループすれば、

 ActiveSheet.Range("H21") = "レ"
 ActiveSheet.Range("H23") = Null
 ActiveSheet.Range("H25") = Null

こう書いたのと同じ意味です。
押されたボタンによって、

 ActiveSheet.Range("H21") = Null
 ActiveSheet.Range("H23") = "レ"
 ActiveSheet.Range("H25") = Null



 ActiveSheet.Range("H21") = Null
 ActiveSheet.Range("H23") = Null
 ActiveSheet.Range("H25") = "レ"

となります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!