• ベストアンサー

マクロを記録するときの、アクティブセルの扱いがよく分かりません

パソコン教室で使っているテキストの問題を2つ解いているのですが、 A先生とB先生とで解説が異なっており混乱しています。 (1)『表の合計金額の高い順に並べ替えるマクロを作りなさい。   ※アクティブセルを最優先のキーとして並べ替えが行われるようにする事。』 (2)『表の書式をオートフォーマットで編集するマクロを作りなさい。   ※マクロは絶対参照で記録する。   ※アクティブセルで書式が変更されるようにする。』 A先生は、表内の対象(例1では合計金額)をクリックしてからマクロの記録を始めなさいと言います。 B先生は表の外をいったんクリックしておいて、記録を始めてから改めて対象のセルをクリックしなさいと言います。 どっちが模範解答とみなせばよいのでしょうか? VBEでいうRange(~)が必要か否かはっきりしません……よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 今試してみました。 >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先生は表の外をいったんクリックしておいて、」 のほうが、無難かもしれません。実際に、マクロを行う時に、その場所をユーザーに探させたり、任意の場所ということは、あまり多くはありません。

sundial
質問者

お礼

実験までしていただき本当に恐縮です。  >実務上は最初に場所決めしますので、  >「表の外をいったんクリックしておいて」のほうが無難かもしれません。 そうですね、お陰さまで解ってきました。 「A先生のほうじゃないと、例えば合計の隣りの列で並べ替えしたいときどうすんだよ?!」など余計な事を考えていました。 それじゃあマクロを記録しなくてもいいじゃないかって言われそうです。 将来の可能性より、いまの問題を指示通り記録するのが大切ですね。 お助けどうもありがとうございます。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

マクロの記録は (1)そのまま他の機会に繰り返し実行する (2)汎用的になるよう一部改造しする。 (3)勉強・学習の参考のためコードを見る。 に使いますが、少し慣れて(2)ができるようになると、質問の ようなことは、どちらでも気にならなくなると思います。 アクチブセルも、汎用性があるようでも、利用者・操作者にとっては、それがどういう効果をその後持つのかわからず、不安定です。 ですからどの列でソートするのか案内と操作者に意識的に指定をさせるほうが、良いと思います。 この質問課題は、改造をにらんで、ActiveCellた絶対参照で記録したときどうなるか、あとの改造にどう影響するか、の勉強のためじゃないかと思いますが、反面教師となる、良い経験ではないですか。 2つの場合でこのように差が出るんだということを、学べばよいことで、それぞれ他の場合に、ヒントになる経験になるはずです。 例題なりの、各ステップの本質を見抜くことが勉強です。先生も意図外の点に、意味があるととられて、こだわられてしまい、そこで他の大切と思うな点に、注意が行かないとすると悲しいことでしょう。

sundial
質問者

お礼

アドバイスどうもありがとうございます。 仕事のなかで汎用性が必要となる繰り返し作業も勿論あるでしょう。 今回はコレとかアレとかきちん使い分けができるように、そしてエクセルVBAの奥深さにおぼれないように、勉強をなまけないようにしたいです。 『知らないで“できない”のと、知っていて“やらない”のとでは大きな差がある』とB先生はよく言っています。 (そういえば私、アプリケーション(エクセル)を書いていませんでした、失礼しました)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

同じような処理ですが、それぞれ記録してみました。 '(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)で相対記録をするのが良いと思います。 ようは後でどう使うかでは無いでしょうか?

sundial
質問者

お礼

易しく書いてくださり恐れ入ります。  >対象となるセルが固定されているなら(2)のパターンで  >ある程度汎用性を持たせるなら(1)のパターンで、  >更に汎用性を持たせるなら(1)で相対記録をするのが良い NO.1さんの回答を読んでいたのでさらに頭の整理ができました。皆さんすごいですね~。 問題は問題として取り組み、ちゃんと指示どおり実行するように(2)でやったほうが良いなと思いました。 お助けどうもありがとうございます。

回答No.1

Range("A1") のようなセル参照を記述してしまうと汎用性の無いマクロが記録されます。 A先生のやり方の方が多少ですが汎用性のあるマクロを記録できます。 B先生のやり方は汎用性はありません。 但し、(1)の並べ替えのマクロですと表の範囲が記録されてしまうのでどちらの方法も汎用性はありません。 この辺りはマクロ記録の限界ですね。 VBAを学習されて自分でマクロを編集出来るようになれば完璧です。 がんばって下さい。

sundial
質問者

お礼

