Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6396 / 13646 ツリー ←次へ | 前へ→

【45421】チェックボックス ユニフ 06/12/24(日) 0:39 質問[未読]
【45422】Re:チェックボックス ぱっせんじゃー 06/12/24(日) 8:16 発言[未読]
【45423】Re:チェックボックス メカ大好き! 06/12/24(日) 16:03 発言[未読]
【45424】Re:チェックボックス メカ大好き! 06/12/24(日) 16:19 発言[未読]
【45425】Re:チェックボックス ぱっせんじゃー 06/12/24(日) 16:20 発言[未読]
【45427】Re:チェックボックス ユニフ 06/12/24(日) 16:41 質問[未読]
【45429】Re:チェックボックス メカ大好き! 06/12/24(日) 17:20 発言[未読]
【45434】Re:チェックボックス ユニフ 06/12/24(日) 18:04 発言[未読]
【45436】Re:チェックボックス りん 06/12/24(日) 18:23 発言[未読]
【45439】すごい! ユニフ 06/12/24(日) 18:39 発言[未読]
【45440】Re:すごい! りん 06/12/24(日) 18:46 発言[未読]
【45442】Re:すごい! ユニフ 06/12/24(日) 19:03 お礼[未読]
【45437】Re:チェックボックス メカ大好き! 06/12/24(日) 18:25 発言[未読]
【45438】Re:チェックボックス メカ大好き! 06/12/24(日) 18:32 発言[未読]
【45441】解決しました! ユニフ 06/12/24(日) 18:53 お礼[未読]
【45457】Re:解決しました! Jaka 06/12/25(月) 14:52 発言[未読]
【45431】Re:チェックボックス メカ大好き! 06/12/24(日) 17:42 発言[未読]
【45426】Re:チェックボックス ぱっせんじゃー 06/12/24(日) 16:26 発言[未読]
【45428】Re:チェックボックス Kein 06/12/24(日) 16:55 回答[未読]
【45430】Re:チェックボックス メカ大好き! 06/12/24(日) 17:29 発言[未読]
【45432】Re:チェックボックス ユニフ 06/12/24(日) 17:42 発言[未読]
【45433】Re:チェックボックス Kein 06/12/24(日) 18:03 発言[未読]
【45435】Re:チェックボックス ユニフ 06/12/24(日) 18:19 発言[未読]

【45421】チェックボックス
質問  ユニフ  - 06/12/24(日) 0:39 -

引用なし
パスワード
   エクセルで作った原紙があり、そのシート上にコントロールツールボックスから作った
チェックボックスが20個ぐらい配置されています。

この原紙にデーターを上書きされてもいいようにクリアーボタンを横に作って
ボタンを押せば初期化できるように取り組んでいます。
マクロ記録で操作したのですがチェックボックスのチェックを入れたり
はずしたりという部分が記録できません。

どのようにしたら良いでしょうか。

【45422】Re:チェックボックス
発言  ぱっせんじゃー  - 06/12/24(日) 8:16 -

引用なし
パスワード
   おはようございます。

全てのチェックボックスをオフにするなら、

Sub Allchkoff()
Dim myobj As OLEObject
 For Each myobj In heets("Sheet1").OLEObjects
   If TypeName(myobj.Object) = "CheckBox" Then _
     myobj.Object.Value = False
 Next
End Sub

特定のチェックボックスだけオフにするなら
Sub chkoff()
Dim i As Long
For i = 5 To 10
 Sheets("Sheet1").OLEObjects("CheckBox" & i). _
  Object.Value = False
Next i
End Sub

【45423】Re:チェックボックス
発言  メカ大好き!  - 06/12/24(日) 16:03 -

引用なし
パスワード
   ▼ぱっせんじゃー さん:

私も VBA の勉強をしている者です。
コントロールツールボックスからのワークシート上オブジェクトの操作は、
うまく動かす事が、できました。ありがとうございます。

横からの質問で申し訳無いのですが…、
『コントロールツールボックス』からではなく、『フォームツールバー』
から作る『ワークシート上のチェックボタン』は、どの様にして
操作したら良いのでしょうか?
コントロールツールボックスから作るワークシート上オブジェクトよりも、
フォームから作るワークシート上オブジェクトの方が、動作が安定していると
何かで読んだ事が有りまして、今後のために勉強しておきたくなりました。
できれば、ご教授をお願い致します。

