• ベストアンサー

マクロで、行追加後もオートフィル&並べ替えができるようにしたい

マクロでわからないことがあるので教えていただけないでしょうか? (1)計算式を入力 (2)オートフィルでコピー (3)並べ替え このようなマクロを作りたいのですが、行を追加してもちゃんとオートフィルと並べ替えができるようにしたいのです。 過去の「教えてgoo」に載っていたものをコピーしてVBに貼り付けたら、オートフィルはできるようになったのですが、並べ替えがうまく実行されません。 どうも範囲がおかしいように思うのですが、もともとVB言語の意味がわかっていないので、どう変更すればいいのかさっぱりわかりません・・・ 以下は、現在のマクロの記述です。セルI7を基準にして、H列も一緒に並べ替えたいと思っています。H列とI列は行が増えたり減ったりします。 勉強不足ですいませんが、教えてください。よろしくお願いいたします。 ------------------------------------------------------- Sub 計算→並べ替え() ' ' 計算→並べ替え Macro ' マクロ記録日 : 2006/12/1 ユーザー名 : ○○ ' ActiveCell.FormulaR1C1 = "=MOD(RC[-1],5)" Range("I7").AutoFill Destination:=Range("I7", Range("H65536").End(xlUp).Offset(, 1)) Range("I7").Select Range("H6:I13").Sort Key1:=Range("I7"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub -------------------------------------------------------

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

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

4行目のこの部分が問題です。 >Range("H6:I13").Sort Key1:=Range("I7"),... これだと"H6:I13"の範囲しかソートしません。 この部分が所定の範囲になるように修正する必要があります。 とりあえず、オートフィルにした範囲をソートするならば、 >Range("I7:H65536").Select >Range(Selection, Selection.End(xlUp)).Select >Selection.Sort Key1:=Range("I7"),... こんな感じで範囲設定の式を2行追加、Rangeの行を修正・・・ですかね。 他にももっと上手い方法はありそうですけど・・・。

moon5110
質問者

お礼

ご返答ありがとうございました。お礼がおそくなってすいません。 教えていただいたとおりにコードを変更したら、うまくいきました! 思い通りのマクロが組めて感激です♪ ありがとうございました。 また何かありましたら教えてください。よろしくお願いいたします。

その他の回答 (1)

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

こんにちは。 もし、本当に、「とりあえず」でしたら、   Range("H6:I13").Sort      ↓   Range("H6").Sort   (必ずしも、上手くいくとは限りません。CurrentRegion と同じ機能がありますから、不要な部分も巻き込んでしまうことがあります。) とすればよいのですね。ただ、一般的に、問題は、"Header:= xlGuess" の部分になりますね。つまり、このコードを見る限りは、ヘッダーが付いているようですから、そこは、"Header:=xlYes" ということになりそうです。 それから、   ActiveCell.FormulaR1C1 = "=MOD(RC[-1],5)"      ↓   Range("I7").FormulaR1C1 = "=MOD(RC[-1],5)"    となるようです。 >Range("I7").Select これは必要ありません。 ただ、全体的になんとなく奇妙な感じがします。 理由は、ActiveCell.FormulaR1C1 = "=MOD(RC[-1],5)" という数式を入れる部分にあります。マクロの場合は、相対参照式なので、最初から数式を代入してしまってもよいかもしれません。 例: Sub TestPrc() Range("H7", Range("H65536").End(xlUp)).Offset(, 1).FormulaR1C1 = "=MOD(RC[-1],5)" Range("H6", Range("H65536").End(xlUp)).Resize(, 2).Sort _      Key1:=Range("I7"), _       Order1:=xlAscending, _       Header:=xlYes, _       OrderCustom:=1, _       MatchCase:=False, _       Orientation:=xlTopToBottom, _       SortMethod:=xlPinYin, _       DataOption1:=xlSortNormal End Sub 私の想像の範囲で作ったので、実際には上手くいかないかもしれません。また、もう少し省略できるけれども、いやらしくなりそうな気がしましたので、やめました。それから、みやすくするために、以上のようなコードの並べ方をしたほうがよいです。

moon5110
質問者

お礼

ご返答ありがとうございました。お礼がおそくなってすいません。 ご指摘のとおり最初の計算式は、マクロを記録する前にセルI7を選択してしまったので、次からマクロを実行するときにセル番地がずれてしまうところでした。 投稿した後で気づいたのですが、それを訂正するのに苦労したので、正しいコードを教えてくださって助かりました。 ありがとうございました。 ヘッダーの部分などは、せっかく教えていただいたのですが、よくわからなかったので、勉強して理解できるようにがんばります。すいません(>_<) また、コードをそのままコピーしたので、見にくくなってしまってすいませんでした。次からは気をつけます。 おかげで思い通りのマクロを組むことができました。ありがとうございました。 また何かありましたら、教えてください。ありがとうございました。

関連するQ&A

  • 並べ替えのマクロで対象行の範囲を行を増やした分だけ可変にして増やしたい。

    マクロ超初心者です。エクセル2003においての質問です。 作成した〔日付順〕のボタンを押すことで並べ替えをしたいと思い,以下のマクロを「記録」から作成したのですが, 9行~153行の間に行を挿入した場合,並べ替えの対象となる行も同じように増えてほしいのですが,常に9行~153行のままで増えてくれません。 可能なら9行より前に行を挿入した場合も同じように可変して欲しいです。 全くのマクロ初心者でどう変えればいいのか分かりません。 また,「記録」から作成したマクロには操作内容が全て存在するようなのですが, 消してもいい不要な部分も分からないので教えて頂ければありがたいです。 よろしくお願いします。 (出来れば以下を書き直して全て貼り付けて頂けるとかなり助かります。) sub 日付順()    Rows("9:153").Select    Selection.Sort Key1:=Range("I9"),Order1:=xlAscending,Key2:=Range("J9") _       ,Order2:=xlDescending,Header:=xlGuess,OrderCustom:=1,MatchCase:= _       False,Orientation:=xlTopToBottom,SortMethod:=xlPinYin,DataOption1:= _       xlSortNormal,DataOption2:=lxSortNormal    Selection.Sort Key1:=Range("H9"),Order1:=xlAscending,Key2:=Range("B9") _       ,Order2:=xlDescending,Key3:=Range("M9"),Order3:=xlAscending,Header _       :=xlGuess,OrderCustom:=1,MatchCase:=False,Orientation:=xlTopToBottom _       ,SortMethod:=xlPinYin,DataOption1:=xlSortNormal,DataOption2:= _       xlSortNormal,DataOption3:=lxSortNormal End Sub

  • EXCEL2007マクロ/オートフィルについて

    VBA初心者です。 EXCEL2007でオートフィルのマクロを作ったのですが、下記のケースで困っています。 A列のデータが入っている行までB列のデータをオートフィルで入力したく、 A列の最終行からデータが入っている行までを求めてB列のデータをオートフィルで入れるため、下記のマクロを設定しました。 Sub test()   Range("B1").AutoFill Destination:=Range("B1", Range("A1048576").End(xlUp).Offset(, 1)) End Sub ところが、A列のデータが2行以上ある場合はうまくいくのですが、一行のみだった場合オートフィルができなくてマクロがとまってしまいます。 一行なので当然なのですが、このような処理をしたい場合、他に方法はないものでしょうか? お知恵を拝借できますと大変助かります。 どうぞよろしくお願いいたします。

  • エクセルのマクロでの並べ替えにおいて

     できるExcel2000マクロ&VBAを読みながら,マクロに初挑戦しました。ところが初めからつまづいています。  住所録の並べ替えです。131人分の住所録をフリガナをキーに並べ替えるのをマクロに記録しました。保存して,早速機能を確認しようと132人目の住所などを入力し,マクロを実行しましたが,機能しませんでした。 Moduleは以下のようになっています。 Sub 五十音順並べ替え() ' ' 五十音順並べ替え Macro ' マクロ記録日 : 2005/1/12 ユーザー名 : ' ' Range("A1:G131").Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range _ ("C2"), Order2:=xlAscending, Key3:=Range("B2"), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:= _ xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, DataOption3:=xlSortNormal End Sub 最初の Range("A1:G131") の131が臭いと思い,この数字を132にしたり,住所録の131番目以上に新しいデータを挿入したりするとマクロは機能します。きっと当然のことなのでしょうが・・・。おそらく記録するときに何か問題があるのではないかと思うのですが,解決法をご教授下さい。

  • オートフィルタのマクロが動作しない

    Excelで縦に日付がランダムで並んでいる列(C列)があり、その列を日付の新しい順から降順で並ぶよう、オートフィルタ→(空白以外のセル)→降順とやると出来るのですが、その一連の動作をマクロでやろうとすると「実行時エラー'1004'; この操作には、同じサイズの結合セルが必要です。」と出てマクロが作動しません。 デバッグでみると Selection.AutoFilter Field:=3, Criteria1:="<>" Range("A1:EA231").Sort Key1:=Range("C1"), Order1:=xlDescending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub と出ていて、2行目のRange~から4行目の~Normalまで下地が黄色くなっています。 コードがあまり詳しくないもので…どなたか解決法の解るかた、お教えいただけますでしょうか。よろしくお願いいたします。

  • 実行時エラー1004 オートフィルができない

    エクセルなのですが、A列の文字にたいする数式をB列に入れて最終行までオートフィルするマクロを作りたいのですが実行時エラー1004が発生してしまいます。 Sub macro1() Dim LastRow As Long LastRow = Range("A65536").End(xlUp).Row Range("B1").Value = "=LEN(A1)" Range(Range("B1"), Selection).AutoFill Destination:=Range("B1:B" & LastRow) End Sub このコードです。 Range(Range("B1"), Selection). ここら辺が怪しいかなと思ってるのですが、どうすればいいでしょうか? オートフィルを使わずにfor~nextでやる方法も知ってますが、オートフィルでやる方法をご教授いただきたいです。 よろしくお願いします。

  • オートフィルのマクロを作りたい

    ある列に複数のデータがある場合、その一番上の右隣のセルに数式などを入力後、そのセルの右下の小さい四角をダブルクリックすると、左の列のデータある一番下までオートフィルされますよね。 これのマクロを組みたいのですが、単純に出来ません。 普通通りマクロの記録をすると、実際に入力されていたセル番号までのマクロとなってしまい、データを追加した場合意味が無くなります。 具体的に説明すると、 A1からA10までそれぞれデータがある場合、 B1に数式を入力後、オートフィルでB10までコピー。 これをマクロで組もうとすると、B10までのフィルが組まれてしまい、A11~A20までデータを追加後マクロを実行してもB10までのフィルしか実行されません。 「左の列のデータがあるところまで」というマクロは組めないのでしょうか。

  • マクロとオートフィル

    オートフィルを使った「マクロの記録」の部分でつまずいてしまいました。 A列に名前、B列に数字が入っていて、2列にオートフィルタをかけている場合 B列の0の数字のみを非表示にしたかったので オートフィルのタブを使って「0」のチェックマークを外すという動作を「マクロの記録」で記録しました。 そこまではいいのですが、データの追加があったのでオートフィルタの範囲内に数字と名前をそれぞれの列に追加したあと上記のマクロを使ってみると、どうしても追加したデータと0が非表示になってしまいます。 これを避けるにはVBAで指示しないと行けないのでしょうか?

  • 『エクセル』 vbaでオートフィルができない

    Sub Macro1() Range("a1:a10").Select Selection.AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries End Sub がエラーになります。 内容は「RangeクラスのAotofillメソッドが失敗しました」 となります。 Sub Macro2() Dim i As Long For i = 1 To 10 Cells(i, 1) = i Next End Sub や Sub Macro3() Dim i As Long i = 1 While i <= 10 Cells(i, 1) = i i = i + 1 Wend End Sub と同じような動きをAutoFillを使ってVBAで行いたいのですが むりでしょうか? というのも、 A1に長い関数式を入れて A10000までオートフィルしたいのですが 手作業だと時間がかかるためマクロで行いたいです。 アドバイス宜しくお願い致します。

  • ExcelVBAでのオートフィルの使い方

    Excel2003です。 Bセルに入っている値をHセルまで右方向にオートフィルするマクロを組んでいるのですが、うまく動きません。 Bセルの最終行は変動し、オートフィルはBセルの最終行と最終行の1つ手前の2つ分をオートフィルしたいのです。 Range("B1").End(xlDown).Offset(-1, 0).Select Range(ActiveCell, ActiveCell.Offset(0, 7)).AutoFill Type:=xlFillDefault Range("B1").End(xlDown).Offset(0, 0).Select Range(ActiveCell, ActiveCell.Offset(0, 7)).AutoFill Type:=xlFillDefault これで、オートフィルしようと思っていたのですが、 Range(ActiveCell, ActiveCell.Offset(0, 7)).AutoFill Type:=xlFillDefault この式の実行で、 実行時エラー'1004' RangeクラスのAutoFillメソッドが失敗しました と、出てしまいます。   Selection.AutoFill Destination:=Range("B23:H23"), Type:=xlFillDefault こういうマクロなら動くので、AutoFillの後に明確な範囲指定をしていないせいなのでしょうか? 最終行が変動してしまう為、このような明確な範囲指定をする事ができません。 いい解決方法はないでしょうか?

  • 記述を簡略化させたい

    お世話になります。 下記の記述をスマートにさせたいのですが、ご教示お願いします。         記 Sub 優先順位() Range("A16:Y25").Select Selection.Sort Key1:=Range("Y16"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A43:Y52").Select Selection.Sort Key1:=Range("Y43"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A70:Y79").Select Selection.Sort Key1:=Range("Y70"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A97:Y106").Select Selection.Sort Key1:=Range("Y97"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A16").Select End Sub

専門家に質問してみよう