こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ExcelVBA チェックボックスに値を持たせる方法

こんにちわ。
チェックボックスが50個近くあるユーザーフォームを作りました。
"変更"というボタンを押下した時、
あるセルに値が入るようなコードを作成しています。

現在はCheckBox1の時は1、CheckBox2の時は2をセルに入れ動作確認したのですが、本当はそれぞれのボタンに応じたCodeをセルに入力したいのです。

発想が乏しく、よい方法が考え付きません。
何かいい方法ありましたら、ご教授願います。

投稿日時 - 2005-12-26 16:02:47

QNo.1860548

すぐに回答ほしいです

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

次は、CheckboxのGroupNameに<それぞれのボタンに応じたCode>をセットしておくと、ON、OFFに応じてCheckBoxに対応するセルにしかるべきCodeを代入します。

Private Sub CommandButton1_Click()
  Dim I As Integer
  
  For I = 1 To 50
    If Me.OLEObjects("CheckBox" & I).Object.Value Then
      Me.Range("A" & I) = Me.OLEObjects("CheckBox" & I).Object.GroupName
    Else
      Me.Range("A" & I) = ""
    End If
  Next I
End Sub

投稿日時 - 2005-12-26 22:55:44

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.9

s_husky です。
先に示した回答は、幾つかの作法上の問題点があります。
もし、可能であれば、プログラムコードやコントロールにCodeを埋め込むのを中止されることをお勧めします。
次は、AutoOpenモジュールでCodeを広域変数 Codes()にセットし、CheckBox の真偽によって対応するセルにCodeを代入するサンプルです。

' ----------------------------------------------
' AutoOpen モジュール
' ----------------------------------------------
Option Explicit

Public Coads() As String

Sub Auto_Open()
  Dim CoadDatas As String
  
  CoadDatas = "Code1;Code2;"
  Coads() = Split(CoadDatas, ";")
End Sub

' ----------------------------------------------
' Sheet1 モジュール
' ----------------------------------------------
Option Explicit

Private Sub CommandButton1_Click()
ON Error Goto Err_CommandButton1_Click
  Dim I As Integer
  Dim N As Integer
  
  N = UBound(Coads())
  For I = 1 To N
    If Me.OLEObjects("CheckBox" & I).Object.Value Then
      Me.Range("A" & I) = Coads(I - 1)
    Else
      Me.Range("A" & I) = ""
    End If
  Next I
Exit_CommandButton1_Click:
  Exit Sub
Err_CommandButton1_Click:
  MsgBox "Error!(CommandButton1_Click)"
  Resume Exit_CommandButton1_Click
End Sub

投稿日時 - 2005-12-27 09:04:27

ANo.7

再びこんにちは。KenKen_SP です。

Wendy02 さんのコメントを読んだら、やっぱり #6 は勘違いみたいですね、、、
#6 は チェックボックスのオン・オフを問題にしています。
すみませんが、スルーの方向で、、

それから、#6 でタイプミスがありました。一応訂正しておきます。

(誤)Inilialize   (正)Initialize

投稿日時 - 2005-12-26 22:52:18

ANo.6

こんにちは。KenKen_SP です。

> 本当はそれぞれのボタンに応じたCodeをセルに入力したいのです。

ご質問の意図を理解しているか自信がないのですが、アイディアとしては、
チェックボックスの Tag プロパティーを使えば良いかと、、

例えば、次のような仕様のデータを Tag プロパティーに設定しておきます。
<>の記号をデータ区切りとします。

書き込むセルアドレス<>チェックオン時のデータ<>チェックオフ時のデータ

具体的に書けばこんな感じです。

Sheet1!A1<>1<>2 

これは、各チェックボックスの Tag プロパティーに設定するわけですが、
プロパティーウインドウで設定しておいてもいいし、コードで Inilialize
イベントで設定してもいいですね。

あとは、コマンドボタン押下をトリガーにして、フォームのコントロールを
ループさせ、チェックボックスかつ Tag プロパティーが設定されたもののみ
その状態で条件分岐させてセルに書き込みます。

