• ベストアンサー

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

  • qso
  • お礼率39% (20/51)

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

>testcopyは動きますが、testcopy2は動きません testcopyは「動作したり、しなかったりする」が正しい表現です。   要するに今回testcopyが動いたのは▼たまたま▼ということです。 testcopy2 は当然ながらエラーになります。 何れにしろ、両方ともに問題があるということです。 その問題点は2つあります。 (1)アクティブでないシートのセルはSelect(Activate)できない (2)複数のシートを扱うときのセルの参照は    そのセルがどのシートのセルなのか明示する必要がある これを踏まえて、、、、 --------------- ●testcopy● これが動作するのは Sheet【2】がアクティブな状態で実行する場合です Sheet【1】がアクティブな状態で実行すると   Worksheets("sheet2").Range("e5").Select ここで、問題点(1)の理由によりエラー。 で、先ずシートを選択、次にセルを選択と2段階にしないといけません。   Worksheets("sheet2").Select   ActiveSheet.Range("E5").Select ---------------- ●testcopy2● ▼Sheet【1】がアクティブな状態で実行   testcopyと同じ場所、同じ理由でエラー ▼Sheet【2】がアクティブな状態で実行   Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy   ここで、問題点(2)により、エラー。    Cellsの前にシートオブジェクトがないので  Cells(3, 2), Cells(10, 3)はアクティブなSheet【2】のセルとみなされ  (★実際はちょと違う場合もありますが今回はそう★)  Worksheets("sheet1").Range(  ← Sheet【1】  Cells(3, 2), Cells(10, 3))   ← Sheet【2】 このようにSheet【1】【2】が混在していることになり、エラー で、Cellsの前にシートを付加してセルがどのシートのセルか明示してやる Worksheets("sheet1").Range(Worksheets("sheet1").Cells(3, 2), Worksheets("sheet1").Cells(10, 3)).Copy    --------------------------------- で、質問者のコードを修正すると '------------- Sub testcopy()  Worksheets("sheet1").Range("B3:C10").Copy  With Worksheets("sheet2")    .Select    .Range("E5").Select    .Paste  End With End Sub '------------- Sub testcopy2()  With Worksheets("sheet1")    .Range(.Cells(3, 2), .Cells(10, 3)).Copy  End With  With Worksheets("sheet2")    .Select    .Range("E5").Select    .Paste  End With End Sub '-------------- ●ただ今回のような単純なコピーの場合は  既出の回答にあるようにSelectなしで書くのがふうつです。 '----------- Sub testcopy111()  Worksheets("sheet1")    .Range("B3:C10").Copy Worksheets("sheet2").Range("E5")  End With End Sub '----------- Sub testcopy222()  Worksheets("sheet1")   .Range(.Cells(3, 2), .Cells(10, 3)).Copy Worksheets("sheet2").Range("E5")  End With End Sub '----------- 今回の件は重要事柄ですので覚えておきましょう。 以上です。  

qso
質問者

お礼

たくさんの方々からの回答、本当にありがとうございます。 selectは使用しなくて済めば、使用しない方がいいこと、activeでないと、selectできないこと、たとえrangeの中でも、cellsは丁寧に指定しないといけないこと、など多くの基本的なことを学びました。

その他の回答 (4)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

ActiveでないSheetのオブジェクトはSelectできません。質問の場合他の回答者さんのいうようにSelectは必要ないのですが、どうしてもSelectしたければ、Worksheets("Sheet2").Activateなどとしますが、速度が遅くなるだけです。 Sub testcopy3() With Worksheets("Sheet1") .Range(.Cells(3, 2), .Cells(10, 3)).Copy End With Worksheets("Sheet2").Cells(5, 5).PasteSpecial End Sub

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

Cellsもシート名で修飾する必要があります。 With Worksheets("sheet1") .Range(.Cells(3, 2), .Cells(10, 3)).Copy End With soixanteさんが言われるようにSelectする必要はありません。 With Worksheets("sheet1") .Range(.Cells(3, 2), .Cells(10, 3)).Copy Destination:=Worksheets("sheet2").Range("e5") End With

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>以下のマクロをsheet2に書きました。testcopyは動きますが、testcopy2は動きません。なぜなのでしょうか。 初級ですが、良く間違いをすることです。 まず、マクロコードは、イベントドリブン型など以外は、標準モジュールに書きましょう。 testcopy2の 動かない理由は、 Sub testcopy2()   Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy   Worksheets("sheet2").Range("e5").Select   ActiveSheet.Paste End Sub    >.Range(Cells(3, 2), Cells(10, 3)) Sheet2 のモジュールに置いたとします。 Worksheets("sheet1").Range(------) は、確かに、Sheet1 ですが、中身のセル・プロパティの Cells(3, 2)  Cells(10, 3) の親オブジェクトは、Sheet2 だからです。中で、不整合が起きてしまっています。この問題は、おそらく、Excel VBAをMicrosoftで開発する時に、開発段階で、ミスしたのだと思っています。Range でくくれば、そのプロパティは、Range の親オブジェクトを引き継ぐのは当たり前なのに、その引き継ぐ設定をし忘れたように思います。それと、Range プロパティとCells プロパティは、開発では別々に考えられたものだったに違いありません。 書き方としては、以下のようにします。 Sub Test1() With Worksheets("Sheet1")  .Range(.Cells(3, 2), .Cells(10, 3)).Copy Worksheets("Sheet2").Range("E5") End With End Sub Sub Test2()  Worksheets("Sheet1").Range("B3").Resize(8, 2).Copy Worksheets("Sheet2").Range("E5") End Sub

  • soixante
  • ベストアンサー率32% (401/1246)
