- ベストアンサー
マクロを記録するときの、アクティブセルの扱いがよく分かりません
パソコン教室で使っているテキストの問題を2つ解いているのですが、 A先生とB先生とで解説が異なっており混乱しています。 (1)『表の合計金額の高い順に並べ替えるマクロを作りなさい。 ※アクティブセルを最優先のキーとして並べ替えが行われるようにする事。』 (2)『表の書式をオートフォーマットで編集するマクロを作りなさい。 ※マクロは絶対参照で記録する。 ※アクティブセルで書式が変更されるようにする。』 A先生は、表内の対象(例1では合計金額)をクリックしてからマクロの記録を始めなさいと言います。 B先生は表の外をいったんクリックしておいて、記録を始めてから改めて対象のセルをクリックしなさいと言います。 どっちが模範解答とみなせばよいのでしょうか? VBEでいうRange(~)が必要か否かはっきりしません……よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 今試してみました。 >B先生は表の外をいったんクリックしておいて、記録を始めてから改めて対象のセルをクリックしなさい の方が、その後で手を掛けないのなら、分りやすいと思います。エラーは少ないです。 A先生の >表内の対象(例1では合計金額)をクリックしてからマクロの記録 から行うと、Selection から始まってしまいます。たぶん、このSelection をActiveCellという語に変えるということでしたら、こちらのほうが簡単です。 それは、教えようとする目的やポイントによります。 >※マクロは絶対参照で記録する。 >※アクティブセル 実際にA先生の方法でやってみます。 (1) Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal などと記録ではなりますが、 例えば、 ・アクティブセルを最優先のキーとして並べ替えが行われるようにする事。 ということを条件としたら、 ActiveCell.Sort Key1:=ActiveCell, _ Order1:=xlAscending, _ Header:=xlNo, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ SortMethod :=xlPinYin, _ DataOption1:=xlSortNormal このようにします。これは、タイトル行がないものという設定の上で、そのアクティブキーを最優先キーとする、ということです。 実務上は、最初に場所決めしますので、 「B先生は表の外をいったんクリックしておいて、」 のほうが、無難かもしれません。実際に、マクロを行う時に、その場所をユーザーに探させたり、任意の場所ということは、あまり多くはありません。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17070)
マクロの記録は (1)そのまま他の機会に繰り返し実行する (2)汎用的になるよう一部改造しする。 (3)勉強・学習の参考のためコードを見る。 に使いますが、少し慣れて(2)ができるようになると、質問の ようなことは、どちらでも気にならなくなると思います。 アクチブセルも、汎用性があるようでも、利用者・操作者にとっては、それがどういう効果をその後持つのかわからず、不安定です。 ですからどの列でソートするのか案内と操作者に意識的に指定をさせるほうが、良いと思います。 この質問課題は、改造をにらんで、ActiveCellた絶対参照で記録したときどうなるか、あとの改造にどう影響するか、の勉強のためじゃないかと思いますが、反面教師となる、良い経験ではないですか。 2つの場合でこのように差が出るんだということを、学べばよいことで、それぞれ他の場合に、ヒントになる経験になるはずです。 例題なりの、各ステップの本質を見抜くことが勉強です。先生も意図外の点に、意味があるととられて、こだわられてしまい、そこで他の大切と思うな点に、注意が行かないとすると悲しいことでしょう。
お礼
アドバイスどうもありがとうございます。 仕事のなかで汎用性が必要となる繰り返し作業も勿論あるでしょう。 今回はコレとかアレとかきちん使い分けができるように、そしてエクセルVBAの奥深さにおぼれないように、勉強をなまけないようにしたいです。 『知らないで“できない”のと、知っていて“やらない”のとでは大きな差がある』とB先生はよく言っています。 (そういえば私、アプリケーション(エクセル)を書いていませんでした、失礼しました)
- papayuka
- ベストアンサー率45% (1388/3066)
同じような処理ですが、それぞれ記録してみました。 '(1)A1を選択してからマクロの記録を開始し、1を入力 Sub Macro1() ActiveCell.FormulaR1C1 = "1" Range("A2").Select End Sub '(2)A1以外のセルからマクロの記録を開始し、A1を選択して1を入力 Sub Macro2() Range("A1").Select ActiveCell.FormulaR1C1 = "1" Range("A2").Select End Sub 違いは Range("A1").Select があるか無いかだけですが、後で実行した場合に大きな違いが出ます。 (1)はマクロ実行時に選択しているセルに1が入ります。 (2)は必ずA1に1が入ります。 マクロは後で同じ処理を繰り返し実行したい時に使うものです。 対象となるセルが固定されているなら、間違いの起こらない(2)のパターンで記録するのが良いでしょう。 ある程度汎用性を持たせるなら(1)のパターンで、更に汎用性を持たせるなら(1)で相対記録をするのが良いと思います。 ようは後でどう使うかでは無いでしょうか?
お礼
易しく書いてくださり恐れ入ります。 >対象となるセルが固定されているなら(2)のパターンで >ある程度汎用性を持たせるなら(1)のパターンで、 >更に汎用性を持たせるなら(1)で相対記録をするのが良い NO.1さんの回答を読んでいたのでさらに頭の整理ができました。皆さんすごいですね~。 問題は問題として取り組み、ちゃんと指示どおり実行するように(2)でやったほうが良いなと思いました。 お助けどうもありがとうございます。
- GreatDragon
- ベストアンサー率46% (186/402)
Range("A1") のようなセル参照を記述してしまうと汎用性の無いマクロが記録されます。 A先生のやり方の方が多少ですが汎用性のあるマクロを記録できます。 B先生のやり方は汎用性はありません。 但し、(1)の並べ替えのマクロですと表の範囲が記録されてしまうのでどちらの方法も汎用性はありません。 この辺りはマクロ記録の限界ですね。 VBAを学習されて自分でマクロを編集出来るようになれば完璧です。 がんばって下さい。
お礼
関数の憶えもなってない私が、設問外の汎用性を配慮しなくては…なんて考えてしまいました。 ご回答を繰り返し読んだら整理ができて理解していけそうです。 お助けどうもありがとうございます。
お礼
実験までしていただき本当に恐縮です。 >実務上は最初に場所決めしますので、 >「表の外をいったんクリックしておいて」のほうが無難かもしれません。 そうですね、お陰さまで解ってきました。 「A先生のほうじゃないと、例えば合計の隣りの列で並べ替えしたいときどうすんだよ?!」など余計な事を考えていました。 それじゃあマクロを記録しなくてもいいじゃないかって言われそうです。 将来の可能性より、いまの問題を指示通り記録するのが大切ですね。 お助けどうもありがとうございます。