こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2004-05-08 00:42:34

QNo.851532

すぐに回答ほしいです

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

#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

投稿日時 - 2004-05-08 13:12:43

お礼

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

投稿日時 - 2004-05-08 14:47:15

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.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つの命令ですから、
省けばその分速くなると思います。

後、コンボボックスの使い方と
  自動で番号を振るマクロ
についての質問もあるみたいですが、
もう少し具体的にあげないと、回答しにくいと思います。
(何をどのタイミングでどこにどうしたいのか等)

投稿日時 - 2004-05-08 14:42:31

お礼

何度もありがとうございます。
自動的に番号(新しい)を振るプログラムですが、以下の記述で出来ました。

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で選択したい、という希望です。
自分で一度書いてみませんと、質問にならない気がしますので、一回書いてみます。
その節はまたご指導お願いします。
ほんとにどうもありがとうございました。

投稿日時 - 2004-05-08 23:01:34

ANo.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を書かない書き方をします。

投稿日時 - 2004-05-08 11:37:20

お礼

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

投稿日時 - 2004-05-08 12:20:27

ANo.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

投稿日時 - 2004-05-08 11:07:05

お礼

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

投稿日時 - 2004-05-08 12:08:02

ANo.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

投稿日時 - 2004-05-08 06:52:59

お礼

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

投稿日時 - 2004-05-08 12:02:29

ANo.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

投稿日時 - 2004-05-08 02:03:52

補足

言葉足らずですみません。
以下、補足します。
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_ で、問題無く作動しました。

どうか、よろしくおねがいします。

投稿日時 - 2004-05-08 03:14:42

ANo.1

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

投稿日時 - 2004-05-08 01:31:06

お礼

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

投稿日時 - 2004-05-08 03:19:00

あなたにオススメの質問