[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォームのボタンとコマンドボタンの違い』(くーれ)
こんばんは。掲題の通りフォーム⇒ボタンでマクロを登録するものとコマンドボタンを作ってマクロを書き込むことは、用途はことなるにせよ同じ結果が得られるものだと思っていましたが、今日おかしなことがおきました。
下のような単純なマクロです。
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.