[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コマンドボタンにマクロを登録したい』(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.