アプリ版:「スタンプのみでお礼する」機能のリリースについて

gooで初めて質問します、VBAのエラーについて。

エクセルのシートにActiveXのチェックボックスを挿入しマクロを
作ろうと試みています。VBAの知識がないので、サンプルを
ダウンロードして作ろうと思っています。ところが、ダウンロードした
サンプルを動作させると、”実行時エラー424オブジェクトが必要です”
というメッセージがでます。どこを修正すればよろしいでしょうか?
エクセル2007を使用しています。よろしくお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub checkbox()
Dim コントロール As Control
Dim チェック状態 As Boolean
チェック状態 = False
For Each コントロール In Controls '質問者記入:エラーメッセージがでる。
If TypeName(コントロール) = "CheckBox" Then
If コントロール.Value = True Then
チェック状態 = True
Exit For
End If
End If
Next
If チェック状態 = False Then
MsgBox "選択されていません。"
Exit Sub
End If
End Sub

質問者からの補足コメント

  • へこむわー

    初めてのgooの質問で要領がわかりませんでした。
    リクエストの 男性・60歳以上はわたくしのことです。
    リクエストの制限は全くしておりません。
    よろしくお願いします。補足しました。

      補足日時:2019/04/23 17:19

A 回答 (3件)

私も大して分かってないのですみませんが、ご提示されたWebのサンプルコードは、「ユーザーフォーム」の上に作ったチェックボックス用かなにかのコードのようです。


シート上に作った「「ActiveXコントロールのチェックボックス」の場合は、同じチェックボックスでも少し勝手が異なるみたいです。

a:変数「コントロール」の宣言が、「Dim コントロール As OLEObject」になる。
(=「Control」型ではなく、「OLEObject型」になるみたいです。)
b:「Cntrols」が「Worksheets("sheet1").OLEObjects」になる。
c:「コントロール」や「コントロール.Value」に「Object.」がくっつく。
・・・という感じで・・・。

少し作り変えてしまいましたが、以下のコードを試すとどうなりますでしょうか?
「Sheet1」の上に作ったチェックボックスを調べていくコードです。
(たぶん、動くと思うんですけど・・・。動かなかったらごめんなさい!)

※もし「Shhet1」が作ってなければ、「Sheet1」を作って、その上に、ActiveXコントロールの「チェックボックスを2、3個、作って、実行してみてください。


'#################################################################
'チェックボックスが「ActiveXコントロール」の場合
'#################################################################

Sub checkbox02()

Dim コントロール As OLEObject
Dim チェック状態 As Boolean
Dim s_CtlName As String

チェック状態 = False


For Each コントロール In Worksheets("sheet1").OLEObjects

If TypeName(コントロール.Object) = "CheckBox" Then
If コントロール.Object.Value = True Then
チェック状態 = True
s_CtlName = コントロール.Name
Exit For
End If
End If

Next


If チェック状態 = True Then
MsgBox s_CtlName & "にチェックが入っているっぽいです。"
ElseIf チェック状態 = False Then
MsgBox "選択されていません。"
Exit Sub
End If

End Sub




ちなみにですが、チェックボックスが「フォームコントロール」のほうで作られていると、以下のような感じのようです。

d:変数「コントロール」の宣言が、「Dim コントロール As checkbox」になる。
(=「Control」型ではなく、「checkbox型」になるみたいです。)
e:「Cntrols」が「Worksheets("sheet1").CheckBoxes」になる。
f:「コントロール.Value = True」が「コントロール.Value = 1」など、数値での判別になる。
・・・という感じで・・・。

※「Sheet1」上に、「フォームコントロール」の「チェックボックスを2、3個、作って、実行してみてください。


'#################################################################
'チェックボックスが「フォームコントロール」の場合
'#################################################################

Sub checkbox03()

Dim コントロール As checkbox
Dim チェック状態 As Boolean
Dim s_CtlName As String

チェック状態 = False


For Each コントロール In Worksheets("sheet1").CheckBoxes

If TypeName(コントロール) = "CheckBox" Then
If コントロール.Value = 1 Then 'チェックONだと「1」、OFFだと「-4146」です。
チェック状態 = True
s_CtlName = コントロール.Name
Exit For
End If
End If

Next


If チェック状態 = True Then
MsgBox s_CtlName & "にチェックが入っているっぽいです。"
ElseIf チェック状態 = False Then
MsgBox "選択されていません。"
Exit Sub
End If

End Sub
    • good
    • 0
この回答へのお礼

試してみますと、問題なくどうさしました。(フォームは試してみませんでしたが、時間があればしてみようと思います。

お礼日時:2019/04/23 21:56

あ、私が書いているあいだにもう回答ついていましたね。


私の回答は無視してください。
    • good
    • 0
この回答へのお礼

でも、このプログラムのほうが気に入っています。

お礼日時:2019/04/23 21:56

元のコードは、UserForm 上のものですから、シート上の場合は、ActiveX コントロールと、Form コントロールと2つあって、その書き方が変わります。


一応、2バイト文字は、使わないことにしています。
なるべく、元のコードを壊さないようにしています。

Sub checkbox_Checking()
 Dim Ctrl As Object
 Dim bln As Boolean
 bln = False
 For Each Ctrl In ActiveSheet.OLEObjects
  If TypeName(Ctrl.Object) = "CheckBox" Then
   If Ctrl.Object.Value = True Then
    bln = True
    Exit For
   End If
  End If
 Next
 If bln = False Then
  MsgBox "選択されていません。"
  Exit Sub
 End If
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
問題なく動作しました。これからVBAの知識をつけていこうと思います。

お礼日時:2019/04/23 21:56

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A