• ベストアンサー

エクセルのマクロ コマンドボタンなどについて

エクセルのマクロを作っています。 しかし、コマンドボタンを作って記述しても、エラー(実行時エラー'1004' copyメソッドが失敗しました)が出ます。マイクロソフトのHPのQ&Aを参照してみましたが、それでもうまく動きません。 その他、コンボボックスなども使ってみたいのですが、どうすればボタンを押せば特定の操作が出来るようになるのでしょうか? ちなみに、実行させる内容は、セルのコピーと、データの追加にしたがって、新しいデータに対して自動で新しい番号を割り付ける、この程度です。 大変困っています。 どなたか教えてください。 差し支えなければ、列単位、行単位、セル単位のコピーや、自動で番号を割り付ける簡単なマクロの記述を添えていただけますと、ありがたく存じます。 なにとぞよろしくおねがいします。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

#2です。 すでに皆さんが書かれている通りですね。 Private Sub CommandButton2_Click()  Sheets("原因").Select  Columns("D:E").Copy  Sheets("結果").Select  Range("E1").Select  Selection.PasteSpecial Paste:=xlPasteValues End Sub とすると、結果シートの D:E列 が E:F列 にコピーされるのが解かります。 VBAヘルプで「シートで ActiveX コントロールを使用する」を引くと「ActiveX コントロールをアクティブにすると、使用できなくなる Visual Basic のメソッドやプロパティがあります。」という一文がありますので、標準モジュールとの違いはそのあたりなのかなと個人的には思っています。 ActiveX コントロール関連でエラーが出る場合は、とりあえず明示的にシートを指定してみるのが良いかと思います。 Sheets("原因").Columns("D:E").Select ちなみに私も#5さんと同じように書きます。 Private Sub CommandButton2_Click()  Worksheets("原因").Columns("D:E").Copy  Worksheets("結果"). _    Range("E1").PasteSpecial xlPasteValues  Application.CutCopyMode = False End Sub xlPasteValues を使っている事から今回のケースには当てはまらないと思いますが、参照計算式が無いならこんな感じでも良いと思います。 Private Sub CommandButton2_Click()  Worksheets("原因").Columns("D:E").Copy _    Destination:=Worksheets("結果").Range("E1") End Sub

gotetsu
質問者

お礼