回答No.1

Sub testcopy3() Worksheets("Sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy Worksheets("Sheet2").Cells(5, 5) End Sub 不必要ならいちいちSelectしないほうがよいですよ。

関連するQ&A

  • エクセルのマクロについて

    エクセルのマクロについて 領域の範囲選択→貼り付けの繰り返し処理をループで考えています。 領域の範囲選択し、貼り付け処理をマクロの自動記録で、出してみました。 Sub Macro1() Range("E6:G12").Select Selection.Copy Range("E17").Select ActiveSheet.Paste Application.CommandBars("Stop Recording").Visible = False End Sub この時に、「Range("E17").Select」の命令は「Cells」関数に置き換えられるのですが、「Range("E6:G12").Select」のように複数のセルの領域選択をする際に、「Cells」関数ではできないのでしょうか。 「Cells」関数を使えば、行列を数値にし、変数を使えば、LoopかFor命令で繰り返し処理ができるのですが、わかる方、解答ください。よろしくお願いします。

  • マクロについて教えてください。

    最近、勉強し始めました。 名簿を作成しています。Sheet1のデータを2種類に分けてSheet2(県外)、Sheet3(県内)のあらかじめ作成している表に振り分けたいのです。 しかしながら、1名分のデータをコピーして張り付けることはしたのマクロで出来たのですが、2名分もこのようにするとなると手入力したほうが速いような気がしています。 なにかいい方法がありましたら教えてください。 Sub コピーして別のシートに貼り付ける1() Worksheets("Sheet1").Activate Range("B11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("B10:E17") Range("C11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("A18:E19") Range("D11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("F10:K17") Range("E11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("F18:K19") Range("F11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M10:S10") Range("G11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M11:S11") Range("H11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M12:S12") Range("I11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M13:S13") Range("J11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M14:S14") Range("K11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M15:S15") Range("L11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M16:S16") Range("M11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M17:S17") Range("N11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M18:S18") Range("O11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("M19:S19") Range("P11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("T10:T19") Range("Q11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("U10:U19") Range("R11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("V10:V19") Range("S11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("W10:W19") Range("T11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("X10:X19") Range("U11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("Y10:Y19") Range("V11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("Z10:Z19") Range("W11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("AA10:AA19") Range("X11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("AB10:AB19") Range("Y11").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("AC10:AG19") End Sub

  • エクセル2003 マクロ機能を使ったコピー

    エクセルのマクロ初心者です。 コピー元は、計算式が入ったセルです。 値のみを別のシートへコピーしたいと思っていますが 40番の行でエラーとなってしまします。 行き詰ってしまったため、ご教授いただければ幸いです。 よろしくお願いします。 以下が現在のマクロです。 ================ Private Sub 10 月 = Worksheets("毎月").Cells(1, 2) 20 月 = 月 + 3 30 Worksheets("毎月").Range("F24").Copy 40 Worksheets("年").Range(Cells(月, 3)).Select 50 Selection.PasteSpecial Paste:=xlPasteValues End Sub ================

  • エクセルのマクロを使って・・・

    見積書を作成するマクロを作っているのですが、シートの追加がうまくいかず困っています。 見積書を作る際に、明細を入力する行が足らない時に、あらかじめ、作ってある『明細マスター』と言う名前のシートから、明細書をコピーして新しいシートを挿入して、そこに貼り付けると言う作業を、最大で“明細書(1)~(5)”5枚のシートを追加できる…と言う、マクロを作りたいのですが… 追加する枚数はその都度、違うそうなので、1回実行すると、『明細書(1)』が追加され、2回目の実行で『明細書(2)』が追加・・・・・ と言うようなマクロを作りたいのですが・・・ Sub 明細書() Worksheets.Add After:=ActiveSheet ActiveSheet.Name = "明細書(1)" Sheets("明細マスター").Select Cells.Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("明細書(1)").Select Cells.Select ActiveSheet.Paste Range("B2").Select End Sub 上記のマクロで、一枚だけの追加だと明細書が追加されるんですが、それを最大5枚まで追加すると言うマクロが分かりません。 質問が、分かりにくかったら申し訳ありませんが、よろしくお願いいたします。

  • Excelマクロのことで教えて下さい

    初歩的なことですみません。 E列の値をF列に値を入れるために下記のマクロを組みました。 Sub test() Worksheets("Sheet1").Select Dim i As Long For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row Range("F2").Value = "=E2/1024/1024" Cells(i, 6).FillDown Range(Cells(2, 6), Cells(i, 6)).Copy Range("F2").PasteSpecial Paste:=xlValues Next i End Sub ところがF列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。

  • エクセル2000のマクロにおける、複数シート間のコピー&ペーストについて

    閲覧ありがとうございます。 現在、エクセル2000(OS、WIN2KPRO)を用いて、以下のような仕様のマクロを組もうとしています。 1.Sheet1のCommandButton1から実行する。 2.Sheet2のA1セルから、O?セルまでのデータの入っているセルをコピーし、Sheet1のB4セル以下にペーストする。 3.O?セルの?は1000以下の値で変化する。 4.Sheet2のF列には、ユニークキーが入力される為、必ず値が入力されている。 上記の仕様に従い、以下のようなマクロを組みましたが、 > Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select のラインでエラーが発生します。 激しく独学の為、汚いソースですみません^^; **************************************** Private Sub CommandButton1_Click() Worksheets("Sheet2").Select Worksheets("Sheet2").Activate Dim Line_Num Line_Num = 1000 - WorksheetFunction.CountBlank(Range("F1:F1000")) Worksheets("Sheet2").Range("A1").Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Copy Worksheets("Sheet1").Select Worksheets("Sheet1").Activate Range("B4").Select ActiveSheet.Paste End Sub

  • マクロでソルバーを使えますか?

    VBAは未経験です。エクセルでソルバーをマクロで記録し、実行しようとしたらエラーメッセージが出てしまいました(コンパイルエラーsubまたは functionが定義されていません)。 マクロにソルバーを組み込むこと自体ができないのでしょうか? 宜しくお願いします。 Range("E4:M4").Select Selection.Copy Range("E11").Select ActiveSheet.Paste Range("E4:M4").Select Selection.Copy Range("E12").Select ActiveSheet.Paste SolverOk SetCell:="$E$7", MaxMinVal:=3, ValueOf:="20", ByChange:="$D$5:$K$5" SolverSolve Range("E4").Select End Sub

  • エクセルをバージョンアップさせたらマクロがうまくいきません

    OSはXPです エクセル2002から 2003にバージョンをあげました いままでうまくいっていたマクロが Range(Cells(1, 1), Cells(Cells(65535, 1).End(xlUp).Row, 9)).Select Selection.Copy Sheets("Sheet1").Select Sheets.Add ActiveSheet.Paste このような内容で ActiveSheet.Paste  この部分でエラーが起きます 「実行時エラー ”1004”  worksheetクラスのpasteメソッドが   失敗しました」 というメッセージがでます。 どういう対処をしたらよろしいでしょうか? ご教授ください。 (バージョンを元にに戻すなど)

  • エクセル2007マクロ シート間のセルコピー

    [Sheet1]にあるデータを[Sheet2]にコピーするマクロボタンを[Sheet2]に作りたいのですが、マクロがよく分からないので、「マクロの記録」で作成してみました。 Sub siken() ' ' siken Macro ' ' Sheets("Sheet1").Select Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B3").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B6:D6").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B6").Select ActiveSheet.Paste End Sub (実際はもっと多くのセルをコピーします) マクロを実行すると、ちゃんとコピーできるのですが、セルをコピーする都度[Sheet1]と[Sheet2]が交互に表示されます。 コピー元の[Sheet1]を表示させずにマクロを実行させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • エクセルのマクロについて

    エクセル97でマクロを組んで下記作業を行いたいと考えていますが(実際にやりたい事から抜粋した内容です)、不具合が起こっています。 ~やりたい事~ コマンドボタンを押すとあるシートのセルをコピーして、違うシートに貼り付ける。 ~不具合内容~ (1)普通にマクロを実行すると問題ないが、(2)コマンドボタンを使用するとエラーが起こる。 エラー内容は、 「実行時エラー'1004' RangeクラスのSelectメソッドが失敗しました。」 と言う内容です。 ~(1)のVB表記~ Sub Macro1() Sheets("sheet1").Select Range("A1").Select Selection.Copy Sheets("sheet2").Select Range("A1").Select ActiveSheet.Paste End Sub ~(2)のVB表記~ Private Sub CommandButton1_Click() Sheets("sheet1").Select Range("A1").Select (←ここでエラーが発生します) Selection.Copy  Sheets("sheet2").Select Range("A1").Select ActiveSheet.Paste End Sub ~質問事項~ 1)(2)の表記の何が原因でエラーが起こっているのでしょうか? 2)エラーが起きない為にはどのようにしたら良いでしょうか?

専門家に質問してみよう