[[20031112191652]] 『フォームのボタンとコマンドボタンの違い』(くーれ) ページの最後に飛ぶ

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

 

『フォームのボタンとコマンドボタンの違い』(くーれ)

こんばんは。掲題の通りフォーム⇒ボタンでマクロを登録するものとコマンドボタンを作ってマクロを書き込むことは、用途はことなるにせよ同じ結果が得られるものだと思っていましたが、今日おかしなことがおきました。

下のような単純なマクロです。

 Sub Macro1()
  Windows("a.xls").Activate
  Sheets("Sheet1").Select
  Range("A5:Z20").Select
  Selection.Copy
  Windows("b.xls").Activate
  Sheets("Sheet1").Select 
  Range("A1").Select
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
  False, Transpose:=False
 End Sub

これをフォーム⇒ボタンで登録すると問題なく動くんですが、下記の通りコマンドボタンにコピーすると3行目でエラー1004がでてしまいます(RangeクラスのSelectメソッド失敗)。

 Private Sub CommandButton1_Click()
   Windows("a.xls").Activate
   Sheets("Sheet1").Select
   Range("A5:Z20").Select
   Selection.Copy
   Windows("b.xls").Activate
   Sheets("Sheet1").Select 
   Range("A1").Select
   Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
   False, Transpose:=False
 End Sub

これはいったいなぜでしょうか?フォーム⇒ボタンとコマンドボタンを使い分けるときは、マクロの記述も気をつけなければいけない点があるのですか?

宜しくご教授ください。


 こんばんは
 記述されるモジュールの性格によるものです。
 標準モジュールでは上の階層のオブジェクトを順番に選択していけば
 目的のオブジェクトにたどり着くことができますが、
 ワークシートモジュールでは上の階層の記述を省いた場合、
 基本的にそのシートがオブジェクトの基準点とします。
 a、bどちらに登録したマクロかはわかりませんが、
 他のブックやシートでのSelectメソッドはあまりうまくいきません。

   Range("A5:Z20").Select

 とだけ書いた場合はどのシートのセル範囲なのか特定できない状況に陥ります。

 フォームのボタンには

 Private Sub CommandButton1_Click()
 Macro1 
 End Sub

 と標準モジュールで動くマクロへ処理を飛ばすか、

 Private Sub CommandButton1_Click()
   Windows("a.xls").Activate
   ActiveWorkbook.Sheets("Sheet1").Range("A5:Z20").Copy
   Windows("b.xls").Activate
   ActiveWorkbook.Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues,    Operation:=xlNone, SkipBlanks:= _
   False, Transpose:=False
 End Sub

 このように対象のオブジェクトを明確に記述するか
 どちらかです。
 記録したマクロの編集に自信がない間は標準モジュールのマクロへ
 処理を飛ばすほうをお勧めします。
 (KAMIYA)

 もう少し書いたほうがいいかもしれません。
 おそらくボタンはa.xlsのSheet1以外におかれていると思います。
 仮にSheet2だとしておきましょう。
 2行目のシートを選択するところまではいいのですが、
 3行目の
    Range("A5:Z20").Select
 ではSheet2のA5:Z20を選択しに行きます。
 つまり、Sheet2モジュールに書かれたマクロは上記のように記述された場合
 暗黙的に
    Sheets("Sheet2").Range("A5:Z20").Select
 を実行しようとします。
 しかし、前のコードまでにSheet1が選択されているためにSelectメソッドが
 実行できません。
 (選択しようとするセル範囲の存在するシートが選択されていないと失敗する)

 ためしにSheet2を開いた状態で

 Sheet1!A5
 Sheet2!A5

 それぞれ違った値を入れて下記を実行

 (標準モジュール)
 Sub Macro2()
   Windows("a.xls").Activate
   Sheets("Sheet1").Select
   MsgBox (Range("A5").Value)
 End Sub

 (Sheet2にフォームのボタン)
 Private Sub CommandButton1_Click()
   Windows("a.xls").Activate
   Sheets("Sheet1").Select
   MsgBox (Range("A5").Value)
 End Sub

 結果を比べてみてください。
 (KAMIYA)


 KAMIYAさん、ありがとうございました。

 ワークシートモジュールではそのシートを起点として選択しにいくのですね!
 基本的なことを理解しておりませんでした。しかも、分かりやすく例まで
 提示していただき、本当に感謝しております。

 基本的に「マクロの記録」をつかって動かしていくには、ワークシートモジュールに
 コピペしないでそのまま使った方がいいということですね。

 ありがごうざいました。

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.