また両者には…『こういう風に使い分けた方が良いよ』…等の注意点は
有るのでしょうか?

【45424】Re:チェックボックス
発言  メカ大好き!  - 06/12/24(日) 16:19 -

引用なし
パスワード
   あ…、申し訳ないです。 ↑ 上の質問で…
『チェックボタン』と書いたのは、『チェックボックス』の間違いです。

【45425】Re:チェックボックス
発言  ぱっせんじゃー  - 06/12/24(日) 16:20 -

引用なし
パスワード
   'フォームのチェックボックスを一括でオフ

Sub allfmchkoff()
Dim MyChk As Object
 For Each MyChk In Sheets("Sheet1").CheckBoxes
   MyChk.Value = False
 Next
End Sub

単純にこなのでも。

Sheets("Sheet1").CheckBoxes.Value = xlOff

※特定のチェックボックスをオフにするのは分かりません。

【45426】Re:チェックボックス
発言  ぱっせんじゃー  - 06/12/24(日) 16:26 -

引用なし
パスワード
   こんなサイトがありました。

フォームとコントロール
h t t p://homepage1.nifty.com/gak/MSTips/controlandforms.html

ほかにも、

「フォーム コントロールツールボックス 違い」
で検索したら参考になるサイトが見つかると思います。

【45427】Re:チェックボックス
質問  ユニフ  - 06/12/24(日) 16:41 -

引用なし
パスワード
   ぱっせんじゃー さん、ご回答ありがとうございます。最初に書いてくださった
コードを試すとIn heets("Sheet7")の所でsubまたはfunctionが定義されてませんと出てきてheetsの文字が黄色になりました。heetsではなくてsheetsにしてみると
インデックスが有効範囲になりませんと一行全部黄色くなります。

2番目に書いてくださったコードも
> For Each MyChk In Sheets("Sheet7").CheckBoxes

でインデックスが有効範囲にありませんと同様に出ます。

> Sheets("Sheet7").CheckBoxes.Value = xlOff

も試しましたが同様の結果でした。今、シート7で試しているのでシートNoだけ
変えています。標準モジュールでは駄目なのかとシートのモジュールに書いてみましたが
やはり同様の結果です。

お手数かけてすいません、アドバイス願います。

【45428】Re:チェックボックス
回答  Kein  - 06/12/24(日) 16:55 -

引用なし
パスワード
   フォームツールバーのコントロールの長所は、コレクションオブジェクトを使う
によって簡単に配列のように扱えることです。即ち、同種のコントロールを
シートに配置した順に 1,2,3・・とIndexがつきます。これを利用して名前が
分からなくても特定のコントロールを操作できるわけです。また、Callerプロパティ
によって"現在操作しているコントロールの名前"が取得できますから、例えば

Sub MyCheckBox()
  Dim x As Variant
  Dim Msg As String
 
  x = Application.Caller
  If VarType(x) <> 8 Then Exit Sub
  Select Case ActiveSheet.CheckBoxes(x).Value
   Case xlOn: Msg = "オン"
   Case xlOff: Msg = "オフ"
  End Select
  MsgBox x & " のチェックは" & Msg & "になります"
End Sub

というようなマクロを登録すれば、登録した全てのチェックボックスの
チェックの変化をメッセージできます。20個も配置するなら、このような
マクロ一つで"どれがチェックされたか"を判定して処理を分岐できるので、
コーディングを大いに省力化できるはずです。上のコードで x に入る値は、
予め数式バーを開いておき、Ctrlキーを押しながら任意のコントロールを
選択したとき、数式バーの左端の窓に表示される名前になりますから、
それをメモしておいて Select Case で分岐・判定するコードを書くのです。
なお、コレクションオブジェクトのメソッドには、一括削除するDeleteや
マクロを一括登録するOnActionがあるので、手作業でする手間を省くことも
できます。

【45429】Re:チェックボックス
発言  メカ大好き!  - 06/12/24(日) 17:20 -

引用なし
パスワード
   ▼ユニフ さん:
