[[20150905143204]] 『チェックボックスについて』(ふみ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『チェックボックスについて』(ふみ)

おそらく初歩的な事で申し訳ありませんが、どうしてもわからないので。

チェックボックスを初めて使うのですが、
フォームコントロールのチェックボックスを挿入して、
名前はチェック1になっています。
オブジェクトの選択と表示ではCheck Box1となっています。

このチェックボックスをONしている時に計算式を走らせたいのですが、
例えば
If Sheets(Sheet2).CheckBox1.Value = True Then
と書いても、「型が一致しません」となります。

色々NETで調べてNETと同じコードを書いてみたのですが、
どれもエラーになります。

何が原因でしょうか?よろしくお願いします。

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 If Sheets("Sheet2").CheckBox1.Value = True Then 
 だとどうですか?
(se_9) 2015/09/05(土) 14:53

se_9さん、ありがとう御座います。
やってみましたが、
「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
となりました。
基本的な記述も間違えていて、恥ずかしいです。
(ふみ) 2015/09/05(土) 15:02

さっきやった時は出来なかったのですが、
CheckBox1をH13にリンクさせて

If Sheets("Sheet2").Range("H13").Value = True Then

と書いたら走りました。

また疑問なのですが、H13には「TRUE」、「FALSE」が表示されるのに、
CheckBox2をH21にリンクさせると、値は変わりますが、表示されません。
同じ事をしているはずなのですが、なんでしょう?

(ふみ) 2015/09/05(土) 15:19


 できる場合もあるということですから間違ってはいないのでしょうけど、念のための確認です。

 そのチェックボックスは、本当に 【フォームコントロール】のチェックボックスですか?
 【ActiveX】の CheckBox ではないのですか?

 前者ならコントロー名が チェック 1 等になりますし、後者なら CheckBox1 等になります。
 (もっとも、挿入後、任意に名前を変更できますが)

(β) 2015/09/05(土) 16:05


βさん、ありがとう御座います。
チェックボックスは間違いなく「フォームコントロール」です。
「Active X」もやってみたのですが、難しそうで止めました。

「チェック1」でも色々やってみたのですが、出来ませんでした。
今はセルにリンクさせると走るので、妥協策ですが、
このコードで進めています。

今は、
Private Sub Worksheet_Change(ByVal Target As Range) で、
書きかえたら Call でコードを走らせているのですが、
エラーが出ると、一旦シートを閉じないとコードが走らなくなる問題で
悩んでいます。

(ふみ) 2015/09/05(土) 16:19


 >>チェックボックスは間違いなく「フォームコントロール」です。

 ということは、シートに挿入した後に 名前を "CheckBox1" や "CheckBox2" に変更したのですか?
 以下のコードを【シートモジュール】に貼り付けて実行して、どんなメッセージが出るか教えてもらえませんか。

 Sub test()
    Dim sp As Object

    For Each sp In DrawingObjects
        Select Case TypeName(sp)
            Case "CheckBox"
                MsgBox "フォームコントロール/ " & sp.Name & " / " & sp.LinkedCell
            Case "OLEObject"
                If TypeName(sp.Object) = "CheckBox" Then MsgBox "ActiveX/ " & sp.Name & " / " & sp.LinkedCell
        End Select
    Next
 End Sub

 >>「Active X」もやってみたのですが、難しそうで止めました。

 いや、特に難しさ(簡単さ?)はかわりませんよ。

 >>Private Sub Worksheet_Change(ByVal Target As Range) で、 悩んでいます。 

 そのコードをコピペでアップしてもらえますか?

 たぶん、Application.EnableEvents = False が」記述してあって、
 エラーでとまって、そのあとにかいてあるだろうと思われる
 Application.EnableEvents = True が実行されていないからだとは思いますが。

(β) 2015/09/05(土) 16:25


>エラーが出ると、一旦シートを閉じないとコードが走らなくなる
Application.EnableEvents = False
'エラーが出るコード
Application.EnableEvents = True
のような時、デバッグモードで「エラーが出るコード」でマクロを終了させてしまうと、
そのような現象が発生するので、これが原因ではないかと推測します。

アプリケーション再起動以外の方法として、次のようなものが考えられます。
【1】デバッグモードのときに Application.EnableEvents = True までスキップしてこの行だけは実行させる。
【2】イミディエイトウィンドウでApplication.EnableEvents = True を走らせる
【3】Application.EnableEvents = Trueを記述したイベントトリガー回復用のマクロを用意しておく。

(みやほりん) 2015/09/05(土) 16:37


 フォームツールかActiveXかは調査いただくとして、その値は以下のように、直接取得できますよ。
 同じく【シートモジュール】に。

 'フォームコントロール
 Sub SampleF()  '結果は xlOn/xlOff
    MsgBox Sheets("Sheet1").CheckBoxes("チェック 1").Value  'シート名
    MsgBox Sheet1.CheckBoxes("チェック 1").Value            'シートCodeName
    MsgBox CheckBoxes("チェック 1").Value                   'シートモジュールならこれだけでも。
 End Sub

 'ActiveX
 Sub SampleX()  '結果は True/False
    MsgBox Sheets("Sheet1").CheckBox1.Value                 'シート名
    MsgBox Sheet1.CheckBox1.Value                           'シートCodeName
    MsgBox CheckBox1.Value                                  'シートモジュールならこれだけでも。
 End Sub

 ## (みやほりん)さん お久ですね。
   といってもご一緒したのは、1度きりだと思いますが、私の存じよりのぶらっとが、以前、よくお世話になったようで。

(β) 2015/09/05(土) 16:54


βさん、みやほりんさん、ありがとう御座います。

今日は時間切れなので、来週月曜日から続きを確認します。
ありがとう御座います。

βさん、未熟者なので疑われても仕方有りませんが、
間違いなく「フォームコントロール」ですし、
名前も変更していません。
よろしくお願いします。
(ふみ) 2015/09/05(土) 17:11


 9/6 1:44 コメント、わかりづらいところがあったので一部加筆訂正。

 >>βさん、未熟者なので疑われても仕方有りませんが、 間違いなく「フォームコントロール」ですし、名前も変更していません。

 いやぁ・・ 疑ったのではなく、

 >>名前はチェック1になっています。 
 >>オブジェクトの選択と表示ではCheck Box1となっています。

 オブジェクトの選択と表示では Check Box 1 (Box と 1 の間にも半角スペース)になっているのを
 投稿時にミスタイプされたんだろうなとは思っているんですが、コードの中では
 CheckBox1 と、Check と Box の間、Box と 1 の間の半角スペースも取り除いたものを使っておられるので
 あぁ、名前ボックスで変更されたんだろうな、そうではなく、最初から CheckBox1 という名前だとすれば
 それは ActiveXなので・・と、思って、念のための確認をしたんですよ。

 フォームコントロールですね。
 であれば、値の参照の方式がフォームコントロールにふさわしくないということですね。

(β) 2015/09/05(土) 16:54 の SampleF を参考にしてください。

 繰り返しになりますが、フォームコントロールであれば、なぜありもしない名前(CheckBox1)をコード内で使ったのかなと。
 そこが、混乱のもとでしたよ。

(β) 2015/09/05(土) 17:23


βさん、みやほりんさん、ありがとう御座います。
Application.EnableEvents = False とApplication.EnableEvents = True を
使っていますので、これがコードが走らなくなる原因とわかりました。

【1】デバッグモードのときに Application.EnableEvents = True までスキップして
   この行だけは実行させる。
【2】イミディエイトウィンドウでApplication.EnableEvents = True を走らせる
【3】Application.EnableEvents = Trueを記述したイベントトリガー回復用のマクロを用意しておく。

教えて頂いたのですが、やり方がよくわからないので、とりあえず終了させて作業します。

βさん、
If Sheets("Sheet2").CheckBoxes("チェック 1").Value = True Then
に書き変えたら、エラーは出なくなったのですが、
チェックボックスをONにしてもOFFにしてもElseのコードに
飛んでしまいます。
Trueのコードのところで、「True=True」と表示が出ます。
MsgBoxで表示させた時は「1」が返ってきていました。

(ふみ) 2015/09/07(月) 10:31


 >>If Sheets("Sheet2").CheckBoxes("チェック 1").Value = True Then 

 「(β) 2015/09/05(土) 16:54 の SampleF を参考にしてください。」
 と申し上げました。このSampleFは、コードとしては Valueの参照しかありませんがコメントで
 「'結果は xlOn/xlOff」と書いておきましたのでおわかりになると思ったんですが・・・

 If Sheets("Sheet2").CheckBoxes("チェック 1").Value = xlOn Then 

 これで試してみてください。

 Application.EnableEvents の件、みやほりんさんは、そんなに難しいことを言っているのではないですよ。
 みやほりんさんのアドバイスの中で、一番簡単なのは、標準モジュールに

 Sub 復旧()
   Applicatioon.EnableEvents = True
 End Sub

 こんなコードを書いておいて、このような状況になったら、このマクロを走らせる。
 そうすると、復旧します。

(β) 2015/09/07(月) 10:39


βさん、ありがとう御座います。
xlOnにしたら、正常に動作しました。
未熟者以下ですので、理解力がありません。

また復旧コードを標準モジュールに書いて、
仮のボタンを作って走らせてみたのですが、
「変数が定義されていません」となります。
おそらくちょっとコードを書き足せば良いのでしょうが、
それすらわかりません。

(ふみ) 2015/09/07(月) 11:00


βさん、ごめんなさい。
コードをコピペしたので、スペル間違いだけが原因でした。(復旧コード)

もうひとつ、教えて頂きたいのですが、
チェックボックスをONしたり、OFFしたりするとコードが走る様にするには、
どの様に記述したら良いのでしょうか?
(ふみ) 2015/09/07(月) 11:15


 スペルミス、ごめんなさ〜い、ペコリ(汗)

 ActiveXなら、シートモジュールで Clickイベントが利用できますが、フォームコントロールの場合は
 たとえばシートモジュールに以下のようなマクロを書いて(マクロ名は任意のもの)それをチェックボックスに
 マクロ登録してください。

 これは、同じシート上のチェックボックスなら、(もし、そうしたければ)どれに対しても同じマクロの登録ができます。
 どのチェックボックスが押されたのかは、.Name で判定できます。

 もちろん、チェックボックスごとに、異なるマクロを準備して、マクロ登録することもできます。

 Sub CB_Click()
    With CheckBoxes(Application.Caller)
        If .Value = xlOn Then
            MsgBox .Name & " がCheckされました"
        Else
            MsgBox .Name & " のCheckがはずれました"
        End If
    End With
End Sub

(β) 2015/09/07(月) 13:17


βさん、ごめんなさい。

今は、ひとつのシート上に5つのチェックボックスを設けて、(5項目)
一つの項目のセルの値を変えたら、再計算する様にしています。

このコードを繰り返し、それぞれ独立して走る様にしています。
しかし今回、チェックボックスを切り替えたら、
セルの値を変えた時と同じ様に再計算させたいです。

1項目のコードを載せますので、どの様に書いたら良いか教えて下さい。

Sub 曲げ有り()

Dim mage As Variant

If Sheets("Sheet2").CheckBoxes("チェック 1").Value = xlOn Then

mage = (Sheets("Sheet2").Range("F13") * Sheets("Sheet3").Range("F8")) / 60 _
+ (Sheets("Sheet2").Range("F15") * Sheets("Sheet3").Range("F9")) / 60 _
+ (Sheets("Sheet2").Range("F17") * Sheets("Sheet3").Range("F10")) / 60

Sheets("Sheet2").Range("F13").Interior.Color = RGB(255, 255, 255)
Sheets("Sheet2").Range("F15").Interior.Color = RGB(255, 255, 255)
Sheets("Sheet2").Range("F17").Interior.Color = RGB(255, 255, 255)

Else: mage = 0
Sheets("Sheet2").Range("F13").Interior.Color = RGB(255, 255, 204)
Sheets("Sheet2").Range("F15").Interior.Color = RGB(255, 255, 204)
Sheets("Sheet2").Range("F17").Interior.Color = RGB(255, 255, 204)

End If

Sheets("Sheet2").Range("C14") = mage

MsgBox "曲げ有り " & mage / 60 * Sheets("Sheet3").Range("F2") & " 円"

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Row > 17 Then Exit Sub
If Target.Row < 13 Then Exit Sub
If Target.Column <> 6 Then Exit Sub

    Application.EnableEvents = False

    Call 曲げ有り

    Application.EnableEvents = True

End Sub

(ふみ) 2015/09/07(月) 13:44


立て続けで申し訳有りません。
同じコードを繰り返したら走らなかったので、
コードを変えました。
このコードなら5項目のどのセルを変更しても
正しく走る様になったのですが、
チェックボックスを変更して
同じ様にするには?

Private Sub Worksheet_Change(ByVal Target As Range)

 Application.EnableEvents = False

If Target.Row > 17 Then GoTo 2
If Target.Row < 13 Then GoTo 2
If Target.Column <> 6 Then GoTo 2

    Call 曲げ有り

2

If Target.Row > 25 Then GoTo 3
If Target.Row < 21 Then GoTo 3
If Target.Column <> 6 Then GoTo 3

    Call 溶接有り

3

If Target.Row <> 29 Then GoTo 4
If Target.Column <> 6 Then GoTo 4

    Call 公差有り

4

If Target.Row > 34 Then GoTo 5
If Target.Row < 33 Then GoTo 5
If Target.Column <> 6 Then GoTo 5

    Call 曲げ後加工有り

5

If Target.Row > 40 Then GoTo 6
If Target.Row < 38 Then GoTo 6
If Target.Column < 6 Then GoTo 6
If Target.Column > 8 Then GoTo 6

    Call 特殊加工有り

6

    Application.EnableEvents = True

End Sub
(ふみ) 2015/09/07(月) 14:41


βさん

13:17のコメントを良く読めば解りました。
マクロの登録で出来ました。
ありがとう御座います。
(ふみ) 2015/09/07(月) 15:18


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.