• ベストアンサー

エクセル2000VBA コマンドボタンがうまく動きません

こんにちは、VBA初心者です。 2枚のシートがあり、「入力」というシートの任意のセルを、「出力」という別シートにコピーするという作業をコマンドボタンによって行いたいと思っています。 自分で作ってみたものは、このようになります。 Private Sub 任意の行のコピー・印刷_Click() Application.ScreenUpdating = False 'セル内容コピー Selection.Copy Sheets("出力").Select Range("A9").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("入力").Select ActiveCell.Offset(0, 1).Select Application.CutCopyMode = False Selection.Copy Sheets("出力").Select Range("C9").Select (以下略) ところが、これだと 「実行時エラー1004 RangeクラスのSelectメソッドが失敗しました」と表示され、デバッグをかけると6行目のRange("A9").Selectが黄色く反転した状態になります。 どうしてでしょうか。 同じ内容のものをマクロで登録し、実行すると、何の問題もなく動くのですが… ほとほと困っております。 どうかよろしくお願いします。

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.4

コードを記述しているシート以外は、シート名を明示してセルを指定するようにします。 あと、単一のセルをアクティブ セルにするには、Activate メソッドを使用します。 まぁ、Select でも影響は、ありませんが・・・ こんな感じで如何でしょうか。 Private Sub CommandButton1_Click() Application.ScreenUpdating = False 'セル内容コピー Selection.Copy Sheets("出力").Activate ActiveSheet.Range("A9").PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("入力").Activate ActiveCell.Offset(0, 1).Activate Application.CutCopyMode = False Selection.Copy Sheets("出力").Activate ActiveSheet.Range("C9").Activate '(以下略) End Sub

bari_saku
質問者

お礼

無事、うまくいきました…! 長々とおつきあいいただき、感謝に堪えません。 本当にありがとうございました!

その他の回答 (5)

  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.6

