dポイントプレゼントキャンペーン実施中!

「エクセルを用いてチェックボックスが並んだ書類があります。チェックする
 項目のパターンが決まっているので、毎回マウスを移動してチェックするの
 が面倒です。ワンクリックで複数のチェックがかけられるようにしたい
 のですが、よい方法は無いでしょうか?」

ほぼ類似の質問で、以前、別の人の質問

https://oshiete.goo.ne.jp/qa/3676289.html

に対してベストアンサーで示されていますが、これは、同一ブックの同一シートなどから
は対応できます。しかし、今回は会社の既存の帳票にマクロ(VBA)を埋め込まずに処理
したいので、別のブックにマクロ(VBA)を作成して処理したいと考えています。当該
コードを下記のようにアレンジしてみましたが、うまくいきません。


(例)
話の簡単のために、まずはチェックボックスのチェックを一括で外すことを試みます。

【帳票.xlsx】
 例えば、ワークシートにチェックボックス(開発のデザインタブから貼り付けたもの)
 が5個並んでいます。このうち、数個に既にチェックがついています。
 
【マクロ埋め込み.xlsm】
 Sub Check_Off_All()

Dim wsKitReq As Worksheet
Set wsKitReq = Workbooks("帳票.xlsx").Worksheets("sheet1")

'コントロールツール
Dim ctrl As Object
For Each ctrl In wsKitReq.OLEObjects
If TypeOf ctrl.Object Is MSForms.CheckBox Then
ctrl.Object.Value = False
End If
Next ctrl

End Sub


上のようにすると、実行後に「ユーザー定義型は定義されていません。」が出てしまいます。

(*1) For Nextの行を外すと処理できますが、ワークシート内に他のオブジェクト(例えば、
テキストボックスがあると、[False]のように表示されてしまうのでチェックボックスだけ
を抽出して処理することは必須になります。

(*2) ちなみに全く同様のコードを【帳票.xlsx】のsheet1にワークシートマクロとして埋め
込むと全く問題なく動きますので、コーディングが根本的に誤っているとは考えにくい
ところです。

A 回答 (1件)

こんにちは。



直してみました。
原因は、TypeOf は、そのオブジェクトの上位のクラスを読むものですが、他ブックからですと、共有していませんから、そのクラスを見つけることができないからだと思います。間違った考えかもしれませんが、例えでいうなら、親が誰かわかっているところで、その子供の親を識別できるけれども、子供だけだと、誰の親か分からない、という所ではないでしょうか。

'//
Sub Check_Off_All()
'No. 9059904
 Dim ctrl As Object
 Dim wsKitReq As Worksheet
 Set wsKitReq = Workbooks("帳票.xlsx").Worksheets("sheet1")
 'コントロールツール(OleObjects)
 For Each ctrl In wsKitReq.OLEObjects
 If TypeName(ctrl.Object) = "CheckBox" Then
  ctrl.Object.Value = False
 End If
 Next ctrl
End Sub

'決まった所にチェックを入れる

Sub Test2b()
 ''No. 9059904-2
  Dim i As Variant
  Dim wsKitReq As Worksheet
  Set wsKitReq = Workbooks("帳票.xlsx").Worksheets("sheet1")
  For Each i In Array(1, 3)
    wsKitReq.OLEObjects("CheckBox" & i).Object.Value = True
  Next i
 End Sub
'///

参考:
https://msdn.microsoft.com/en-us/library/s4zz68x …
    • good
    • 0
この回答へのお礼

WindFallerさん

早速のご回答ありがとうございます。

 いろいろ使えるサンプルを探して一番望んだ形に近いものものがここのサイトにあったのですが、望んだものにするために3時間ほど考え込んでみたのですが、この一見シンプルで難解な問題を解決することは不可能と考えて投稿してみることにしました。感謝いたします。

 ちなみに会社の既存の帳票を壊すことなく、効率的に正確に入力することは緊急課題でしたので助かります。

 次は、指定した箇所を別シートで入力した表に従ってチェックするコーディングに移ってみようと思います。先のような7個くらいあるチェックボックスが最大20個くらい同じように並んでいるので、マウスを移動しながらのチェック140個と正確にいうのはステータスの変化にともなう修正などを考えると非常に困難です。

 繰り返しになりますが、ありがとうございました。

お礼日時:2015/09/05 18:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!