- ベストアンサー
コンパイルエラー:メソッドまたはデータメンバが見つかりません
- 初心者の方がエクセルのマクロでコンパイルエラーが発生する問題について質問されています。
- 質問者は、同じ意味のコードを2つのif文で書いていますが、2番目のif文でエラーが発生する理由がわからないと困っています。
- 詳しい方からの回答を待っているとのことです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Sheetsコレクションと Worksheetsコレクションで扱うオブジェクトが違うからです WorksheetsはWorksheetオブジェクトですよね Sheetsは Sheet1やSheet2などWorksheetを継承したオブジェクトです ワークシートに貼り付けたチェックボックスなどは Sheet1オブジェクトのメンバーとして認識されます しかし Worksheetオブジェクトのメンバーとしては認識されないため A.CheckBox1といった記述が出来ないのです
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17070)
今まで質問の現象に出くわしたことがなかったですが http://hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=6184&page=0 と似た質問ではないでしょうか。 自己流解釈の項が参考になりませんか 下記Test07()がその不思議さを再現したように思いました。 ーー 以下は私がテストでやってみたものです。参考に Sub test01() Dim A As Worksheet Set A = Worksheets(1) If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If If Worksheets(1).CheckBox1 = True Then '(2) Range("B1") = 1 End If End Sub Sub test02() Dim wA As Worksheet Set wA = Worksheets("Sheet1") If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If If Worksheets("Sheet1").CheckBox1 = True Then '(2) Range("B1") = 1 End If End Sub Sub test03() Dim wA As Object Set wA = Worksheets("Sheet1") If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If If CheckBox1 = True Then '(2) Range("B1") = 1 End If End Sub Sub test04() Dim wA As Object Set wA = Worksheets("Sheet1") If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If If wA.CheckBox1 = True Then '(2) Range("B1") = 1 End If End Sub Sub test05() Dim wA As Object Set wA = Worksheets("Sheet1") If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If If wA.Range("A1") = 1 Then '(2) Range("B1") = 1 End If End Sub Sub test06() Dim wA As Object Set wA = Worksheets("Sheet1") MsgBox wA.Name End Sub Sub test07() Dim A As Worksheet Set A = Worksheets(1) If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If A.Activate If ActiveSheet.CheckBox1 = True Then '(2) Range("B1") = 1 End If End Sub
お礼
worksheet型ではなくobject型で宣言すればいいみたいです。色々と例を示して頂き、ありがとうございました。
- Nayuta_X
- ベストアンサー率46% (240/511)
Sub 回答_1() Dim A As Object Set A = Sheets(1) If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If If A.CheckBox1 = True Then '(2) Range("B1") = 1 End If End Sub Sub 回答_2() Dim A As Boolean A = Sheets(1).CheckBox1 If Sheets(1).CheckBox1 = True Then '(1) Range("A1") = 1 End If If A = True Then '(2) Range("B1") = 1 End If End Sub
お礼
シートをオブジェクト型にするか、チェックボックスごとブール型にすればいいんですね。ブール型の方が若干ですが使用メモリが少ないみたいなので、こちらで検討したいと思います。どうもありがとうございました!
お礼
Sheet1オブジェクトのメンバーであってWorksheetオブジェクトのメンバーではない、ということで何となく理解できました。ありがとうございました!