[[20041017230545]] 『コマンドボタンにマクロを登録したい』(gu-chan) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コマンドボタンにマクロを登録したい』(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.