下記のサンプルを試す場合、チェックボックスの Tag プロパティーに上記
の仕様に沿ったデータを予め設定しておいて下さい。


Private Sub CommandButton1_Click()
  
  Dim CTRL  As MSForms.Control
  Dim aryDATA As Variant
  
  For Each CTRL In Me.Controls
    If TypeOf CTRL Is MSForms.CheckBox And CTRL.Tag <> "" Then
      aryDATA = Split(CTRL.Tag, "<>")
      If CTRL Then
        'チェックオン時
        Evaluate(aryDATA(0)).Value = aryDATA(1)
      Else
        'チェックオフ時
        Evaluate(aryDATA(0)).Value = aryDATA(2)
      End If
    End If
  Next CTRL
  
End Sub

勘違いかもしれないし、あまり意味もないかもしれませんが。

投稿日時 - 2005-12-26 22:26:39

ANo.5

こんばんは。

なぜ、CheckBox なのか良く分りませんね。1とか2とか、「あるセル」とは、同じセルに入れるのでしょうか?もし、そうでしたら、CheckBox は、複数選択が可能なのだから、OptionButton が正しいのでは?

それに、CheckBox でも、OptionButtonでも、インスタンスを設ければ、クリックすれば、プロパティに設定した値が入るはずです。

私個人は、
>ではソースが汚くなってしまうので、これは避けたい。

もともと、コントロール配列を持たないVBAでは、プロとしての書き方の方でも、凝った書き方はしないはずです。私自身も、実際のコーディングの場では、MSの推奨する最適化書式やVBの書法ルールには幾分は従いますが、その内容自体には、こだわりを持ちませんね。

>セルに入力したいコードも規則性のないコードなので、ループを使用することもできない。

これは、意味がわかりません。それぞれ違うコードを統一することは不可能です。

投稿日時 - 2005-12-26 21:52:23

ANo.4

こんばんわ。

コントロールツールボックスで追加したチェックボックスなら、No.3,AlexSunsさんの回答で応用できると思います。
なお、VBEのフォームで追加したチェックボックスなら、No.3のコードを一部変えればいいですね。

No.3のコード
    If Worksheets("Sheet1").OLEObjects("CheckBox" & index).Object.Value Then
VBEのフォームのコード(UserForm1にチェックボックスがある場合)
    If UserForm1.Controls("CheckBox" & index).Value = True Then

つまり、チェックボックス,オプションボタン,コマンドボタン等、コントロール名の末尾が続き数字になっているものは、配列数字?の様に扱う事ができます。

投稿日時 - 2005-12-26 19:14:20

ANo.3

こんな感じで出来ますよ

Private Sub CommandButton1_Click()

  Dim index As Integer

  For index = 1 To 5 Step 1
    If Worksheets("Sheet1").OLEObjects("CheckBox" & index).Object.Value Then
      MsgBox "チェックボックスの " & index & " 番がチェックされているよ"
    End If
  Next

End Sub

投稿日時 - 2005-12-26 17:55:32

中途半端に書き込んで申し訳ないです。私は不可能だと思ってます。
下記のように書けばEnd Ifは最低いらないので50行並ぶだけですよね?
私はこのように処理してます。
If CheckBox1.Value = True Then Range("A1").Value = "○○"

何の参考にもならず申し訳ないです・・・。

投稿日時 - 2005-12-26 16:55:26

If CheckBox1.Value = True Then
を使ってチェックが入っている場合は対象セルに何かを入れるというふうに
したのではダメですか?

投稿日時 - 2005-12-26 16:10:14

お礼

回答ありがとうございます。
説明不足だったようで・・・すいません。

1、チェックボックスが50個近くあるため、
  If CheckBox1.Value = True Then
  ではソースが汚くなってしまうので、これは避けたい。

2、セルに入力したいコードも規則性のないコードなので、
  ループを使用することもできない。

といった感じです。何かよい方法ありませんでしょうか??

投稿日時 - 2005-12-26 16:22:15

あなたにオススメの質問