• ベストアンサー

エクセル マクロについて 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/17068)
回答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

  • エクセル データ消去についてのマクロ

    セル内のデータをクリアする以下のマクロを設定しました。 Sub データ消去() Sheets("1").Range("B5:AF9").ClearContents Sheets("1").Range("B5:AF9").ClearConmments Sheets("1").Range("B11:AF15").ClearContents Sheets("1").Range("B11:AF15").ClearConmments Sheets("2").Range("B5:AF9").ClearContents Sheets("2").Range("B5:AF9").ClearConmments Sheets("2").Range("B11:AF15").ClearContents Sheets("2").Range("B11:AF15").ClearConmments Sheets("3").Range("B5:AF9").ClearContents Sheets("3").Range("B5:AF9").ClearConmments Sheets("3").Range("B11:AF15").ClearContents Sheets("3").Range("B11:AF15").ClearConmments End Sub 今後、シート及び選択セルが増える予定ですが、 各々のシートのクリアする選択セルは同一です。 もっと簡単な方法はないのでしょうか? よろしくお願いします。

  • Cells(1,3)をRange("C1")に変換

    Sheets(Sn).Range("A1:Z98").Copy Destination:=Sheets(Sn).Range("V9") r=131です 上記のVBAを使用したいのですが求められるのはCells(r-1,3)なのです。そのためにCells(r-1,3)をRange("C130")に変換できないでしょうか よろしくお願いします。

  • アクティブでない複数のシートのセルのコンテンツを一度でクリアしたい

    エクセルVBAで、アクティブでない複数のシートの所定のセルのコンテンツを一度でクリアしたいのですが、 現在アクティブではないシートをアクティブにしないでclearcontentsするとアプリ定義、オブジェクト定義エラーになってしまいます。 それぞれのシートをアクティブにしないとclearcontentsできないのでしょうか? どなたか教えてください。よろしくお願いします。 ------------------------------------------------------------------------------- Sub CLEAR_CONTENTS() Sheets(\"1\").Range(Cells(6, 3), Cells(6, 8)).ClearContents Sheets(\"2\").Range(Cells(6, 3), Cells(6, 8)).ClearContents Sheets(\"3\").Range(Cells(6, 3), Cells(6, 7)).ClearContents End Sub

  • エクセル2003マクロの再編集

    Sub test() Dim 行1 As Long, 最終行 As Long, 行2 As Long Sheets("Sheet2").Cells.ClearContents Sheets("Sheet1").Activate 最終行 = Range("C65536").End(xlUp).Row 行2 = 1 For 行1 = 1 To 最終行 Sheets("Sheet2").Cells(行2, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Cells(行2, 3).Value = Abs(Sheets("Sheet2").Cells(行2, 3).Value) If Range("A" & 行1).Value = "BBBB1" Then Sheets("Sheet2").Range("A" & 行2) = Range("A" & 行1) & "-1" Sheets("Sheet2").Cells(行2 + 1, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Range("A" & 行2 + 1) = Range("A" & 行1) & "-2" 行2 = 行2 + 1 End If If Range("A" & 行1) = "" Then 行2 = 行2 - 1 Sheets("Sheet2").Range("C" & 行2) = Sheets("Sheet2").Range("C" & 行2) + Range("C" & 行1) End If 行2 = 行2 + 1 Next 行1 End Sub を編集したいのですが全然図りません ご指導お願いします 元データ AAAA5 9601  950 BBBB1 9660  150 ASAS9 9654  -50 AXCW5 9603  1375 以下の用にマクロで変換する用に出来たのですが 【1】 BBBB1だけではなくAAAA5も対処になったときの 追加方法です 元データは一切変更が出来ません ※フォントの変更も不可です 【2】 元データと変換後データがSheet1からSheet2になっていますが Sheet1の元は範囲はA1~C400で変換後をSheet1E1~G400にしたいのです AAAA5 9601  950  BBBB1-1 9660  150  BBBB1-2 9660  150 ASAS9 9654  50 AXCW5 9603  1375

  • エクセルで、シートを非表示のままマクロを実行するには?

    エクセル初心者です。 Sheet1で、マクロの実行ボタンがあり、Sheet2で、データを編集して、 Sheet1に結果の一覧を表示させるマクロなのですが、 Sheet2は非表示のままマクロを実行したいのですが、うまくいかず、 Sheet2を表示して、実行するとうまくいくため、 一時的にシートを表示させるようにしてみたのですが、 Sheets("Sheet2").Range(Cells(2, 28), Cells(rowCnt, 37)).Insert Shift:=xlDown で、アプリケーション定義・オブジェクト定義エラーになります。 どなたかご指南下さい。 Private Sub EDITSLINF() Dim rowCnt As Long Application.ScreenUpdating = False Worksheets("製造記録一覧 (edit1)").Visible = True  Sheets("Sheet2").Range("AB2:AK300").ClearContents '追加レコード抽出&コピー&ペースト Sheets("Sheet2").Range("Q1:Z300").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "AP1:AP2"), CopyToRange:=Sheets("Sheet2").Range("AB1:AK1"), Unique:=False '既存レコードコピー&ペースト rowCnt = Sheets("Sheet2").Range("O1") Sheets("Sheet2").Range(Cells(2, 28), Cells(rowCnt, 37)).Insert Shift:=xlDown Sheets("Sheet2").Range(Cells(2, 28), Cells(rowCnt, 37)).Interior.ColorIndex = xlNone Sheets("Sheet2").Range(Cells(2, 2), Cells(rowCnt, 11)).Copy Sheets("Sheet2").Range("AB2").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Worksheets("Sheet2").Visible = False 'メインシートへコピー   Application.CutCopyMode = False Sheets("Sheet2").Range("AB2:AJ300").Copy Sheets("Sheet1").Range("K4").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False End Sub

  • excelのマクロでrangeの選択がうまくいきません。

    excelのマクロでrangeの選択がうまくいきません。 以下のマクロをsheet2に書きました。testcopyは動きますが、testcopy2は動きません。なぜなのでしょうか。どうすればいいのでしょうか。それ以外のマクロの部分との関係から、cellsを使い、数字を使ってrangeの処理をしたいのです。よろしくお願いします。 Sub testcopy() Worksheets("sheet1").Range("B3:C10").Copy Worksheets("sheet2").Range("e5").Select ActiveSheet.Paste End Sub Sub testcopy2() Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy Worksheets("sheet2").Range("e5").Select ActiveSheet.Paste End Sub

  • excel 文字抽出マクロの編集についてですが・・・

    マクロで指定した文字を含むデータを抽出するマクロを 作っていたのですが、うまく作動しません。 どこが悪いか教えてください。 Sub 指定した文字データの抽出() Dim strMoji As String strMoji = InputBox("検索文字を入力してください") strMoji = "*" & strMoji & "*" Sheets("Sheet2").Activate Cells.Clear With Sheets("Sheet1") .Range("A2").AutoFilter Filde:=3, criterial:=strMoji .Range("A2").CurrentRegion.Copy _ Destination:=Sheets("Sheet2").Range("A2") .Range("A2").AutoFilter End With Sheets("Sheet2").Columns("A:D").AutoFit End Sub

  • エクセル2003マクロの機能追加

    Sub test() Dim 行1 As Long, 最終行 As Long, 行2 As Long Sheets("Sheet2").Cells.ClearContents Sheets("Sheet1").Activate 最終行 = Range("C65536").End(xlUp).Row 行2 = 1 For 行1 = 1 To 最終行 Sheets("Sheet2").Cells(行2, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value If Range("A" & 行1).Font.Bold Then Sheets("Sheet2").Range("A" & 行2) = Range("A" & 行1) & "-1" Sheets("Sheet2").Cells(行2 + 1, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Range("A" & 行2 + 1) = Range("A" & 行1) & "-2" 行2 = 行2 + 1 End If If Range("A" & 行1) = "" Then 行2 = 行2 - 1 Sheets("Sheet2").Range("C" & 行2) = Sheets("Sheet2").Range("C" & 行2) + Range("C" & 行1) End If 行2 = 行2 + 1 Next 行1 End Sub 元データ AAAA5 9601  950 BBBB1 9660  150 ASAS9 9654  -50 AXCW5 9603  1375 以下の用にマクロで変換する機能を追加したいのです AAAA5 9601  950 BBBB1-1 9660  150 BBBB1-2 9660  150 ASAS9 9654  50 AXCW5 9603  1375 宜しくおねがいします。

  • エクセルのマクロについての質問です。

    エクセルのマクロについての質問です。 複数のシートのデータを一つのシートにまとめるマクロを使用しています。 以下のものになります。 Sub まとめ() Dim i As Long, ii As Long ii = 1 With Worksheets .Add before:=.Item(1) For i = 2 To .Count .Item(i).Range("BX6:CQ15").Copy .Item(1).Cells(ii, "A") .Item(i).Range("C59:U68").Copy .Item(1).Cells(ii, "U").PasteSpecial Paste:=xlPasteValues ii = ii + 10 Next i End With Application.CutCopyMode = False Range("1:1").Insert Sheets(2).Range("BX5:CQ5").Copy Sheets(1).Range("A1") Sheets(2).Range("C58:U58").Copy Sheets(1).Range("U1") Columns("B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete Sheets(1).Columns("C:D").Delete Sheets(1).Columns("F:G").Delete Sheets(1).Columns("G:O").Delete End Sub このマクロを使用してまとめたシートの数値の部分(各シートのC59:U68のデータを貼り付けた部分、まとめたシートのH2のセルが起点です)を変更するとコピー元(各シートのC59:U68)の数値も同じように変わるというものを作りたいです。 いろいろと調べましたが手も足も出ませんでした。 ご教示いただけないでしょうか? 宜しくお願いいたします。

  • Excel2003 Range("XXX").Copyについて

    下記のようにコピペをしたいのですが ActiveSheet.Paste Sheets("sheets1").Range("V3").Copy Worksheets("sheets2").Activate Sheets("sheets2").Range "A1").Select 上の方法だと良く行くのですが下記だとSheets("sheets1").Cells(9,16).Copyエラーになってしまします。どうしてもCells(9,16) を使いたいのですが方法を教えてください。 ActiveSheet.Paste Sheets("sheets1").cells(9,16).Copy Worksheets("sheets2").Activate Sheets("sheets2").Range "A1").Select よろしくお願いします。

専門家に質問してみよう