プロが教えるわが家の防犯対策術!

エクセル VBA CheckBoxのオブジェクト名に変数を使用して
値を取得したいのですが・・・

If ActiveSheet.OLEObjects(TempName).Object.Value = True Then
         (処理)
Else
         (処理)
End If

「実行時エラー '1004': OLEObject クラスのオブジェクトのプロパティを取得できません。」
というエラーがでてしまいます。

何が原因なのかわかる方是非ご教授ねがいます。

A 回答 (6件)

良く質問にある例で


何がしたいかが,広く説明されてないので、回答者に手間を取らせているように思う。
質問者の我流(まずい狭い考えをいている場合が多いから)でコード上でどうしたいか、書くのでなく、内容的にどうしたいかを書くべきだ。私の持論です。
ーー
本件私も良くわからないが、私の例では
セルB1に「京都」と入れている
コントロールツールボックスの方のチェックボックスを3個貼り付け、それぞれのチェックボックスについて、大阪、神戸、京都とプロパティの「オブジェクト名」(Captionでない)をそのように変えた。
Sub test01()
x = Cells(1, "B") '現在値は「京都」
'MsgBox Worksheets("Sheet1").京都.Value 'OK
'MsgBox Worksheets("Sheet1").OLEObjects(3).Value
'MsgBox Worksheets("Sheet1").OLEObjects("京都").Object.Value 'OK
'Worksheets("Sheet1").x.Value
'Worksheets("Sheet1").Controls("京都").Value
'Worksheets("Sheet1").CheckBoxes("京都").Value
'Worksheets("Sheet1").DrawingObjects(3).Value
'With Worksheets("Sheet1")
'Msgbox .CheckBoxes("京都").Value
'End With
MsgBox Worksheets("Sheet1").OLEObjects(x).Object.Value 'OK
End Sub
これで京都チェックボックスが、
チェックされていたらーーTrue
Offで在ればーーFalseと
表示された。
コメントアウトした書き方はOKと書いたもの以外は、すべてエラーだった。
この.Objectが必要な点が曲者じゃないですか。
上記コードのxで「変数名を使用」したことになるのかな>
    • good
    • 0

細かい説明は後にしますが、以下で試してみてください。


掲示板やWebサイトで、拾い読みしても、上手く行きません。このような方法は、古い方法で、Excelの95~97のテクニックです。

'//標準モジュールに貼り付けてください。
Sub CheckBoxesAdding()
 'チェックボックスを取り付ける
 Dim j As Long
 Dim Cb As Object
 Dim TempName As String
 For j = 1 To 5 '←現在5個です。
  TempName = "CheckBox" & j
  With Cells(j, 2).Resize(, 2)
   Set Cb = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
  End With
  With Cb
   .Name = TempName
   .OnAction = ThisWorkbook.Name & "!CheckBoxMacro"
   .Caption = TempName
  End With
 Next j
End Sub
Sub CheckBoxMacro()
'チェックボックスのマクロ
 Dim TemName As String
 TempName = Application.Caller
 If ActiveSheet.CheckBoxes(TempName).Value = xlOn Then
  MsgBox "True 処理"
 Else
  MsgBox "False 処理"
 End If
End Sub

Private Sub TestCBClear()
'不要のチェックボックス削除
 ActiveSheet.CheckBoxes.Delete
End Sub


OLEObject と以下のようなフォームツールとは、まったく違う仕様です。同じコードをOLEObject で作ると、ワンランク上位のコードになりますが、OLEObject のコードも、あまり探しても出てこないと思います。最初は、教わらないとなかなか出来ませんね。私の場合は、Ver,5の上級テクニックの本を持っていますが、今は、手に入りません。
    • good
    • 0

>TempNameはチェックボックスの名前が入っている変数になります。


私が、#2で書いた方法で、それが解決が出来ないというなら、もう少し、前の段階から説明しないといけないようです。「TempName が何を入れているのか分かりません」の私の問いかけに対して、「チェックボックスの名前」が入っているというでは、こちらの思惑とは違います。そのエラーは、正しい名前が入っていないことを意味しています。だから、正しい名前を入れていれば、エラーは発生しません。

ただ、こちらからでは、変数を使う必要性とか、ご質問からは見えてきません。ループを目的としない場合に、OLEObjectsのコレクションから、そこに変数を入れるということは、まったくといってしないのです。

つまり、

