[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『チェックボックスについて』(ふみ)
おそらく初歩的な事で申し訳ありませんが、どうしてもわからないので。
チェックボックスを初めて使うのですが、
フォームコントロールのチェックボックスを挿入して、
名前はチェック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
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
「チェック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
アプリケーション再起動以外の方法として、次のようなものが考えられます。
【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
【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
また復旧コードを標準モジュールに書いて、
仮のボタンを作って走らせてみたのですが、
「変数が定義されていません」となります。
おそらくちょっとコードを書き足せば良いのでしょうが、
それすらわかりません。
(ふみ) 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
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.