関数の憶えもなってない私が、設問外の汎用性を配慮しなくては…なんて考えてしまいました。 ご回答を繰り返し読んだら整理ができて理解していけそうです。 お助けどうもありがとうございます。

関連するQ&A

  • アクティブセルをキーにして並べ替えするマクロ

    EXCEL2003で、ボタンを押すと、「アクティブセルがある列」をキーにして、 降順で並べ替えが実行されるようなマクロを組みたいと考えています。 表自体は、「A1:Z1000」 の範囲でデータがあるのですが、 その内、「D2:Y999」 の部分だけが並び替わるようにしたいのです。 したがって、アクティブセルが、「A列~C列とZ列」の範囲内にあるときは無効で、 「D列~Y列」の中にあるときだけ動作するようにしたいです。 どんなふうに記述すればよいか、教えていただけませんでしょうか? どうかよろしくお願いいたします。

  • エクセル マクロ アクティブセル領域を移動させたい

    いつもお世話になっております。 当方マクロ超初心者です。 アクティブセルの大きさは変えずに、 範囲だけを移動させるマクロがつくりたいです。 例えば A1 B1 A2 B2 A3 B3 の6つのセルがアクティブの時に実行すると B3 C3 B4 C4 B5 C5 がアクティブになるマクロを作りたいです。 (この場合だとアクティブセルが 右へ2つ、下へ1つ移動したイメージ) 何卒よろしくお願いいたします。

  • エクセル、シートBからシートAのアクティブセルへ

    シートBに社員表があり、ダブルクリックでシートAのアクティブセル(40文字くらい入る)へ名前が追加されるようにしたいのですが、何かいい方法がありますでしょうか? 例) 田中、佐藤、石川、・・・ シートBのダブルクリックで動くマクロに「シートAのアクティブセルへ文字を追加する」という処理がしたいです。 よろしくお願いいたします。

  • アクティブセル以下をコピーするマクロの設定の仕方が分かりません。Excel2000です。

    アクティブセル以下をコピーするマクロの設定の仕方が分かりません。Excel2000です。 B列(B3:B402)のどのセルをアクティブにした場合でも、"アクティブセルをそれ以下のセル全て(B402まで)に オートフィルでコピーする"マクロを設定したいのですが、 自動記録だとアクティブセルはセル番号で記載されてしまうため、応用が利きません(というか分かりません)いずれかのセルをアクティブにし、コマンドボタンを押すと それ以下のセルにコピーされるという流れです。 私なりに調べてみましたが分かりません。 どなたかご教示願えませんでしょうか?

  • ”アクティブセル行」の一行下を選択”するマクロ

    ■ ”アクティブセルの、1個下の行を選択し、新しい空白行を一行挿入” ■次にその”アクティブセルのA列とB列の値を、  新しく作った空白行に、コピー  ・・・といったマクロを組もうとしております。 たとえば 12行目を選択するプログラム(コマンド?マクロ?)は、  Rows(12:12) となっていたので、それにならって Rows(activecell:B) などとやってみたのですが、うまくいきませんでした。 このような場合、どうしたらよいのかアドバイスをいただけると助かります。 どうぞ、よろしくお願いいたします。  

  • エクセルのマクロの記録について

    こんばんわ。マクロの超初心者ですが、 最終的に、デフォルトの大きさのセルを、ボタンを押して自動で A1=行高 100 A2=行高 200 A3=行高 300 B1~B3は、結合 で完成となる物を作ろうとしています。(列幅は、考えない物としています) 手順として、マクロの記録をスタートして (1)1行目の行高を100にする (2)2行目の行高を200にする (3)3行目の行高を300にする (4)B1~B3を結合する で記録を終了します。そして再生をするのですが、A1~A3の行高がきちんと設定どおりになってくれません。 一応、行高を確認すると、3つとも、200になっています。どうも、100+200+300の合計の平均の行高に設定されてしまいます。 自分なりに考えて、B1~B3の結合のせいかなと思い、なら、セルの結合をマクロの記録から外してやってみました。 (1)あらかじめ、B1~B3を結合させておく (2)マクロの記録スタート (3)1行目、2行目、3行目をそれぞれ設定する で記録終了して、再生させるのですが、やっぱり同じ結果になってしまいます。 これは、エクセルの仕様なのでしょうか?それともなにか対処方があるのでしょうか? 一応、マクロの編集も少しは、がんばってこの2週間でちょっとだけは、できるようになったようなので(かなり怪しいですが・・・) どなたかアドバイスございましたら、お願いいたします。

  • エクセルでマクロの記録が出来ません。

    エクセルでマクロの記録が出来ません。 エクセルのA列とB列に1,000行のデータがあります。 マクロの記録を起動します。 1.B1セルを選択 2.右クリックで挿入を選択 3.A列とC列にデータが有り、B列は空白となる。 4.B1セルを選択します。右クリックの貼り付けを選択。   マクロの起動前にクリップボードにあらかじめコピーしておいた   以下の式を貼り付けます。      =IF(A1="","",IF(ISERROR(FIND("-",ASC(A1))),IF(LEFT(ASC(A1),1)<>"9",MID(A1,1,3) &"-"&MID(A1,4,5)&"-"&MID(A1,9,2)&"-"&MID(A1,11,2)&"-"&MID(A1,13,2),IF(LEFT(ASC(A1),2)= "9X",MID(A1,1,3)&"-"&MID(A1,4,11),IF(LEFT(ASC(A1),1)="9",MID(A1,1,5)&"-"&MID(A1,6,5)& "-"&MID(A1,11,2)&"-"&MID(A1,13,2),""))),IF(FIND("-",ASC(A1))=6,A1,MID(A1,1,3)&"-"& MID(A1,4,11)))) 5.「Ctrl」+「C」 6.エクセルの左上の名前ボックスを   B1 → B1:B1000に変更。B列が選択されます。 7.「Ctrl」+「V」 8.B列に式で変換されたデータが入りました。B列が選択されたままです。 9.「Ctrl」+「C」 10.右クリックで形式を選択して貼り付けで「値」を選んでOKをおす。    セルに入っていた式は全て消えました。B列が選択されたままです。 11.マウスポインタをセルのA1におく。B列の選択が解除されました。 マクロの記録を終了 これでNO.4の操作の時に「記録できません」と表示されます。 データを一旦削除し、再度、A列とB列にデータを入れて マクロを実行してもデータB列がC列に移動しB列は空白です。 実際にマクロの記録中でもNO.1からNO.11の操作は出来ています。 なぜ記録されないのでしょうか? どうすれば記録できますか? よろしくお願いします。

  • マクロの記録で条件付き書式の動作を記録する

    エクセル2010なのですが マクロの記録で条件付き書式の動作を記録することは出来ないのでしょうか? A列に対して条件付き書式の動作を記録したら Sub Macro1() ' ' Macro1 Macro ' ' Columns("A:A").Select End Sub これしか記録されてません。 私の記録の仕方が悪かったのでしょうか?

  • マクロの記録で作成したマクロがデータが代わると誤動作する。

    マクロの記録で作成したマクロがデータが代わると誤動作する。 エクセルファイルにてA列からJ列までデータがあります。 行数は2,000行です。データは全て半角です。 A列の値が 1=入庫 2=出庫 3=戻入 と全て置換 B列の値が 1=社内品 2=社外品 3=受入 と全て置換。 でこのB列が3で受入に置換えたら その隣のA列の値を 受入に置き換えたい。 さらに A列の値が置換え後の入庫と戻入場合はその行のJ列の値を切り取り、K列に貼付をし A列の値が置換え後の出庫の場合はその行のJ列の値を切り取り、L列に貼付をしたいです。 マクロの記録で行いましたが、 いったんデータを全て消して別データを貼り付けしたらA列B列の置換えは正常ですが B列が3の場合にA列を再置換えと、J列の値を切り取り、K列、L列への貼付が 誤動作します。 (別データは雛形は同じです。入力規則も同じですがデータは変わります。  例:セルA1のデータは1、 新しいデータはセルA1は2 等) マクロの記録中では、並べ替えでソートし上記条件でセルを選択しコピペをしました。 並べ替えは2回です。 マクロ文を見ると、セル名がずらずら並んで、セル番号が指定されてます。 (マクロ記録中に選択したセル番号が全部記録されてます。) 文を見ると、上記条件で置換えやコピペでなく このセルはこう置換え、このセルはこうコピペのように読めます。 これでは、データが代わったら、別の動きになるのかな?と思いました。 こういう場合はマクロではどうやって記録すればいいでしょうか?

  • Excel VBAのマクロの記録について

    Excelマクロの初心者です。 マクロの記録のやり方の質問です。 今あるフォルダの中にファイルA、Bがある状態でファイルAのマクロの記録で、ファイルBのコピーを同じフォルダーに作る操作を記録しようとしましたが、うまく記録できません。 何かやり方が間違っているのでしょうか、ファイルAの中でのセルの色塗り等のマクロの記録はうまくできます。 マクロの記録ができない操作があるのでしょうか、あるとすれば記録できないものはどのような操作でしょうか?教えて下さい。

専門家に質問してみよう