TempName = "CheckBox1"
Worksheets("Sheet1").Select
If ActiveSheet.OLEObjects(TempName).Object.Value = True Then

というような書き方は普通はしません。
また、キャプション名:cn.Object.Caption と、オブジェクト名:cn.Nameとは別ものです。

If Worksheets("Sheet1").CheckBox1.Value = True Then
とすればよいだけです。

あえて、複数のオブジェクトに対して、ピンポイントにするなら、Index を利用します。ただし、他のOLEObjectがないことが条件ですから、他にコントロールツールがあるなら、本来は、他のコントロールツールと区分けをする必要があります。オブジェクトに並べ替えをしなければ、左上から下に、そして右の列に、番号が振られます。

TempName = 1
If Worksheets("Sheet1").OLEObjects(TempName).Object.Value = True Then
  '処理)
Else
  '処理)
End If


ただ、もしご質問者さんに譲歩して、オブジェクト名を入れる場合は、まず、正しい名前を取得しなければなりません。それには、このような方法があります。これで、名前を確認してください。

Sub Test3()
'検査用マクロ
 Dim cn As Object
 With ActiveSheet
  For Each cn In .OLEObjects
  ' cn.Select
   MsgBox cn.Name & " Index;" & cn.Index
  Next cn
 End With
End Sub

この回答への補足

説明不足で申し訳ありません・・・

やりたいことはチェックボックスをエクセルの各行に作成
した後、入力処理が行われ、そのあと入力された値によって
True か False かという判定をしたいのです。処理によって
出力される件数が変わる為あらかじめチェックボックスを
設置することができない為、コード内で動的に作成をしております。

With ActiveSheet.CheckBoxes.Add(Range(Cells(j, 2), Cells(j, 4)).Left, Range(Cells(j, 2), Cells(j, 4)).Top, Range(Cells(j, 2), Cells(j, 4)).Width, Range(Cells(j, 2), Cells(j, 4)).Height)
.Name = TempName
.Caption = "キャプション"
End With

>If Worksheets("Sheet1").CheckBox1.Value = True Then
>とすればよいだけです。

上記のようにありましたので、少し変えてみました。エラー自体は
でなくなったのですが、True/Falseの判別をしてくれません。

If ActiveSheet.CheckBoxes(TempName).Value = True Then
True 処理
Else
False 処理
End If

よろしくお願い致します。

補足日時:2011/01/27 18:29
    • good
    • 0

ひょっとして、そのCheckBoxを設置したワークシートがアクティブじゃないんじゃないですか?


もしそうなら
If ActiveSheet.OLEObjects(TempName).Object.Value = True Then を
If Sheets("Sheet1").OLEObjects(TempName).Object.Value = True Then のようにシートを明示してください。

そういう問題ではないならば、変数をどう定義したか確認してください。
少なくとも
Dim TempName As String
TempName = "CheckBox1"
と定義して試したら、ちゃんと作動しましたよ。
    • good
    • 0

>エクセル VBA CheckBoxのオブジェクト名に変数を使用して


TempName が何を入れているのか分かりません。オブジェクト名というのは、CheckBox1 とか言うものなら、"CheckBox" & i
たとえば、このようなコードになります。

Sub Test1()
 Dim i As Long
 With ActiveSheet
  For i = 1 To 5 'CheckBoxの数が分かっている場合は、ここに数字を入れる
   If .OLEObjects("CheckBox" & i).Object.Value Then
    .OLEObjects("CheckBox" & i).Object = False
   Else
    .OLEObjects("CheckBox" & i).Object = True
   End If
  Next i
 End With
End Sub

'//
'CheckBoxの数が不明な場合
Sub Test2()
 Dim cn As Object
 With ActiveSheet
  For Each cn In .OLEObjects
   If TypeOf cn.Object Is MSForms.CheckBox Then
    If cn.Object.Value = True Then
     cn.Object.Value = False
    Else
     cn.Object.Value = True
    End If
   End If
  Next cn
 End With
End Sub

この回答への補足

TempNameはチェックボックスの名前が入っている変数になります。

よろしくお願いいたします。

補足日時:2011/01/27 13:48
    • good
    • 0

TempName経由で引いたOLEObjectに .Objectが存在しないのかもしれませんが


他にも原因が考えられるためなんともいえないです。

こういう時はエラーメッセージを丸ごと検索してみると
いいかもしれないです。
    • good
    • 0

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

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


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