[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コマンドボタンにマクロを登録したい』(gu-chan)
3つのフォルダーにある3つのシートの表を
別のフォルダーにある1つの表にまとめたいのです。
マクロを作って「ツール」から「マクロ」⇒「実行」ではうまくいきますが、
コマンドボタンを作ってそのマクロを登録し
ボタンをクリックして実行するとうまくいきません。
最初のところの
Workbooks.Open Filename:="C:\123-1\Yグループ\契約.xls" Range("A26:I33").Select Selection.Copy Windows("集計").Activate Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False
2行目のところが黄色くなっています。
マクロをつくるのは初めてです。
周りに質問できる人もいません。よろしくお願い致します。
上記マクロをどのモジュールへ登録していますか? シートモジュールで Private Sub CommandButton1_Click() End Sub このようなコマンドボタンのクリックイベントに 直接書かれているのではないでしょうか。 動かしたいマクロを標準モジュールへたとえば Sub TEST() '実行したいマクロの中身 End Sub として、 Private Sub CommandButton1_Click() TEST End Sub のように標準モジュールのマクロを呼び出すような形にすれば とりあえずは動くと思います。 【原因】 シートモジュールに登録する際、 Range("A26:I33").Select とどのブック、どのシートのRangeオブジェクトか明示しないで 記述されたものは暗黙的にコードの書かれたシートのRangeオブジェクトと 認識されます。 つまり、 Me.Range("A26:I33").Select の Me. が省略されていると認識します。 然るに、その前に Workbooks.Open Filename:="C:\123-1\Yグループ\契約.xls" で別のブック(の中のシート)が開かれていて、 マクロを登録したシートとは別のシートがアクティブな状態です。 Selectメソッドは「アクティブなシートのものしかSelectできない」 という約束事があるので、アクティブになっていない、 [Me.]Range("A26:I33").Select はSelectできない、と叱られるわけです。 ただ、これはgu-chanさんの意図するセル範囲とは違うセルを Selectしに行っているわけですから、もしちゃんと動かそうとすれば、 Workbooks("契約").Worksheets("????").Range("A26:I33").Select という風にどのシートがアクティブになっているか、意識した書き方を せねばなりません。 標準モジュールに登録した場合は、逆に、 Range("A26:I33").Select とどのブック、どのシートのRangeオブジェクトか明示しないで 記述されたものは暗黙的にその時点でアクティブなシートの Rangeオブジェクトと認識されるために問題なく動いてくれるわけです。 【結論】としては シートオブジェクトに直接コードを書く場合には どのオブジェクトに対して処理しているか明示しないと コードの登録されているオブジェクトが対象であると「誤解」される。 ・・・ということになります。 (みやほりん)
Sub TEST() ←緑色に Sub xxx() マクロの中身 End Sub
をいれて
Private Sub CommandButton1_Click() TEST End Sub
を書き込むと勝手にラインがはいってしまい
マクロを実行すると1行目が黄色くなります。
TESTも反転します
どうしたらいいのでしょうか?
書込みを良くお読みください。 (gu-chan)さんが実行したいマクロを 「TEST」という名前で標準モジュールへ登録した時に Private Sub CommandButton1_Click() TEST End Sub というマクロは有効になります。 (gu-chan)さんがどんな名前でマクロを登録しているかわからないので、 例えとして「TEST」というプロシージャ名を使っただけなので、 誤解のありませんように。 Sub xxx() マクロの中身 End Sub のように「xxx」という名前のマクロが既に登録されているのであれば、 Private Sub CommandButton1_Click() xxx End Sub で良いのですよ。 それから、下記のようにプロシージャ(Sub〜End Sub)の中に もう一つのプロシージャを入れ込む(入れ子 or ネストするといいます) Sub TEST() 処理1 Sub xxx() 処理2 End Sub End Sub これは禁止です。Sub〜End Subの中にもう一つSubが出来ないように 気をつけてください。 (みやほりん) 【追記】 エラーが出ている場合はエラーメッセージも控えて書き込むようにしてください。
みやほりん さん
ご指摘通りしましたらうまくいきました。
いろいろありがとうございました。
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.