なんどもお世話になります。 ご教示いただいたプログラム、両方とも問題なく作動しました。^^ やはり、プログラムの行数が少ないほど速いような気がします。 単純にコピーして、そのコピーしたものを計算するので、後者のプログラムが適当かもしれません。 しかし、こんなに書き方があるとは。。。 VBAヘルプのくだりですが、個人的にはマイクロソフトに対して、使えなくなるメソッドやプロパティは無くして全部使えるようにしてくれよ、って思ってしまいました。(笑 懇切丁寧なご説明、どうもありがとうございました。

その他の回答 (6)

回答No.7

>同じ作業をこなすのに、2つ(それ以上?)の書き方が存在するというのは、全く予想外でした。 そうですね。本当にいろいろな書き方があります。 今回の質問も値のコピーという事だと、 Worksheets("結果").Range("E:F").Value = Worksheets("原因").Columns("D:E").Value のような書き方もできます。(Copy・Pasteより遅いみたいですけど) Range("E:F")とColumns("E:F")どちらでも可 セル単位なら Worksheets("結果").Range("E1").Value = Worksheets("原因").Cells(1,"E").Value RangeとCellsと書き方があります。 >taisuke555さんのプログラムの方が若干速いようでした。 selectは選択するという1つの命令ですから、 省けばその分速くなると思います。 後、コンボボックスの使い方と   自動で番号を振るマクロ についての質問もあるみたいですが、 もう少し具体的にあげないと、回答しにくいと思います。 (何をどのタイミングでどこにどうしたいのか等)

gotetsu
質問者

お礼

何度もありがとうございます。 自動的に番号(新しい)を振るプログラムですが、以下の記述で出来ました。 Private Sub CommandButton1_Click() Dim qwea As Integer qwea = Range("B2") + 4 qweb = qwea - 1  Sheets("原因").Range("B4:B10").Copy ’ここから、行と列を入れ替えて、新しいデータ行にコピーする命令です。  Sheets("結果").Cells(qwea, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True  Sheets("結果").Range(Cells(qweb, 6), Cells(qweb, 8)).Copy ’ここから、新しく出来たデータ行に、所定のセル(計算式)をコピーする命令です。  Sheets("結果").Cells(qwea, 6).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ’ここから、新しく出来たデータ行に、最新の番号を割り振る命令です。  Sheets("結果").Cells(qwea, 2).Select  Cells(qwea, 2) = qwea - 3 End Sub コンボボックスの使い方ですが、具体的には、ある計算をさせるのに、3通りのデータがあり、グラフを表示させるのに、5通りのデータがあるのですが、それらをBOXで選択したい、という希望です。 自分で一度書いてみませんと、質問にならない気がしますので、一回書いてみます。 その節はまたご指導お願いします。 ほんとにどうもありがとうございました。

回答No.5

#4さんと同じ事ですが、 標準モジュールの Columns("D:E").Select Range("E1").Select は、シート名が省略されています。 この場合、省略されているシートはアクティブシートになります。 「結果」のシートに移動した場合、 上記の省略されているシートは「結果」シートになります。 「原因」シートをアクティブにしたのに、 「結果」シートのD:Eセルを選択しようとしているので     エラーになっていると思います。 ActiveSheet.Columns("D:E").Select や workbooks("原因").Columns("D:E").Select にしてもいいですけど、私は Private Sub CommandButton2_Click()   Sheets("原因").Columns("D:E").Copy   Sheets("結果").Range("E1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _   :=False, Transpose:=False End Sub のようにSelectを書かない書き方をします。

gotetsu
質問者

お礼

目からウロコです。 同じ作業をこなすのに、2つ(それ以上?)の書き方が存在するというのは、全く予想外でした。 もちろん、taisuke555さんのプログラムも問題無く動きました。^^ 速さでは、プログラムが短いからなのか?、taisuke555さんのプログラムの方が若干速いようでした。 アクティブシートの扱いですが、標準モジュール式?の文法ではちゃんと動いていた文法なのですが、指定の方法が異なることがわかりました。 ほんとに助かりました。 どうもありがとうございました。

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.4

今日は これは、標準モジュールに書いたマクロと、イベントに書いたマクロで、文法が違うのが原因だと思われます。 例えば、gotetsuさんの書かれた、マクロを標準モジュールに移すと、うまく実行できます。 Sub aaa() Sheets("原因").Select Columns("D:E").Select Selection.Copy Sheets("結果").Select Range("E1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub しかし、イベントに書くと、次のようにしないと、うまく動きませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) Sheets("原因").Select Sheets("原因").Columns("D:E").Select Selection.Copy Sheets("結果").Select Sheets("結果").Range("E1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

gotetsu
質問者

お礼

どうもありがとうございます。 ki-aaaさんのおっしゃるとおり、私が記したものは、標準マクロで書いたものといいましょうか、自動マクロで書いたものをコピーしたものなんです。 違う文法というか単語を用いる必要がある、という発想が全くなかったので、困っていました。 記述いただいたプログラムで問題なく動きました。^^ 大変助かりました。 どうもありがとうございました。

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

少々修正して下記で動きました。 Private Sub CommandButton1_Click() Sheets("sheet1").Select Columns("D:E").Select Selection.Copy Sheets("sheet2").Activate ActiveSheet.Range("E1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub Pasteが「Activesheet」!に対して行われるってことらしいが、判り難い点です。大村あつしさんの本には解説してあったように記憶します。何度も失敗した経験があります。 Sheet1-->Sheet2のセル間の代入でコピー(メソッド)を避けたこともあります。 http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv99114.html ActiveSheet.Pasteと覚えることです。そしてその直前に 「どのSheetに貼りつけたいのか」、「スタートポイントはどこか」を記述するようにしては。 「スタートポイント(セル・列など)はどこか」を記述する方法も気をつけて。 Sub test02() Range("D:D,E:E").Copy Sheets("Sheet2").Activate Sheets("Sheet2").Columns("B:B").Select ActiveSheet.Paste End Sub

gotetsu
質問者

お礼

早々にご回答ありがとうございます。 同じシート間でコピーするには有効でした。^^ 違うシートへコピーするには、 自分なりに工夫してみたのですが出来ませんでした。 ご紹介いただいたアドレスは、今後参考になりそうな内容ですので、読み込んで理解したいと思います。 貴重なアドバイス、どうもありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

「マクロでエラーが出ます。何が悪いのでしょう」で解かる奴はいません。 ExcelのバージョンやどこにCommandButtonを置いて、どんな記述か書かないと。 Sub aaa() Dim r As Range  With ActiveSheet   Set r = .Range("C65536").End(xlUp)   If r.Value = "" Then r.Value = 1   If IsNumeric(r) Then r.Resize(5, 1).DataSeries  End With End Sub Sub bbb()  ActiveSheet.Columns("A").Copy  ActiveSheet.Columns("B").PasteSpecial  ActiveSheet.Rows("1:2").Copy  ActiveSheet.Rows("3").PasteSpecial  Application.CutCopyMode = False End Sub

gotetsu
質問者

補足

言葉足らずですみません。 以下、補足します。 CPU = P4 , 2.6Ghz memory = 512MB OS = XP pro EXEL = office pro 2003 です。 コマンドボタンは、結果シート上 においています。 記述は以下の通りです。 Private Sub CommandButton2_Click() Sheets("原因").Select Columns("D:E").Select Selection.Copy Sheets("結果").Select Range("E1").Select Selection.PasteSpecial Paste:=xlPasteValues,   Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub エラーは、 Columns("D:E").Select の行で、実行時エラー'1004': range クラスの select メソッドが失敗しました。 と、出ています。 ちなみに、papayuka さん記述のプログラムは、 CommandButton1_ で、問題無く作動しました。 どうか、よろしくおねがいします。

回答No.1

こんにちは。 アドバイス程度に・・・。 私はとりあえず「ツール」→「マクロ」→「新しいマクロの記録」で自動作成させたものを後で修正する、といった方法をよく使います。エクセルのバージョンによって多少コマンドの記述方法が異なる場合があるのですが、この方法を使えば問題ないと思います。まだ試してなかったらぜひお試し下さい。

gotetsu
質問者

お礼

どうもありがとうございます。 実は私も自動作成したものを修正する方向で、プログラムを書いておりました。^^ しかし、今回のボタン操作は、どうにもうまくできないのです。 いろいろ本で探してみたりしたのですが、解決の糸口が見つからなくて、困っております。

関連するQ&A