> 最初に書いてくださったコードを試すと
> In heets("Sheet7")の所でsubまたはfunctionが定義されてませんと出てきて
> heetsの文字が黄色になりました。heetsではなくてsheetsにしてみると
> インデックスが有効範囲になりませんと一行全部黄色くなります。

??確かに heets は『S』が抜けていると思いますが、
私は以下の式で完璧に動きましたが…。(式は標準モジュールに書きました)
'------------------------------------
'特定のチェックボックスだけオフにする
Sub chkoff()
Dim i As Long
For i = 1 To 5
 Sheets("Sheet1").OLEObjects("CheckBox" & i). _
  Object.Value = False
Next i
End Sub
'------------------------------------
'全てのチェックボックスをオンにする
Sub Allchkon()
Dim myobj As OLEObject
 For Each myobj In Sheets("Sheet1").OLEObjects
   If TypeName(myobj.Object) = "CheckBox" Then _
     myobj.Object.Value = True
 Next
End Sub
'------------------------------------
"Sheet7" は、実際に有るシートの名前と同じですか?

【45430】Re:チェックボックス
発言  メカ大好き!  - 06/12/24(日) 17:29 -

引用なし
パスワード
   ぱっせんじゃーさん、Keinさん、Resありがとうございます。

色々試してみます。
スレが複雑になりそうな予感がするため、私の疑問点は別スレを
立てさせていただく事にしました。

>>フォームツールバーのコントロールの長所は、コレクションオブジェクト
>>を使うによって簡単に配列のように扱えることです。

私は配列は、まだ完全に理解している訳ではないのですが、変数の固まり
みたいなものですよね?何となく使いやすそう…という事は理解できました。
ありがとうございました。

【45431】Re:チェックボックス
発言  メカ大好き!  - 06/12/24(日) 17:42 -

引用なし
パスワード
   ▼ユニフ さん:

あ、もしかして…
『チェックボックス』と『オプションボタン』を間違えたり
していませんか? 私は最初の頃、この2つを良く混同していたもので…。
(私の場合、今でもかな? (笑))

もしハズシていたら、済みません。

【45432】Re:チェックボックス
発言  ユニフ  - 06/12/24(日) 17:42 -

引用なし
パスワード
   Kein さん、ご意見ありがとうございます。

過去ログでりんさんが書いたコードを試していまして
Sub test()
  Dim sh As Shape, sh2 As ControlFormat
  For Each sh In ActiveSheet.Shapes
   If sh.Type = msoFormControl Then
     If sh.FormControlType = xlCheckBox Then
      Select Case sh.ControlFormat.Value
        Case 1:   Msg = "チェックあり" 'TRUE
        Case -4146: Msg = "チェックなし" 'FALSE
        Case Else: Msg = "淡色表示  " '#N/A(淡色)
      End Select
      MsgBox Msg, vbInformation, sh.Name
     End If
   End If
  Next
End Sub

これには反応していたのでマクロでVBAでなんとかなるだろうと思っていましたが、
この先どうしたらいいのかわかりません。

>上のコードで x に入る値は、
>予め数式バーを開いておき、Ctrlキーを押しながら任意のコントロールを
>選択したとき、数式バーの左端の窓に表示される名前になりますから、

というのを試しましたが左側の窓には何も表示されていません。

原紙は私が作ったものでないのでチェックボックスも何か仕掛けがあるのがどうか
わかりません。右クリックしても何も出てこず、コントロールボックスのデザイン
で修正できるようなのでフォームから作ったものではないなと判断しました。

【45433】Re:チェックボックス
発言  Kein  - 06/12/24(日) 18:03 -

引用なし
パスワード
   >チェックボックスも何か仕掛けがあるのがどうかわかりません。
とりあえず、それらのチェックボックスを配置しているシートの
シートモジュール(シートタブを右クリックしたときのメニューで
"コードの表示"を選択して出てくる画面)を調べて

Private Sub CheckBox1_Change()

などというタイトルのマクロが見つかったら、全文をコピーして
ここへ貼り付けてみて下さい。そしてその上で、チェックボックスの
オン・オフによって何をしたいのか ? ということを具体的に説明して下さい。

* 私はこれから食事をしますが、終わったらまたここへ来ます。

【45434】Re:チェックボックス
発言  ユニフ  - 06/12/24(日) 18:04 -