自分が回答したのに、「参考になる以前の回答」を探すのが大変でした(^^ゞ 要は、Wendy02さんのようなコードを書けばOKということです。 ついでに補足です。 .Select や .Activate を書かないのは、マクロ実行時に、カーソルやシートを動かさないためです。"入力"シートから"出力"シートへコピーするのに、.Activateを繰り返すと、シートがパラパラと入れ替わってしまいます。見てると疲れるので書かない方がいいです。

bari_saku
質問者

お礼

ご丁寧にありがとうございます。 「以前の回答」を探すの、難しいですよね。私も常々感じています。 皆様のおかげで、無事完成にこぎ着けることができました。 皆様と、このサイトのありがたみをかみしめています。

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

>要は微に入り細に入り、セルの場所を指定しておけばこのようなエラーは起きなかった、という解釈でよろしいでしょうか。 そういうことなんですね。 標準モジュールで書くと、Rangeオブジェクトの属性が、Application(Excel)になっているので、シートの配下(メンバ)になっていないのです。 記録マクロでエラーが出ないのは、標準モジュールに書かれたからなのです。 でも、記録マクロから脱皮するためには、やっぱり、「微に入り細に入り」をしてあげるというのは、大事なことなんですね。ですが、あまり、ごちゃごちゃしてしまっても、自分で分からなくなってしまうので、インデントを付けて、コードを構造的に書くということや、「With」で省略してやれば、見やすくなって、エラーも減るわけです。 「Select をいれない」ということを言う方がいますが、Selectをすると、その分、オブジェクトを取得しているために、時間が掛かるというわけですが、その時間というのは、数万個で、やっと1秒程度の違いが出てくるという話なのです。 「Selectを入れない」のは、Selectを入れる必要性がないからなのですね。 例えば、以下のようなコードをみて考えてみてください。 入力側は、A9 から1つずつ横に値を、出力側の、A9 に2つずつ横に値を出力する、という内容です。今回のご質問には、参考にはならないかもしれませんが、このように、Selectを使う場面が出てきません。 Private Sub CommandButton1_Click()  Dim i As Long  Dim sh1 As Worksheet, sh2 As Worksheet '  Set sh1 = Sheets("入力")  Set sh2 = Sheets("出力")  For i = 0 To 9   '出力側  = 入力側   sh2.Range("A9").Offset(, i * 2).Value _         = sh1.Range("A9").Offset(, i).Value  Next i  Set sh1 = Nothing  Set sh2 = Nothing End Sub

bari_saku
質問者

お礼

またまた、補足をありがとうございます。 昨日は本当に、おのれの未熟さを感じた一日でした…

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

まず、少し、言葉で、おやりになりたいことを説明していただいたほうが良いようですね。 確かに、記録マクロでも有効な場合があるのですが、不安定な要素が多いかと思います。 記録マクロで行うと不明な点  Selection (どこの範囲?)   Range("A9")(どこのA9?)   ActiveCell(どこのアクティブセル?) ということになってしまいます。ただし、Selection は、自分が選んだ範囲なら、それは、それで構わないのですが、それを使いまわししていくのでしたら、変数で確保したほうが安全です。 さらに、どこにマクロを書こうとも、それ自体は、正しい記述で書けば、クラスモジュール以外ではそれほど問題はないはずですが、ExcelのVBAは基本的には、標準モジュールに書くことになっています。例外的に、コマンドボタンを含めたイベント(何かをすると起動するマクロ)で、シートに属しているものや、グローバルなイベント、それ自体には意味を持たないインスタンスやプロパティの生成のためのコードです。 エラーになった部分に対しては、 例えば、  Range("A9") という時に、シートモジュールなら、そのシートの属性になりますが、そうでないと、エラーになりますね。 その理由は、 Sheets("出力") のRange("A9")というつもりでしょうけれども、 「入力」というシートのモジュールに書けば、暗黙的に、Range("A9") は、「入力」シートの属性になっています。 標準モジュールで書く書かないというよりも、Rangeオブジェクトは大きく分けると、二つあると考えてよいのです。 1つは、Application(Excel) の配下(メンバ)と、もう1つはシートの配下(メンバ)があります。シートのメンバを呼ばれても、違うシート(違う国のようなもの)になれば、そのメンバを呼んでも、そこには居ません。だからエラーになるわけですね。 だから、正しく、Sheet("入力").Range("A9") というように、苗字と名前のように呼んであげれば、ほぼ、どこでも間違いないわけです。

bari_saku
質問者

お礼

こんばんは。 >その理由は、 Sheets("出力") のRange("A9")というつもりでしょうけれども、 「入力」というシートのモジュールに書けば、暗黙的に、Range("A9") は、「入力」シートの属性になっています。 もしかして、この部分がポイントだったのでしょうか? 要は微に入り細に入り、セルの場所を指定しておけばこのようなエラーは起きなかった、という解釈でよろしいでしょうか。 (1日2日締め切らずにおきますので、もし激しい勘違いをしていましたらご指摘お願いできますでしょうか)

  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.2

マクロで動いて、ボタンで動かない理由は、コードの記述場所のちがいかと思われます。 マクロは、標準モジュール、ボタンは、Sheet1(入力)のところに書いてありますよね? 上記のコードでは、記述場所で違う動きになってしまいます。 selectとselectionは使用しなくてもコードは書けるので、そのようなコードにすれば、違いは出ないと思います。 コードは、私の以前の回答を参考にしてください。

bari_saku
質問者

お礼

こんばんは、ご回答ありがとうございます。 本当に申し訳ないのですが、「参考になる以前の回答」を具体的に教えて頂けませんでしょうか。 (ここ一ヵ月ぶんくらいのものは検索してみたのですが) ソース(?)をいじるようなVBAは今日始めたばかりなので、「selectとselectionを使用しないコード」というものが、全く見当がつきません… どうかよろしくお願いします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

6行目を以下のように変更するとどうなりますか? Sheets("出力").Range("A9").Select

bari_saku
質問者

補足

書き込みありがとうございます。 やってみましたが、残念ながら情況は変わらず、6行目が黄色になっています。 ちなみに、今は↓のようになっています。 'セル内容コピー Selection.Copy Sheets("出力").Range("A9").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("入力").Select

関連するQ&A

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

  • Excel 繰り返しマクロ

    下記のようなマクロを使ってn個あるシートの内容を「集計」シートにコピーさせるようにしました。 (自動マクロとの組合せなので、スマートではないかもしれませんが) でも、これだと「集計」シートもコピー作業を行ってしまうので、 「集計」シートはコピー作業をしないように除外したいのですが、どうしたら良いのでしょう? 実際にはシート数は30程度、コピペ項目は1シートあたり30項目程度あります。 よろしくお願いします。 ------------------------- Sub テスト2() ' For i = 1 To Worksheets.Count '案件番号等コピー ' Sheets(i).Select Range("D3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("A4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '案件名 Sheets(i).Select Range("F3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("B4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '国名 Sheets(i).Select Range("E3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("C4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '選択セルの解放 Application.CutCopyMode = False '行挿入 ' Sheets("集計").Select Rows("4:4").Select Selection.Insert Shift:=xlDown Next i End Sub

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

    マクロの超初心者です。 数式を入力しているのではなく、配付物をエクセルで作成しているのですが、同じもの(氏名や項目は違いますが)を100枚ほど作成しているのでマクロを・・・と思ったのですがやり方が全く分かりません。 sheet1からsheet2に下記のようにデータを写したいのですが、やり方を教えてください。 ●氏名が入力されています sheet1(A9) → sheet2(C2) sheet1(E9) → sheet2(C5) sheet1(I9) → sheet2(C8) ●項目1 sheet1(A8) → sheet2(E3) sheet1(E8) → sheet2(E6) sheet1(I8) → sheet2(E9) ●項目2 sheet1(A18~D18の結合セル) → sheet2(E2) sheet1(E18~H18の結合セル) → sheet2(E5) sheet1(I18~L18の結合セル) → sheet2(E8) と反映させたいのですが、250行あるのですが、 簡単にマクロで出来ないでしょうか?? ちなみに↓コレが上記の内容で作ってみたものです。 わかりずらい質問でスイマセン。 Range("A9").Select Selection.Copy Sheets("sheet2").Select Range("C2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E9").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("C5").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I9").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("C8").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("A8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E3").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E6").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E9").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("A18:D18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E18:H18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E5").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I18:L18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E8").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub

  • エクセル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]を表示させずにマクロを実行させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • エクセル VBA 繰り返し コピー貼り付け

    以下を繰り返し作業をOffsetを使用して行いたいのですがどうすればいいでしょうか? Sheets("Sheet1").Select Range("A1:C1").Select のA1:C1以下へA1000:C1000ぐらいあります。 Sheets("Sheet2").Select Range("G1").Select は貼り付けたセル3つの数字の組み合わせで公式に使う計算期間がまちまちですので公式を張り付けたり出来ません。 D1の解を heets("Sheet1").Select Range("D1").Select に貼り付けてA1:C1以下1000までの結果を評価出来るようにしたいのですが! ' Macro1 Macro Sheets("Sheet1").Select Range("A1:C1").Select Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D1").Select ActiveSheet.Paste Range("A2:C2").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D2").Select ActiveSheet.Paste Range("A3:C3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D3").Select ActiveSheet.Paste End Sub よろしくおねがいします。

  • EXCELのVBAについて

    マクロのボタンで内容を削除する様に設定した所、 Dim re As Integer Sheets("投入シート").Select re = MsgBox("入力データをクリアします。" & vbCrLf & vbCrLf & "よろしいですか?", vbOKCancel, "クリア確認") If re <> vbCancel Then Sheets("投入シート").Select ActiveSheet.Unprotect Range("a1:c30").Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("work").Select Range("A1").Select ActiveSheet.Paste Sheets("投入シート").Select ActiveSheet.Unprotect Range("c4:c30").Select Selection.ClearContents Range("f31").Select Selection.Copy Range("c9").Select ActiveSheet.Paste Range("f33").Select Selection.Copy Range("c11").Select ActiveSheet.Paste Range("f32").Select Application.CutCopyMode = False Selection.Copy Range("c14").Select ActiveSheet.Paste Range("c4").Select Application.CutCopyMode = False 'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If Sheets("投入シート").Select Range("c4").Select End Sub この様に入力したのですがセルのC11の計算式だけセル番号が消えてしまいます。 どうしてでしょうか?ご指導をお願いします。

  • Excelでマクロを繰り返したい。

    Excelでマクロを記録したら以下のようになりました このマクロを以下の条件で繰り返したいのですが。 Sub Macro1() '------------- '----------------------- ' Sheets("Sheet1").Select Selection.AutoFilter Field:=4, Criteria1:="=5*", Operator:=xlAnd, _ Criteria2:="<>5@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Range("A1").Select Selection.AutoFilter Field:=4, Criteria1:="=6*", Operator:=xlAnd, _ Criteria2:="<>6@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("B3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Selection.AutoFilter Field:=4, Criteria1:="=7*", Operator:=xlAnd, _ Criteria2:="<>7@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("A103").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Range("A1").Select Selection.AutoFilter Field:=4, Criteria1:="=8*", Operator:=xlAnd, _ Criteria2:="<>8@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("B103").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub 条件= Field:は4~35位まで変動します 一連の動作をコピーして手作業で数字を変えてみたのですが プロージャが大きすぎてエラーになってしまいます。 何か良い方法は無いでしょうか?。

  • エクセルVBA での繰り返し処理について

    エクセルVBA での繰り返し処理について 以下の作業を20回繰り返そうとしています(別シートから持ってきた値を「行列を入れ替えて」貼り付け)    Sheets("初期設定").Select Range("A6:C6").Select Selection.Copy Sheets(TS).Select Range("B4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True   「初期設定」シートの方は1行ずつ並んでいるので、「2回目」の「2行目」は   「 Range("A7:C7").Select」になり、   「TS」シートの20行後に貼り付けたいので、「2回目」の「5行目」は   「Range("B24").Select」 になります   これを、for ~ next を使い、以下のようにしてみましたが、上手くいきません。    For j = 6 To 26 For k = 4 To 384 Step 20 Sheets("初期設定").Select Range(Cells(j, 1), Cells(j, 3)).Select Selection.Copy Sheets(TS).Select Cells(k, 2).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True Next k Next j  1分程度ループし続けた後、「初期設定」シートの最終行だけが貼り付けられてしまいました。 どこをどのように直せばいいのかお教えください。 よろしくお願いいたします。

  • VBAでコマンドボタン操作で他のシートにコピーする方法を教えてください。

    エクセルのVBAでコマンドボタン操作でセルの値を他のシートのセルへコピーしたいのですが、やり方がわかりません。 自分なりに作ってみたのですが何が悪いのか教えてください。 Private Sub CommandButton1_Click() ' Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub Private Sub が怪しいのですが対処もわかりません。 ちなみにsheets2のA1には値がはいっています。 よろしくおねがいします。

  • エクセルVBA マクロの記録をコマンドボタンにコピペしても動かないのはなぜ?

    マクロを記録した以下は問題なく動くのですが、 Sub Macro1() Sheets("AAA").Select Range("A39:AQ39").Select Selection.Copy Sheets("BBB").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub これをシート”BBB”のコマンドボタンに下記のようにコピペすると Range("A39:AQ39").Selectでエラーが発生し動きません。 どうすれば動くようになるのでしょうか? また、どうしてボタンだとコピペするだけではいけないのでしょうか? Private Sub CommandButton1_Click()    ここにコピペ End Sub

専門家に質問してみよう