ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのVBA 複数のCheckBoxのオンオフの組み合わせについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
トピック一覧を見たら連投で申し訳ないのですが、教えてください。
ユーサーフォームにCheckBoxを3つ用意しています。
それぞれのオンオフの組み合わせは8通りあると思います。←多分

その組み合わせによってセルに数字を返そうと思っています。
以下のように自分で記述したのですが、どうもスマートじゃない。。。
これってもっとシンプルに記述できそうなんですが、皆さんのご意見を伺いたいです。
また、セルの値を元に逆にCheckBoxのオンオフを制御したいとも思っています。

もちろん逆の記述を作ればいいのですが、そのことを念頭において考えると少しでもシンプルな記述で判別できないかと思っています。
よろしくお願いします。

Win7 2010です。

-------------------------
If CheckBox3.Value = True And CheckBox4.Value = True And CheckBox5.Value = True Then
Cells(intRow, 123).Value = 1
ElseIf CheckBox3.Value = True And CheckBox4.Value = True And CheckBox5.Value = False Then
Cells(intRow, 123).Value = 2
ElseIf CheckBox3.Value = True And CheckBox4.Value = False And CheckBox5.Value = False Then
Cells(intRow, 123).Value = 3
ElseIf CheckBox3.Value = False And CheckBox4.Value = False And CheckBox5.Value = False Then
Cells(intRow, 123).Value = 4
ElseIf CheckBox3.Value = False And CheckBox4.Value = True And CheckBox5.Value = True Then
Cells(intRow, 123).Value = 5
ElseIf CheckBox3.Value = False And CheckBox4.Value = False And CheckBox5.Value = True Then
Cells(intRow, 123).Value = 6
   ・
   ・'後略

-----------------------------------

コメント(8)

Cells(1,1)= 8 + CheckBox1 * 4 + CheckBox2 * 2 + CheckBox3

数値は適当に変更してください。
>>ミキスタさん
ありがとうございます。

>数値は適当に変更してください。
とありますが、お手数ですが書いていただいたコードの説明をいただけると大変ありがたいのですが。。。
CheckBox1に4を掛けたりしているように見えるのですがどういうことでしょう?
(1)チェックボックスの組み合わせを数値化したものと本来望む値との対応表を作る
(2)各チェックボックスに重み付けして足し合わせた値を表のindexとして算出
(3)対応表からindex値で所望の値を引く
のような手順を行ってやればちょっとは簡単になりますね。

Dim iCheckBox As Integer 'チェックボックスのOn/Offを数値化したもの
Dim varCellValue As Variant '本来欲しい値の表
Dim iCellValue As Integer '最終的にセルに格納する値
varCellValue = Split("1 4 3 7 5 6 8 2") '望む値を並べたリスト
iCheckBox = -((CheckBox3.Value = True) + 2 * (CheckBox4.Value = True) + 4 * (CheckBox5.Value = True))
iCellValue = Val(varCellValue(iCheckBox))


チェックボックスの組み合わせと最終的に出す数値との対応に意味付けをせず
場合分け出来れば良いなら、単純に重みづけしてindexを算出すればOKです。
>>[2]
<ヒント>
・チェックボックスコントロールのデフォルトプロパティはValueなので、
 この場合CheckBox1は、CheckBox1.Valueと等価です。
・チェックボックスコントロールのValueプロパティはBoolean型の値なので、
 値としてTrueかFalseを持ちます。
・Boolean型の値はVBA上で他の型との数値演算の際には、
 True=-1、False=0として評価されます。
 ※ワークシート関数上ではTrue=1、False=0と扱いが異なるので注意

>>1のミスキタさんの提示した式は、CheckBox1〜3のチェックのOn/Off状態に
応じて1〜8のいずれかの値をとります。

何故2や4を掛けるのか?についてはまた手が空いたら追記します。
(あるいは他の優しい方に期待…)
Danielさん、こんにちは。

ミスキタさんは進数計算のようなものをイメージされ、
チェックボックスの組み合わせで得られる計算結果がかぶらないようされたいるようです。

以下は似たような考えですがご参考にしてください。


※A1セルの書式を文字列にしてお試しください。

Sub セルに反映する()
  Range("A1").Value = CheckBox1.Value * -1 & CheckBox2.Value * -1 & CheckBox3.Value * -1
End Sub

Sub チェックボックスに反映する()
  CheckBox1.Value = CBool(Mid(Range("A1").Value, 1, 1))
  CheckBox2.Value = CBool(Mid(Range("A1").Value, 2, 1))
  CheckBox3.Value = CBool(Mid(Range("A1").Value, 3, 1))
End Sub

Valueプロパティの値がTrueならOn、FalseならOffで表現すると、
CheckBox1が Onなら1文字目に1、Offなら0、
CheckBox2が Onなら2文字目に1、Offなら0、
CheckBox3が Onなら3文字目に1、Offなら0、をA1セルにセットしています。

On On Offなら "110" 、Off On Offなら "010"といった感じです。

チェックボックスに反映のほうは、その逆を行っています。

TrueはVBA上で数値換算すると -1 になるため、-1を掛けています。

チェックボックスに反映する際はCBool()しなくても動くでしょうが、
気持ち悪いのでBoolean型に戻してからセットするようにしています。
> されたいるようです。
・・・まぁ、意味は通じますね^^;


すれ違いでMinonさんがBoolean型については丁寧に解説してくださっていましたね。
もうちょっと待ってから投稿すればよかったかな^^
チェックボックスコントロールでBoolean型の細かいお話に触れていますので
もうちょっと補足しておきますね。

Minonさんは「Boolean型の値はVBA上で他の型との数値演算の際には・・・」と、
私も同様に「TrueはVBA上で数値換算すると・・・」と、
「数値として扱う場合としては」の前置きをしています。

これはVBAでの例でいいますと
「True = -1 で False = 0」という意味ではないことを指しています。
(そのように扱える場合もあるということ。同じ値ではない。)

評価(比較)の仕方によっては True = -1 という結果になることがありますが
真偽値はあくまで真偽値で、数値ではないので使う際には気にとめておいたほうが無難です。
(特にチェックボックスやオプションボタンを扱う際には注意を・・・)
皆さん、ありがとうございます。
頭が悪く理解に時間がかかってました。

ミキスタさんの記述が一番すっきりしますね。
なぜ4や2を掛けるのかはいまだに謎ですが、これ一文ですむのはすばらしいと思います。

Minonさん
解説と提案ありがとうございます。すごく助かりました。

よっちゃんさん
> されたいるようです。
ぜんぜん気づきませんでしたwwww気にしてませんよ。
ありがとうございます。こちらもすごく参考になりました。


がんばって納得できるものを作りたいと思います。


ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。