• ベストアンサー

エクセル マクロについて Range と Cells について 

エクセル2003 OSはXP を使っています。 以下のとおり、全く同じコードにも関わらず、前者は動き、後者は動きません。 なお、ClearContents を Clear に変えても Copy に変えても、同様の結果です。 しかし、Cells を使わずに、"A4:C10" 等、番地で直接書くと、後者も動きます。 後者のコードを Cells で動かす方法は無いでしょうか? また、何故こんな現象がおこるのでしょうか? なお、シート名などは、間違いありません。 どなたか教えてください。 Sheets("基本データ作成").Range(Cells(3, 3), Cells(qwe, 4)).ClearContents Sheets("検討データ").Range(Cells(4, 1), Cells(qwe, 3)).ClearContents

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.4

コマンドボタンをSheet1に貼りつけた場合。 Private Sub CommandButton1_Click() For qwe = 1 To 10 Sheets("Sheet1").Range(Cells(4, 1), Cells(qwe, 3)).ClearContents Next qwe End Subは動きました。C1:D10がクリアされました。 Private Sub CommandButton1_Click() For qwe = 1 To 10 Sheets("Sheet1").Range(Cells(4, 1), Cells(qwe, 3)).ClearContents Next qwe End Sub も動きました。A1:C10がクリアされました。 ’---- Private Sub CommandButton1_Click() For qwe = 1 To 10 Sheets("Sheet2").Range(Cells(4, 1), Cells(qwe, 3)).ClearContents Next qwe End Sub はエラーになりました。 Private Sub CommandButton1_Click() Dim sh2 As Worksheet Set sh2 = Worksheets("sheet2") For qwe = 1 To 10 Sheets("sheet2").Activate Worksheets("sheet2").Range(sh2.Cells(4, 1), sh2.Cells(qwe, 3)).ClearContents Next qwe End Sub で動きました。 明示しないと、Rangeの( )の中のCellsをSheet1のRangeと解釈するので、Sheet2のActiveteと矛盾する。 Private Sub CommandButton1_Click() Dim sh2 As Worksheet Set sh2 = Worksheets("sheet2") For qwe = 1 To 10 Sheets("sheet2").Activate Range(sh2.Cells(4, 1), sh2.Cells(qwe, 3)).ClearContents Next qwe End Sub もだめでした。 ForNextにしたのは、qweの影響でないと思ったので 変化させました。

gotetsu
質問者

お礼

出来ました! いつも適切的確なアドバイス、 定義とworkisheetsがポイントのようですね。 本当にありがとうございます!!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • diashun
  • ベストアンサー率38% (94/244)
回答No.3

>前者は、同シート上、 >後者は、別シート上に配置されています。 >なお、実行時エラー1004 >アプリケーション定義またはオブジェクト定義のエラーです。 と、いうことなら Private Sub CommandButton1_Click() 'Sheets("基本データ")以外のSheetに配置されたのボタン Dim qwe As Integer Sheets("基本データ").Activate '追加コード(オブジェクト定義) qwe = 10 Sheets("基本データ").Range(Cells(3, 3), Cells(qwe, 1)).ClearContents End Sub つまり、オブジェクト「Sheets("基本データ")」の定義エラーということのようです。

gotetsu
質問者

お礼

すみません。先ほどの補足は私の間違いです。 Activate を Active と記述していました。 まことに申し訳ございませんでした。 おかげさまで、Activate '追加コード(オブジェクト定義)はクリアーできました。 どうもありがとうございました。

gotetsu
質問者

補足

何度もありがとうございます。 ご教示いただいた Sheets("基本データ").Activate '追加コード(オブジェクト定義) ですが、 実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 と表示されまして、エラーになってしまいました。 名案は無いものでしょうか?

すると、全ての回答が全文表示されます。
  • diashun
  • ベストアンサー率38% (94/244)
回答No.2

>前者も後者も、ワークシート上に配置したコマンドボタンから実行するようにしています。 >なお、qwe の値は、必ず「1」以上になります。 コマンドボタンが「Sheets("基本データ作成")」用、「Sheets("検討データ")」用にそれぞれのSheet上に別置きで配置されているなら、それぞれのボタン実行でVBAとして動作するはずですが(当方の環境 WinXP、Excel2002)。 Private Sub CommandButton1_Click() 'Sheets("基本データ作成")のボタン Dim qwe As Integer qwe = 10 Sheets("基本データ作成").Range(Cells(3, 3), Cells(qwe, 1)).ClearContents End Sub Private Sub CommandButton1_Click() 'Sheets("基本データ")のボタン Dim qwe As Integer qwe = 10 Sheets("基本データ").Range(Cells(3, 3), Cells(qwe, 1)).ClearContents End Sub

gotetsu
質問者

補足

たびたび言葉足らずですみません。 前者は、同シート上、 後者は、別シート上に配置されています。 なお、実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。 と、エラー表示が出ています。

すると、全ての回答が全文表示されます。
  • diashun
  • ベストアンサー率38% (94/244)
回答No.1

Cellsプロパティはアクティブシートに対して指定が有効になるようです。 したがって、 Sheets("基本データ作成").Range(Cells(3, 3), Cells(qwe, 4)).ClearContents Sheets("検討データ").Activate Sheets("検討データ").Range(Cells(4, 1), Cells(qwe, 3)).ClearContents としてから実行すると「動く」のでは? なお、「qwe」の変数の値は「0」以外が取得されていますよね?

gotetsu
質問者

補足

すみません。 大事なことを忘れてました。 前者も後者も、ワークシート上に配置したコマンドボタンから実行するようにしています。 なお、qwe の値は、必ず「1」以上になります。

すると、全ての回答が全文表示されます。

関連するQ&A