引用なし
パスワード
   メカ大好き! さんどうもです。

>私は以下の式で完璧に動きましたが…。(式は標準モジュールに書きました)

Sub Allchkon()
Dim myobj As OLEObject
For Each myobj In Sheets("Sheet7").OLEObjects
   If TypeName(myobj.Object) = "CheckBox" Then _
    myobj.Object.Value = False
 Next
End Sub

で、もう一度試しましたがやはり2行目が黄色エラーになります。
シート上にあるものはチェックボックスで間違いないと思います。
コントロールツールボックスでデザインモードにして右クリックすれば
チェックボックスオブジェクトと出てきます。外観からしてどう見ても
ボタンではなくチェックボックスと思えます。

>'------------------------------------
>"Sheet7" は、実際に有るシートの名前と同じですか?

右クリックでコードを見るとシート7が出てきますし隠しシートもないし
7番目にあるシートなのでシート7なのは間違いないと思います。

いったい何が悪いのだろう(;_;)

【45435】Re:チェックボックス
発言  ユニフ  - 06/12/24(日) 18:19 -

引用なし
パスワード
   Kein さんどうもです。

>ここへ貼り付けてみて下さい。
Private Sub CheckBox43_Click()
End Sub
こいうものが43個ありました。ボックス20個と適当に数えたのですが
実際は43個だったようです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub

それら以外はこれだけでした。

>そしてその上で、チェックボックスの
>オン・オフによって何をしたいのか ? ということを具体的に説明して下さい。

原紙の上に上書き保存するスタッフがいるのでファイルを読み取り専用にしようと思っていましたがそれだけで保存の仕方がわからなくなるスタッフが多いのでクリアボタンをシート上に
作り、ボタンを押せば元の原紙に戻るように取り組んでいます。
セル内のデーターはマクロ記録で一気にデリートできるようにできましたが
チェックボックスをオフ(false?)にする方法がわかりません。

チェックボックス自体はアレルギーがあればチェックを入れるとか簡単な問診表のようなものです。

【45436】Re:チェックボックス
発言  りん E-MAIL  - 06/12/24(日) 18:23 -

引用なし
パスワード
   ユニフ さん、こんばんわ。

>メカ大好き! さんどうもです。
>
>>私は以下の式で完璧に動きましたが…。(式は標準モジュールに書きました)
>
>Sub Allchkon()
>Dim myobj As OLEObject
MsgBox ActiveWorkbook.Name,vbInformation
>For Each myobj In Sheets("Sheet7").OLEObjects
>   If TypeName(myobj.Object) = "CheckBox" Then _
>    myobj.Object.Value = False
> Next
>End Sub

>で、もう一度試しましたがやはり2行目が黄色エラーになります。
>シート上にあるものはチェックボックスで間違いないと思います。
メッセージボックスに思いもよらない名まえが出たりしませんか?
シート名:Sheet7のあるブックはちゃんとアクティブですか?

原因がわからないときはいろいろ試してみるといいです。
Shapeの種類を確認するために次のマクロを実行してみてください。
アクティブなブックの全てのシート上の図形のリストを作ります。
Sub test()
  Dim wb(1 To 2) As Workbook, II As Integer, sh As Shape, ws As Worksheet
  Set wb(1) = ActiveWorkbook
  Set wb(2) = Application.Workbooks.Add
  '
  For Each ws In wb(1).Worksheets
   For Each sh In ws.Shapes
     II = II + 1
     With wb(2).Worksheets(1)
      .Cells(II, 1).Value = ws.Name
      .Cells(II, 2).Value = sh.Name
      .Cells(II, 3).Value = Stype(sh.Type)
     End With
   Next
  Next
  Erase wb
End Sub
'種類判定関数
Function Stype(arg1 As Integer) As String
  Dim AA As String
  Select Case arg1
   Case 8:  AA = "ツールバー『フォーム』由来"
   Case 12:  AA = "ツールバー『コントロールツールボックス』由来"
   Case Else: AA = "その他図形軍"
  End Select
  Stype = AA
End Function

【45437】Re:チェックボックス
発言  メカ大好き!  - 06/12/24(日) 18:25 -

引用なし
パスワード
   ▼ユニフ さん:

>いったい何が悪いのだろう(;_;)

うーん…謎ですね???
ただ…『7番目にあるシートなのでシート7なのは間違いない』
…というのは、違う場合も有ると思います。
シートタブの名前は、自分で変更する事が可能ですし、
シートの順番を入れ替える事もできたはず…です。
↑ (シートタブを右クリックして『移動またはコピー』で実行)

とりあえず私が考え付く事は…
"Sheet7" のタブの名前を "Sheet1" にして実行してみたらどうなるだろう?
…という事くらいです。本来の "Sheet1" を "Sheet101"とかの名前にして、
"Sheet7" のタブの名前を "Sheet1" にして実行してみるとか…どうです?

【45438】Re:チェックボックス
発言  メカ大好き!  - 06/12/24(日) 18:32 -

引用なし
パスワード
   ちなみにシートタブの名前を変える方法は…

該当のシートタブを右クリック → 名前の変更
…で可能です。

【45439】すごい!
発言  ユニフ  - 06/12/24(日) 18:39 -

引用なし
パスワード
   ▼りん さん、どうもです。

>原因がわからないときはいろいろ試してみるといいです。
>Shapeの種類を確認するために次のマクロを実行してみてください。
>アクティブなブックの全てのシート上の図形のリストを作ります。

何が起きるやらと思い確かめたところ新しいブックが開いて
ズラズラズラと一覧表が出てきました。何でこんなことができるのですか
びっくりこきました。

その結果を見るとチェックボックスは全てコントロールツールボックス由来となってます。
一個だけボタン100という名前のものがありフォーム由来となってましたが
よく考えると私の作ったクリアボタンのようでした。

【45440】Re:すごい!
発言  りん E-MAIL  - 06/12/24(日) 18:46 -

引用なし
パスワード
   ユニフ さん、こんばんわ。

>その結果を見るとチェックボックスは全てコントロールツールボックス由来となってます。
そのチェックボックスコントロールのあるシート名はSheet7でしたか?

【45441】解決しました!
お礼  ユニフ  - 06/12/24(日) 18:53 -

引用なし
パスワード
   ▼メカ大好き! さんどうもです。ぱっせんじゃーさん、Keinさん
りんさんお騒がせしてすいませんでした。
エラーになったのは私の基本的なミスでございました。
シート名をちゃんと入れてなかったということです。


>"Sheet7" のタブの名前を "Sheet1" にして実行してみたらどうなるだろう?
>…という事くらいです。本来の "Sheet1" を "Sheet101"とかの名前にして、
>"Sheet7" のタブの名前を "Sheet1" にして実行してみるとか…どうです?

メカ大好きさん、内心どうせやっても無駄だよねと思ってしまいました。
すいません、でもこのアドバイスでやっと気づきました。
シート名を入れるときに普通に読んでコードに書いていたのですが
コピペで入れたところシート名の後ろに半角スペースが入っていたのです。
そこを修正したらきっちり動きました。

本当基本的な間違いで数名の方に貴重な時間を割いてしまって申し訳ありません。
ひらにお許しください。
またこれで、作業がずずっと進められます。
深く感謝申し上げます。

皆様メリークリスマス!

【45442】Re:すごい!
お礼  ユニフ  - 06/12/24(日) 19:03 -

引用なし
パスワード
   ▼りん さん、ありがとうございました。

>そのチェックボックスコントロールのあるシート名はSheet7でしたか?

下のほうでもお礼を言わせていただきましたが本当にあれこれ
確かめて良かったです。

簡単なミスでございましたが皆さんのアドバイスが無ければ途中で
放り出していたと思います。ありがとうございました。

りんさんのコードはこれからも役に立つと思いますので
しっかり保存しておきます。そういえば以前のエクセルファイルオープンチェック
のアドイン利用したコード、私も利用させてもらっています。
重ねて御礼申し上げます。

【45457】Re:解決しました!
発言  Jaka  - 06/12/25(月) 14:52 -

引用なし
パスワード
   どこにつけていいのかわからないけど、とりあえずここに。
チェックボックスじゃないけど、フォームボタン等の書き方。

表示 → ツールバー → フォーム
なら、
h t t p://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=157;id=FAQ

6396 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free